struts2的详细执行流程

转载文章出处:https://blog.csdn.net/xlgen157387/article/details/45845691
原文作者:https://blog.csdn.net/xlgen157387



在上一篇中已经说过了Struts2的系统的基本原理(http://blog.csdn.net/xlgen157387/article/details/45840719),下边说一下Struts2的运行流程:

举个简单的案例,就是一个helloworld的案例,下边对其进行进行详细的解释。

案例基础内容:

我们在使用Struts2的时候会在web.xml文件中进行配置过滤器;编写一个Action类,这里起个名字叫做HelloWorldAction;在struts.xml中进行配置这个Action。编写界面等;

Struts2的内部运行流程

(1)首先用于在游览其中输入账户名和密码提交之后,这就开始了我们的工作流程;

(2)当用户提交的时候,请求的URL为:/helloworld/helloworldAction.action请求被Tomcat服务器接收到,Tomcat服务器会根据请求URL中的web上下文,也就是/helloworld,来选择处理这个请求的Web应用,那就是由helloworld这个web工程来处理这个请求;

(3)Web服务器会读取helloworld这个工程的web.xml,在web.xml中进行配置,发现扩展名为.action的请求,由struts2这个过滤器来进行处理,根据Filter的配置,找到实际的类为FilterDispatcher。

(4)Web容器会根据获取的FilterDispatcher这个类的实例,然后回调doFilter()方法进行真正的处理,FilterDispatcher作为前端控制器,是整个Struts的调度中心;

注:FilterDispatcher是任何一个Struts2应用都需要配置的,一般出现在过滤器的最后;如果在FilterDispatcher钱出现了如SiteMesh这种特殊的过滤器,还必须在SiteMesh前边应用Struts2的ActionContextCleanUp过滤器。
由于这个案例中没有SiteMesh这种特殊的过滤器,所以只需要用filterDispatcher就可以,这就相当于前进到Struts2构架图的第一步:
这里写图片描述

(5)FilterDispatcher讲请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts2做出处理。
这里写图片描述

(6)ActionMapper告诉FilterDispatcher,需要处理这个请求,FilterDispatcher会停止过滤器链以后的部分,所以通常情况下:FilterDispatcher应该出现在过滤器联链的最后。然后建立一个ActionProxy对象,这个对象作为Action与xwork之间的中间层,会代理Action的运行过程。
这里写图片描述

(7)ActionProxy对象被创建出来的时候,并不知道要运行哪个Action,他手里只有从FilterDispatcher中拿到的请求的URL。这时候,他去向ConfigurationManager询问到底要运行哪一个Action。
注:在上一篇已经说到某一个特定的URL实在strut.xml文件中进行配置的,而ConfigurationManager则负责将struts.xml文件中配置文件映射到内存中去的,所以ActionProxy需要向ConfigurationManager询问到底是哪一个Action。
在服务器启动的时候,ConfigurationManager会一次性的将struts.xml文件中所有信息读到内存中,并缓存起来,以保证ActionProxy拿着来访问的URL向它询问要运行哪一个Action的时候,就可以直接匹配,查找并回答出来。
这里写图片描述

(8)ActionProxy知道了需要运行的那个Action,相关的拦截器以及所有可能使用的result信息,就可以着手建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。
注:Action运行绝不仅仅只是运行Action中的execute方法这么简单,还包其他部分,完整的调度过程有ActionInvocation对象负责。
这里写图片描述

(9)当我们在Action中的execute方法运行的时候,我们是直接使用这个Action中属性的值,而不需要从用户请求域中进行获取请求的参数,是谁把请求中的参数赋到了Action的属性中,这个事情是谁帮我们已经做好了哪?答案就是拦截器。
拦截器分为两部分:一部分在Action之前运行,一部分实在Result之后运行。而且顺序刚好相反。也就是在Action执行前的顺序,比如是拦截器1,拦截器2,拦截器3,那么在运行Result之后,再次运行拦截器的时候,顺序就变成拦截器3,拦截器2,拦截器1.

总之我们得到的结论是ActionInvocation对象执行的时候比较复杂,会做很多事情。
1.)首先按照拦截器的应用顺序依次执行各个拦截器的潜质部分;
这里写图片描述
2.)然后执行Action的execute方法;
这里写图片描述
3.)然后根据execute方法返回的结果,也就是result,在struts.xml中匹配选择下一个页面;
这里写图片描述
4.)找到页面后,由于现在的页面一般都是模板页面,在页面上,可以通过Struts2自带的标签库来烦我跟需要的数据,并生成最终页面。
这里写图片描述
5.)最后,ActionInvocation对象在按照拦截器的引用顺序倒叙依次执行各个拦截器的后置部分。
这里写图片描述

(10)ActionInvocation队形执行完毕之后,实际上就已经得到响应对象了,也就是HttpServletResponse对象,最后按与罗氯气配置定义星饭的顺序依次经过过滤器,向用户展示响应的结果。
这里写图片描述

ok!到此整个执行的过程已经结束。

猜你喜欢

转载自blog.csdn.net/qq_33322074/article/details/80115950