Struts2框架流程概述
2015-08-05 16:44
363 查看
1. Struts2架构图
请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher;
FilterDispatcher(StrutsPrepareAndExecuteFilter)主要通过AcionMapper来决定需要调用哪个Action。
ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里创建ActionProxy,ActionProxy创建ActionInvocation,然后ActionInvocation调用Interceptors,执行Action本身,创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。
struts2 的对request的处理流程
StrutsPrepareAndExecuteFilter.doFilter()–>
ExecuteOperations.executeAction()–>
主要调用了Dispatcher.serviceAction()–>在serviceAction()中实例化了ActionProxy
并且调用了ActionProxy.execute()–>
ActionProxy.exute()很简单,实际上调用了ActionInvocation.invoke()–>
在ActionInvocation.invoke()会判断是否执行拦截器Interceptor中的功能,Interceptor可以由开发者自行定义,但是要实现Interceptor接口或者简单继承AbstractInterceptor抽象类。
Intercepter.intercept()–>拦截器最后都要返回
执行ActionInvocation.invokeActionOnly()–>invokeAction()
2. Struts2部分类介绍
这部分从Struts2参考文档中翻译就可以了。
StrutsPrepareAndExecuteFilter
在struts结构图中相当于第三层Filter:FilterDispatcher,其实它就是
servlet过滤器,实现了Filter接口,与一般的servlet-Filter作用一致,在web.xml中配置,当request请求到来时,被它拦截。
ActionMapper
ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等 java Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的 需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docs/actionmapper.html。
ActionProxy&ActionInvocation
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是 由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而 ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
ConfigurationProvider&Configuration
ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类 XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。
3. Struts2请求流程:
客户端发送请求
请求先通过ActionContextCleanUp–>FilterDispatcher
FilterDispatcher通过ActionMapper把请求路径与配置文件的namespace匹配,封装成actionMapping
如果ActionMapper返回的actionMapping不为空,则转到、FilterDispatcher的Delegate–Dispatcher,由它创建ActionProxy及ActionInvocation并初始化,ActionInvocation初始化过程中根据ActionMapping和ConfigurationManager创建真正的Action类
Dispatcher调用ActionProxy的execute方法
ActionProxy调用ActionInvocation的invoke方法
ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用
Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。
ActionContextCleanUp的作用:
延长action中属性的生命周期,包括自定义属性,以便在jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action自己清除。
就是说,一般情况下,如果你要用SiteMesh或者其他过滤器,一般是放在FilterDispatcher或者是现在的StrutsPrepareAndExecuteFilter之前。在调用完所有过滤器的doFilter方法后,核心过滤器FilterDispatcher或者StrutsPrepareAndExecuteFilter会清空ActionContext,如果其他过滤器要一直使用value stack等struts的特性时,如果不用ActionContextCleanUp的话,便得不到想要的值。
在ActionContextCleanUp中,有这样的代码:
req.setAttribute(CLEANUP_PRESENT, Boolean.TRUE);
如果FilterDispatcher检测到这个属性,就不会清除ActionContext中的内容了,而由ActionContextCleanUp后续的代码来清除,保证了一系列的Filter访问正确的ActionContext.
文档中提到,如果用到SiteMesh的Filter或者其他类似Filter,那么设置顺序是:
ActionContextCleanUp filter
SiteMesh filter
FilterDispatcher
请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher;
FilterDispatcher(StrutsPrepareAndExecuteFilter)主要通过AcionMapper来决定需要调用哪个Action。
ActionMapper取得了ActionMapping后,在Dispatcher的serviceAction方法里创建ActionProxy,ActionProxy创建ActionInvocation,然后ActionInvocation调用Interceptors,执行Action本身,创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。
struts2 的对request的处理流程
StrutsPrepareAndExecuteFilter.doFilter()–>
ExecuteOperations.executeAction()–>
主要调用了Dispatcher.serviceAction()–>在serviceAction()中实例化了ActionProxy
并且调用了ActionProxy.execute()–>
ActionProxy.exute()很简单,实际上调用了ActionInvocation.invoke()–>
在ActionInvocation.invoke()会判断是否执行拦截器Interceptor中的功能,Interceptor可以由开发者自行定义,但是要实现Interceptor接口或者简单继承AbstractInterceptor抽象类。
Intercepter.intercept()–>拦截器最后都要返回
执行ActionInvocation.invokeActionOnly()–>invokeAction()
2. Struts2部分类介绍
这部分从Struts2参考文档中翻译就可以了。
StrutsPrepareAndExecuteFilter
在struts结构图中相当于第三层Filter:FilterDispatcher,其实它就是
servlet过滤器,实现了Filter接口,与一般的servlet-Filter作用一致,在web.xml中配置,当request请求到来时,被它拦截。
ActionMapper
ActionMapper其实是HttpServletRequest和Action调用请求的一个映射,它屏蔽了Action对于Request等 java Servlet类的依赖。Struts2中它的默认实现类是DefaultActionMapper,ActionMapper很大的用处可以根据自己的 需要来设计url格式,它自己也有Restful的实现,具体可以参考文档的docs/actionmapper.html。
ActionProxy&ActionInvocation
Action的一个代理,由ActionProxyFactory创建,它本身不包括Action实例,默认实现DefaultActionProxy是 由ActionInvocation持有Action实例。ActionProxy作用是如何取得Action,无论是本地还是远程。而 ActionInvocation的作用是如何执行Action,拦截器的功能就是在ActionInvocation中实现的。
ConfigurationProvider&Configuration
ConfigurationProvider就是Struts2中配置文件的解析器,Struts2中的配置文件主要是尤其实现类 XmlConfigurationProvider及其子类StrutsXmlConfigurationProvider来解析。
3. Struts2请求流程:
客户端发送请求
请求先通过ActionContextCleanUp–>FilterDispatcher
FilterDispatcher通过ActionMapper把请求路径与配置文件的namespace匹配,封装成actionMapping
如果ActionMapper返回的actionMapping不为空,则转到、FilterDispatcher的Delegate–Dispatcher,由它创建ActionProxy及ActionInvocation并初始化,ActionInvocation初始化过程中根据ActionMapping和ConfigurationManager创建真正的Action类
Dispatcher调用ActionProxy的execute方法
ActionProxy调用ActionInvocation的invoke方法
ActionInvocation调用真正的Action,当然这涉及到相关拦截器的调用
Action执行完毕,ActionInvocation创建Result并返回,当然,如果要在返回之前做些什么,可以实现PreResultListener。添加PreResultListener可以在Interceptor中实现。
ActionContextCleanUp的作用:
延长action中属性的生命周期,包括自定义属性,以便在jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action自己清除。
就是说,一般情况下,如果你要用SiteMesh或者其他过滤器,一般是放在FilterDispatcher或者是现在的StrutsPrepareAndExecuteFilter之前。在调用完所有过滤器的doFilter方法后,核心过滤器FilterDispatcher或者StrutsPrepareAndExecuteFilter会清空ActionContext,如果其他过滤器要一直使用value stack等struts的特性时,如果不用ActionContextCleanUp的话,便得不到想要的值。
ActionContextCleanUp的作用就是上面用粗体标注出来的那一句。它会在doFilter方法里设置一个计数器counter的初始值为1,有了这个值,后续的核心过滤器就不会清空ActionContext,而是由之前的过滤器也就是ActionContextCleanUp来清空ActionContext。 为了使用WebWork,我们只需要在web.xml配置FilterDispatcher一个过滤器即可,阅读一下FilterDispatcher的JavaDoc和源码,我们可以看到它调用了:
finally { ActionContextCleanUp.cleanUp(req); }
在ActionContextCleanUp中,有这样的代码:
req.setAttribute(CLEANUP_PRESENT, Boolean.TRUE);
如果FilterDispatcher检测到这个属性,就不会清除ActionContext中的内容了,而由ActionContextCleanUp后续的代码来清除,保证了一系列的Filter访问正确的ActionContext.
文档中提到,如果用到SiteMesh的Filter或者其他类似Filter,那么设置顺序是:
ActionContextCleanUp filter
SiteMesh filter
FilterDispatcher
相关文章推荐
- 学习笔记之Myeclipse中 报错 Syntax error on token "Invalid Regular Expression Options", no accurate correc
- 八款Java 开发者必备的工具
- Spring学习8-Spring事务管理(注解式声明事务管理)
- 为什么Java byte 类型的取值范围是-128~127
- spring 配置文件属性
- 轻松入门学习java入门的常用语言知识
- Eclipse+Spring+SpringMVC+Mybatis+Maven+多库配置+resin
- Java冒泡排序BubbleSort
- Java读取properties文件的三种方式
- java使double保留两位小数的多方法 java保留两位小数
- Java增强for和一般for
- JAVA数据源连接方式汇总
- Java——File类和Properties类
- hdu 2054 A == B ? (java)
- Java游戏之碰撞检测
- hdu 2054 A == B ? (java)
- Idea新建SpringMVC报错原因
- spring security
- Java中的访问修饰符和修饰符
- Java应用程序中的声音播放