struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)
生活随笔
收集整理的這篇文章主要介紹了
struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
自己做了一個簡單的測試Struts2 的MVC流程,并且連接了數據庫。需要的包為四個包 ?commons-logging,ognl,struts2-core,xwork這四個包 當需要連接MySQL數據庫的時候需要加包MySQL-connector-java 我們的文件結構為 我們的包加在WEB-INF的lib目錄下。web.xml配置在WEB-INF中,在src文件夾里我們有struts.xml配置文件和action實現類 我們的LoginAciton為 import?java.sql.Connection; import?java.sql.DriverManager; import?java.sql.PreparedStatement; import?java.sql.ResultSet; import?java.text.DateFormat; import?java.util.Date; import?com.opensymphony.xwork2.ActionSupport; public?class?LoginAction?extends?ActionSupport? { //下面是Action內用于封裝用戶請求參數的兩個屬性 private?String?user; private?String?password; private?String?name; //user屬性對應的getter方法 public?String?getuser() { return?user; } //user屬性對應的setter方法 public?void?setuser(String?user) { this.user?=?user; } //password屬性對應的getter方法 public?String?getPassword() { return?password; } //password屬性對應的setter方法 public?void?setPassword(String?password) { this.password?=?password; } public?String?getName()?{ return?name; } public?void?setName(String?name)?{ this.name?=?name; } //處理用戶請求的execute方法 public?String?execute()?throws?Exception { String?ret?=?ERROR; Connection?conn?=?null; try?{ String?URL?=?"jdbc:mysql://localhost/struts_tutorial"; Class.forName("com.mysql.jdbc.Driver"); conn?=?DriverManager.getConnection(URL,?"root",?"yuanchao"); String?sql?=?"SELECT?name?FROM?login?WHERE"; sql+="?user?=???AND?password?=??"; PreparedStatement?ps?=?conn.prepareStatement(sql); ps.setString(1,?user); ps.setString(2,?password); ResultSet?rs?=?ps.executeQuery(); while?(rs.next())?{ name?=?rs.getString(1); ret?=?SUCCESS; } }?catch?(Exception?e)?{ ret?=?ERROR; }?finally?{ if?(conn?!=?null)?{ try?{ conn.close(); }?catch?(Exception?e)?{ } } } return?ret; } } 我們在struts.xml中配置相應動作的action <struts> <!--?Struts?2的Action必須放在指定的包空間下定義?--> <package?name="strutsqs"?extends="struts-default"> <!--?定義login的Action,該Action的實現類為lee.Action類?--> <action?name="Login"?class="LoginAction"> <!--?定義處理結果和資源之間映射關系。?--> <result?name="error">/error.jsp</result> <result?name="success">/welcome.jsp</result>???????? </action> </package> </struts> 我們在web.xml中配置filter <filter> <!--?定義核心Filter的名稱?--> <filter-name>struts2</filter-name> <!--定義核心Filter的實現類?--> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <!--核心Filter的名稱?--> <filter-name>struts2</filter-name> <!--使用該核心Filter來接受所有的Web請求?--> <url-pattern>/*</url-pattern> </filter-mapping> 在上述的當用戶請求參數的同MySQL數據庫中的參數相對應返回成功,否則失敗 當然我們可以采用
String user = (String)ActionContext.getContext().getSession().get("user");來獲得用戶名的屬性
疑問一:getUsername()就可以獲得我們表單里的用戶名? 堆棧跟蹤執行過程??? LoginAction.execute()? NativeMethodAccessorImpl.invoke(Object,?Object[])?line:?39???? DelegatingMethodAccessorImpl.invoke(Object,?Object[])?line:?25???? Method.invoke(Object,?Object...)?line:?597???? DefaultActionInvocation.invokeAction(Object,?ActionConfig)?line:?404???? DefaultActionInvocation.invokeActionOnly()?line:?267???? DefaultActionInvocation.invoke()?line:?229???? DefaultWorkflowInterceptor.doIntercept(ActionInvocation)?line:?221???? DefaultWorkflowInterceptor(MethodFilterInterceptor).intercept(ActionInvocation)?line:?86???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? AnnotationValidationInterceptor(ValidationInterceptor).doIntercept(ActionInvocation)?line:?150???? AnnotationValidationInterceptor.doIntercept(ActionInvocation)?line:?48???? AnnotationValidationInterceptor(MethodFilterInterceptor).intercept(ActionInvocation)?line:?86???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? StrutsConversionErrorInterceptor(ConversionErrorInterceptor).intercept(ActionInvocation)?line:?123???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? ParametersInterceptor.doIntercept(ActionInvocation)?line:?167???? ParametersInterceptor(MethodFilterInterceptor).intercept(ActionInvocation)?line:?86???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? StaticParametersInterceptor.intercept(ActionInvocation)?line:?105???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? CheckboxInterceptor.intercept(ActionInvocation)?line:?83???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? FileUploadInterceptor.intercept(ActionInvocation)?line:?207???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? ModelDrivenInterceptor.intercept(ActionInvocation)?line:?74???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? ScopedModelDrivenInterceptor.intercept(ActionInvocation)?line:?127???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? ProfilingActivationInterceptor.intercept(ActionInvocation)?line:?107???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? ChainingInterceptor.intercept(ActionInvocation)?line:?115???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? I18nInterceptor.intercept(ActionInvocation)?line:?143???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? PrepareInterceptor.doIntercept(ActionInvocation)?line:?121???? PrepareInterceptor(MethodFilterInterceptor).intercept(ActionInvocation)?line:?86???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? ServletConfigInterceptor.intercept(ActionInvocation)?line:?170???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? AliasInterceptor.intercept(ActionInvocation)?line:?123???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? ExceptionMappingInterceptor.intercept(ActionInvocation)?line:?176???? DefaultActionInvocation$2.doProfiling()?line:?224???? DefaultActionInvocation$2.doProfiling()?line:?223???? UtilTimerStack.profile(String,?ProfilingBlock<T>)?line:?455???? DefaultActionInvocation.invoke()?line:?221???? StrutsActionProxy.execute()?line:?50???? Dispatcher.serviceAction(HttpServletRequest,?HttpServletResponse,?ServletContext,?ActionMapping)?line:?504???? FilterDispatcher.doFilter(ServletRequest,?ServletResponse,?FilterChain)?line:?423???? ApplicationFilterChain.internalDoFilter(ServletRequest,?ServletResponse)?line:?244???? ApplicationFilterChain.doFilter(ServletRequest,?ServletResponse)?line:?210???? StandardWrapperValve.invoke(Request,?Response)?line:?272???? StandardContextValve.invoke(Request,?Response)?line:?123???? NonLoginAuthenticator(AuthenticatorBase).invoke(Request,?Response)?line:?506???? StandardHostValve.invoke(Request,?Response)?line:?169???? ErrorReportValve.invoke(Request,?Response)?line:?105???? AccessLogValve.invoke(Request,?Response)?line:?957???? StandardEngineValve.invoke(Request,?Response)?line:?118???? CoyoteAdapter.service(Request,?Response)?line:?438???? 返回到登錄成功跳轉頁面 看看上面的執行過程的堆棧 醉了 好在有許多函數是重復調用的 我先挑出來 關于下幾篇文章 1 分析上述堆棧 2 分析ActionContext 3 分析ActionContext對應的ThreadLocal 4 查找上述的值傳遞過程轉載于:https://www.cnblogs.com/winAlaugh/p/5435062.html
總結
以上是生活随笔為你收集整理的struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux apache添加多站点配置(
- 下一篇: LuaBridge 中C++类和继承示例