您的位置:首页 > 编程语言 > Java开发

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的作用就是上面用粗体标注出来的那一句。它会在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: