struts2执行流程

Web容器收到 请求(HttpServletRequest

1它将请求传递给一个标准的的过滤链包括 ActionContextCleanUp)过滤器

2然后经过Other filters(SiteMesh ,etc),

3接下来需要调用FilterDispatcher核心控制器,

4然后它调用ActionMapper确定请求那个Action

ActionMapper返回一个收集Action详细信息的ActionMaping对象。

5接下来FilterDispatcher将控制权委派给ActionProxy,

6ActionProxy调用配置管理器(ConfigurationManager从配置文件中读取配置信息(struts.xml)

7然后创建ActionInvocation对象

8ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N

9一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result

10然后执行这个Result Result会调用一些模版(JSP)来呈现页面

11之后拦截器(Interceptor N)会在被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和(核心控制器)(FilterDispatcher)。


拦截器:

拦截器能在action被调用之前和被调用之后执行一些”代码“。Struts2框架的大部分核心功能都是通过拦截器来实现的,如纺织重复提交、类型转换、对象封装、校验、文件上传、页面预装载等等,都是在拦截器的帮助下实现的。每一个拦截器都是独立装载的,我们可以根据实际的需要为每一个action配置它所需要的拦截器。

2. Struts2部分类介绍 

这部分从Struts2参考文档中翻译就可以了。 

ActionMapper 

        ActionMapper其实是HttpServletRequestAction调用请求的一个映射它屏蔽了Action对于Request等 java Servlet类的依赖Struts2中它的默认实现类是DefaultActionMapperActionMapper很大的用处可以根据自己的需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docsactionmapper.html。 

ActionProxy&ActionInvocation 

        ActionProxyAction的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现类是DefaultActionProxy是由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程而 ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。 

ConfigurationProvider&Configuration 

        ConfigurationProvider就是Struts2中配置文件的解析器Struts2中的配置文件主要是尤其实现类 XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。 

Tomcat启动时,struts做了哪些工作:

struts2的入口就是一个StrutsPrepareAndExecuteFilter 过滤器(web.xml中配置),当容器如tomcat启动的时候就会调用的该filter的初始化方法

一个请求在Struts2框架中的处理大概分为以下几个步骤: 
1.客户端发起一个(HttpServletRequest)请求,如上文在浏览器中输入”http://localhost:8080/TestMvc/add.action”就是提起一个(HttpServletRequest)请求。 
2.请求被提交到一系列(主要是三层)的过滤器(Filter),如(ActionContextCleanUp、其他过滤器(SiteMesh等)、 FilterDispatcher)。注意这里是有顺序的,先ActionContextCleanUp,再其他过滤器(SiteMesh等)、最后到 FilterDispatcher 
3.FilterDispatcher是控制器的核心,就是mvcc控制层的核心。下面粗略的分析下我理解的FilterDispatcher工作流程和原理:FilterDispatcher进行初始化并启用核心doFilter 

4.FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个(request)请求,如果ActionMapper决定需要调用某个ActionFilterDispatcher把请求的处理交给ActionProxy 
5.ActionProxy通过ActionMappingConfiguration Managerstruts.xml)询问框架的配置文件,找到需要调用的Action. 
如上文的struts.xml配置

6.ActionProxy 创建一个ActionInvocation的实例,同时ActionInvocation通过代理模式调用Action。但在调用之前 ActionInvocation会根据配置加载Action相关的所有Interceptor。(Interceptorstruts2另一个核心级的概念) 

Interceptor 的调度流程大致如下: 
1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor 
2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor 

Interceptor将很多功能从我们的Action中独立出来,大量减少了我们Action的代码,独立出来的行为具有很好的重用性。XWork、 WebWork的许多功能都是有Interceptor实现,可以在配置文件中组装Action用到的Interceptor,它会按照你指定的顺序,在 Action执行前后运行。 
那么什么是拦截器。 
拦截器就是AOPAspect-Oriented Programming)的一种实现。(AOP是指用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。) 

7.一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。 

原文地址:https://www.cnblogs.com/kuyuyingzi/p/4266380.html