struts2
Action:
在传统的MVC框架中,Control层一般都是一个类似与Servlet的一个java对象,因为从职责上讲,Control层需要完成一下的职责:
1、接收从web容器传递过来的参数,并做恰当的类型转化。
2、调用逻辑处理
3、搜集证据,并返回到视图。
其中的第一、三步骤,都需要web容器中的对象的处理。
Struts2中的Action,与其他传统的MVC框架不同,使用XWork的Action来构造Control层。
Struts2中的Action,并不需要依赖于特定的web容器,我们看不到类似HttpServletRequest,HttpServletResponse等web服务器相关的对象。
所以:
1、Struts2的Action并不带有任何web容器相关的对象,Action优势如何工作在web容器在的呢?
虽然Struts2的aciton只是一个非常普通的java对象,并不具备任何web容器的特质,但是我们把Action放到一个更大的环境中来看。事实上,Struts2为Action的执行,准备了万丈的数据环境和执行环境,而这个执行环境,就保证了Action在web容器中的顺利运行。
在Struts2中,每一个http的请求,会被发送到一个Filter.而这个Filter,就那会针对每个请求,创建出一个代码的执行环境,并在这个基础上,为每个执行环境配置与之独行的数据环境,而这个数据环境中的内容,就是来自与web容器中的一个又一个的对象。这样,就能顺利钓鱼那个Action执行代码而无须担心他是否在web容器中了。
2、Struts2的Action并不带有任何web容器相关的对象,Action中又如何与web容器进行通信并获取web容器的相关对象呢?
Struts2会为每个http的请求简历一个执行环境和数据环境,其中,数据环境就成为了Action获取web容器的基础。所以,当Action需要获取web容器的相关对象,需要通过数据环境来进行。
Struts的Action的优点:
1、使得Struts2的Action易于测试
如果我们完全不考虑Action的执行环境,仅仅把Action看作一个普通的java对象,那么我们甚至可以直接new一个Action的对象,通过执行其中的方法完成测试,即,我们无需任何mock,来模拟web容器的环境。
2、结合Action的执行环境,使得Struts2在Control这个层次上,能够定义更加丰富的执行层次。
因为Action是一个普通的java类,而不是一个servlet类,完全脱离于web容器,所有我们就能够更加方便的对Control层进行合理的层次设计,从而抽象出许多公告的逻辑,并将这些逻辑脱离于Action对象本身,事实上,Struts2也是这么做的,无论Interceptor,还是Result,其实都是抽象出了Action中公共的逻辑部分,并将他们放到Action的外面,从而更加简化了Action的开发。
3、使得Struts2的Action类似POJO,更加易于管理。
Struts2的Action是一个线程安全的对象,而web容器传递过来的参数,也会传递到Action中的成员变量中,这样,Action看上去更像一个POJO,从而能够方便的被许多对象容器进行管理,比如说,可以非常方便的把Action纳入Spring的容器中进行管理。
Action的生命周期:
Action的五大元素:
Action的数据环境、Action的执行环境、Action的调度者、Action的层次结构和Action的执行结果。
ActionContext------数据环境
之前我们提到了Struts2的Action并不是一个Servlet,它是脱离了web容器的,但是对于一个web框架来说,所有的数据请求(Request)和数据返回(Response)都是来源与web容器,那么Action在执行的时候,如何去获取这些数据呢???
我们需要为每个Action准备一个数据环境------ActionContext。由于Action是应对于一个又一个的url请求,所以ActionContext应该具备以下的特性:
1、ActionContext应成为Action与web容器之间的桥梁。
2、ActionContext中应该保存有针对某个请求的详细信息
3、ActionContext应该是一个线程安全的类对象
Interceptor -----丰富的层次结构
在Struts2中,使用了一种类似责任链的设计模式对这些不同职责进行分类并串联起来,从而使得Action层具备了丰富的层次结构,而在这个执行队列中的每个元素,就被我们称为interceptor,也就是拦截器。
Interceptors can execute code before and after an Action is invoked.
拦截器可以执行代码之前和之后调用的操作。
拦截器是 AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来之地in个拦截器的代码在“织入点”的前后执行,从而起到拦截的作用。Struts2的Interceptor,其拦截的对象是Action代码,可以定义在Action代码之前或之后执行拦截器的代码。
Interceptor一层一层的把Action包了起来,这是一个典型的堆栈结构,在代码执行的时候,每个Interceptor不仅需要变成它本身自己的逻辑,还通过递归调用负责下一个拦截器或Action的调用。
参考:http://www.cnblogs.com/yan5lang/archive/2009/07/23/1529407.html