Struts2流程

it2023-09-29  80

1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求。 2.web容器去读这个工程的web.xml ,在web.xml中配置struts2的核心过滤器FilterDispatcher以及其他过滤器,FilterDispatcher应放在其他过滤器的最后面,用于拦截所有请求。配置如下:

<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

3.该请求顺序经过web.xml中配置的过滤器,最终找到FilterDispatcher,回调doFilter()去拦截请求。 4.FilterDispatcher将拦截的请求发送给ActionMapper,由ActionMapper负责识别当前的请求是否需要调用某个Action来处理该请求。 5.ActionMapper告诉FilterDispatcher需要处理这个请求,并创建ActionProxy,FilterDispatcher把该请求交给ActionProxy处理。 6.ActionProxy询问ConfigurationManager,读取Struts.xml ,根据struts.xml中配置的action的name找到对应的action的class,调用此action的拦截器、拦截器栈对请求进行预处理。配置如下:

<package name="action" namespace="/" extends="struts-default"> <action name="loginAction" class="action.LoginAction" method="toLogin"> <result name="success" type="dispatcher">/login.jsp</result> <result name="error">/error.jsp</result> </action> </package> <package>有必需属性 extends="struts-default",即此<package>的配置继承struts-default.xml中 <package name="struts-default"></package> 的配置。缺省拦截器配置时,会自动调用struts-default包中的默认拦截器栈来处理。 先找这个action有没有设置method属性,如果有method属性,且action类中有指定的方法,就调用指定的方法。缺省method属性时,默认调用execute()。 按照<action>里配置的<result>,根据返回的字符串,确定要调用的页面。

7.ActionProxy创建一个ActionInvocation实例。 8.ActionInvocation通过代理模式调用Action。但在调用之前,ActionInvocation会根据配置加载Action相关的所有Interceptor(拦截器),拦截器的执行顺序为:Interceptor1->Interceptor2。 9.执行execute()方法,根据execute方法返回的结果,也就是Result,在struts.xml中匹配选择下一个页面。 10.得到返回结果Result后,再次运行拦截器的时候,顺序就变成Interceptor2->Interceptor1了。 11.ActionInvocation对象执行完毕 ,这时候已经得到了HttpServletResponse对象。 12.HttpServletResponse对象再按照请求进来的反方向通过web.xml中配置的过滤器,最终向客户端展示结果.

最新回复(0)