A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

# Struts2执行流程分析
**Struts2是一套非常优秀的Web应用框架,是Apache软件基金会下的MVC开源项目。Struts2是缘于WebWork框架,旨在提供相对于Struts框架的增强和改进,同时保留与Struts框架类似的结构。**
**我们学习Struts2时,不仅仅要学习怎么使用它,更要学习它的执行流程和核心理念**
**首先我们来看下Struts2官方文档提供的Struts2的架构图**

关于图中的key说明
- Servlet Filters:过滤器链,客户端的所有请求都要经过Filter链的处理。
- Struts Core:Struts2的核心部分,但是Struts2已经帮我们做好了,我们不需要去做这个
- Interceptors: Struts2的拦截器。Struts2提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;而我们自定义的拦截器,用来实现实际的客户业务需要的功能。
- User Created,由开发人员创建的,包括struts.xml、Action、Template,这些是每个使用Struts2来进行开发的人员都必须会的。
## 关于图中对象的说明
1.  **FilterDispatcher**是整个Struts2的调度中心,也就是MVC中的C(控制中心),根据ActionMapper的结果来决定是否处理请求,如果ActionMapper指出该URL应该被Struts2处理,那么它将会执行Action处理,并停止过滤器链上还没有执行的过滤器。
2.  **ActionMapper**会判断这个请求是否应该被Struts2处理,如果需要Struts2处理,ActionMapper会返回一个对象来描述请求对应的ActionInvocation的信息。
3.  **ActionProxy**会创建一个ActionInvocation实例,位于Action和xwork之间,使得我们在将来有机会引入更多的实现方式,比如通过WebService来实现等。
4.  **ConfigurationManager**是xwork配置的管理中心,可以把它看做struts.xml这个配置文件在内存中的对应。
5.  **struts.xml**是开发人员必须光顾的地方。是Stuts2的应用配置文件,负责诸如URL与Action之间映射关系的配置、以及执行后页面跳转的Result配置等。
6.  **ActionInvocation**真正调用并执行Action,它拥有一个Action实例和这个Action所依赖的拦截器实例。ActionInvocation会按照指定的顺序去执行这些拦截器、Action以及相应的Result。
7.  **Interceptor(拦截器)**是Struts2的基石,类似于JavaWeb的Filter,拦截器是一些无状态的类,拦截器可以自动拦截Action,它们给开发者提供了在Action运行之前或Result运行之后来执行一些功能代码的机会。
8.  **Action**用来处理请求,封装数据。
## 框架执行流程
**1.** 当用户的发出请求,比如http:localhost:8080/struts2Demo/helloworld/helloworldAction.action,请求会被Tomcat接收到,Tomcat服务器来选择处理这个请求的Web应用,那就是由struts2Demo这个web工程来处理这个请求。
**2.** Web容器会去读取struts2Demo这个工程的web.xml,在web.xml中进行匹配,发现由Struts2这个过滤器来进行处理(也就是StrutsPrepareAndExecuteFilter),根据Filter的配置,找到Struts2的调度中心FilterDispatcher。
​   
*3.** FilterDispatcher会将请求转发给ActionMapper。ActionMapper负责识别当前的请求是否需要Struts2做出处理。



** 如果需要Struts2处理,ActionMapper会通知FilterDispatcher处理这个请求。FilterDispather创建Proxy对象处理该请求.

> 源码


ActionProxy对象在被创建出来的时候,并不知道要运行哪个Action,它手里只有从FilterDispatcher中拿到的请求的URL。而真正知道要运行哪个Action的是ConfigurationManager。因为只有它才能读取我们的strtus.xml

*6.** ActionProxy知道自己该干什么事之后(运行哪个Action、相关的拦截器以及所有可能使用的result信息),然后马上建立ActionInvocation对象了,ActionInvocation对象描述了Action运行的整个过程。Action完整的调用过程都是由ActionInvocation对象负责

> 源码 !


在execute方法之前,URL请求中的参数已经赋值到了Action的属性上,这是因为拦截器的作用。拦截器的运行被分成两部分,一部分在Action之前运行,一部分在Result之后运行,而且顺序是刚好反过来的。也就是在Action执行前的顺序,比如是拦截器1、拦截器2、拦截器3,那么运行Result之后,再次运行拦截器的时候,顺序就变成拦截器3、拦截器2、拦截器1。


> 源码

*8.**  ActionInvocation对象执行完毕后,已经得到响应对象(HttpServletResponse)了,最后按与过滤器(Filter)配置定义相反的顺序依次经过过滤器,向客户端展示出响应的结果.

> 源码
>
> !



1 个回复

正序浏览
很不错的资源,谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马