struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)
生活随笔
收集整理的這篇文章主要介紹了
struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
自己做了一個(gè)簡(jiǎn)單的測(cè)試Struts2 的MVC流程,并且連接了數(shù)據(jù)庫(kù)。需要的包為四個(gè)包 ?commons-logging,ognl,struts2-core,xwork這四個(gè)包 當(dāng)需要連接MySQL數(shù)據(jù)庫(kù)的時(shí)候需要加包MySQL-connector-java 我們的文件結(jié)構(gòu)為 我們的包加在WEB-INF的lib目錄下。web.xml配置在WEB-INF中,在src文件夾里我們有struts.xml配置文件和action實(shí)現(xiàn)類 我們的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內(nèi)用于封裝用戶請(qǐng)求參數(shù)的兩個(gè)屬性 private?String?user; private?String?password; private?String?name; //user屬性對(duì)應(yīng)的getter方法 public?String?getuser() { return?user; } //user屬性對(duì)應(yīng)的setter方法 public?void?setuser(String?user) { this.user?=?user; } //password屬性對(duì)應(yīng)的getter方法 public?String?getPassword() { return?password; } //password屬性對(duì)應(yīng)的setter方法 public?void?setPassword(String?password) { this.password?=?password; } public?String?getName()?{ return?name; } public?void?setName(String?name)?{ this.name?=?name; } //處理用戶請(qǐng)求的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; } } 我們?cè)趕truts.xml中配置相應(yīng)動(dòng)作的action <struts> <!--?Struts?2的Action必須放在指定的包空間下定義?--> <package?name="strutsqs"?extends="struts-default"> <!--?定義login的Action,該Action的實(shí)現(xiàn)類為lee.Action類?--> <action?name="Login"?class="LoginAction"> <!--?定義處理結(jié)果和資源之間映射關(guān)系。?--> <result?name="error">/error.jsp</result> <result?name="success">/welcome.jsp</result>???????? </action> </package> </struts> 我們?cè)趙eb.xml中配置filter <filter> <!--?定義核心Filter的名稱?--> <filter-name>struts2</filter-name> <!--定義核心Filter的實(shí)現(xiàn)類?--> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <!--核心Filter的名稱?--> <filter-name>struts2</filter-name> <!--使用該核心Filter來(lái)接受所有的Web請(qǐng)求?--> <url-pattern>/*</url-pattern> </filter-mapping> 在上述的當(dāng)用戶請(qǐng)求參數(shù)的同MySQL數(shù)據(jù)庫(kù)中的參數(shù)相對(duì)應(yīng)返回成功,否則失敗 當(dāng)然我們可以采用
String user = (String)ActionContext.getContext().getSession().get("user");來(lái)獲得用戶名的屬性
疑問(wèn)一:getUsername()就可以獲得我們表單里的用戶名? 堆棧跟蹤執(zhí)行過(guò)程??? 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???? 返回到登錄成功跳轉(zhuǎn)頁(yè)面 看看上面的執(zhí)行過(guò)程的堆棧 醉了 好在有許多函數(shù)是重復(fù)調(diào)用的 我先挑出來(lái) 關(guān)于下幾篇文章 1 分析上述堆棧 2 分析ActionContext 3 分析ActionContext對(duì)應(yīng)的ThreadLocal 4 查找上述的值傳遞過(guò)程轉(zhuǎn)載于:https://www.cnblogs.com/winAlaugh/p/5435062.html
總結(jié)
以上是生活随笔為你收集整理的struts 的 MVC ,自己堆栈跟踪(可以跟着做一遍)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux apache添加多站点配置(
- 下一篇: LuaBridge 中C++类和继承示例