标签:
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。struts使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
Struts 2 相比Struts 1的优点:
1、在软件设计上Struts 2 没有像Struts 1那样跟Servlet API 和 struts API 有着紧密的耦合。
Struts 2的应用可以不依赖于Servlet API和Struts API 。
2、Struts 2 提供了拦截器,利用拦截器可以进行AOP编程。
3、Struts 2 提供了类型转换器。
4、Struts 2 提供支持多种表现层技术,如:JSP 、 freeMarker等。
5、Struts 2 的输入校验可以指定方法进行校验。
6、Struts 2 提供了全局范围、包范围和Action范围的国际化资源文件管理实现。
struts2 的工作原理:

1、客户端初始化一个指向Servlet容器(例如Tomcat)的HttpServletRequest请求
2、这个请求经过一系列的过滤器(Filter)【ActionContextCleanUp的可选过滤器(延长action中属性的生命周期,包括自定义属性,以便在jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action自己清除)】
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
ActionInvocation是Xworks 中Action 调度的核心。而对Interceptor 的调度,也正是由ActionInvocation负责。ActionInvocation 是一个接口,而 DefaultActionInvocation 则是Webwork 对ActionInvocation的默认实现。
Interceptor的调度流程大致如下:
1.ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。
2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper
struts2 拦截器
拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是aop的一种实现
拦截器栈(Interceptor Stack)。Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其之前定义的顺序被调用
工作原理:

拦截器实现类
struts2规定用户自定义拦截器必须实现com.opensymphony.xwork2.interceptor.Interceptor接口。
该接口声明了3个方法
void init();
void destroy();
String intercept(ActionInvocation invocation) throws Exception;
【抽象类AbstractInterceptor实现了Interceptor接口,提供了init和destroy方法的空实现。如果我们的拦截器不需要打开资源,则可以无需实现这两个方法。可通过继承AbstractInterceptor抽象类来实现自定义拦截器会更简单】
1 package interceptor; 2 import com.opensymphony.xwork2.ActionInvocation; 3 import com.opensymphony.xwork2.interceptor.Interceptor; 4 public class MyInterceptor implements Interceptor { 5 public void destroy() { 6 // TODO Auto-generated method stub 7 } 8 public void init() { 9 // TODO Auto-generated method stub 10 } 11 public String intercept(ActionInvocation invocation) throws Exception { 12 System.out.println("Action执行前插入 代码"); 13 //执行目标方法 (调用下一个拦截器, 或执行Action) 14 final String res = invocation.invoke(); 15 System.out.println("Action执行后插入 代码"); 16 return res; 17 }
18 }
自定义拦截器,拦截器
 1 <package name="custom" extends="struts-default" namespace="/">
 2         <interceptors>
 3         <!-- 定义拦截器 -->
 4         <interceptor name="拦截器名" class="拦截器实现类"/>
 5         <!-- 定义拦截器栈 -->
 6         <interceptor-stack name="拦截器栈名">
 7              <interceptor-ref name="拦截器一"/>
 8              <interceptor-ref name="拦截器二"/>
 9         </interceptor-stack>
10         </interceptors>
11        
12 </package>
使用拦截器
1 <action name="user" class="com.userAction"> 2 <result name="success">/success.jsp</result> 3 <result name="error">/error.jsp</result> 4 <!-- 使用拦截器,一般配置在result之后, --> 5 <!-- 引用系统默认的拦截器 --> 6 <interceptor-ref name="defaultStack"/> 7 <interceptor-ref name="拦截器名或拦截器栈名"/> 8 </action>
如果为Action指定了一个拦截器,则系统默认的拦截器栈将会失去作用。为了继续使用默认拦截器,需要在自己定义的拦截器栈中手动引入了默认拦截器。
【默认的拦截器中有一个名为params的拦截器,它的作用是“将请求的参数设置到Action中”,也就是说,如果你从页面中传值到Action,即拦截请求参数,并赋值给action里的属
性,而且你自定义的拦截器要用到这些值栈中的值,则你的拦截器栈中,需要在自定义拦截器前面加上默认的拦截器】
struts2 已经为您提供丰富多样的,功能齐全的拦截器实现。在struts2的jar包内的struts-default.xml可以查看到关于默认的拦截器与拦截器链的配置。
| 
 拦截器  | 
 名字  | 
 说明  | 
| 
 Alias Interceptor  | 
 alias  | 
 在不同请求之间将请求参数在不同名字件转换,请求内容不变  | 
| 
 Chaining Interceptor  | 
 chain  | 
 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。  | 
| 
 Checkbox Interceptor  | 
 checkbox  | 
 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。  | 
| 
 Cookies Interceptor  | 
 cookies  | 
 使用配置的name,value来是指cookies  | 
| 
 Conversion Error Interceptor  | 
 conversionError  | 
 将错误从ActionContext中添加到Action的属性字段中。  | 
| 
 Create Session Interceptor  | 
 createSession  | 
 自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。  | 
| 
 Debugging Interceptor  | 
 debugging  | 
 提供不同的调试用的页面来展现内部的数据状况。  | 
| 
 Execute and Wait Interceptor  | 
 execAndWait  | 
 在后台执行Action,同时将用户带到一个中间的等待页面。  | 
| 
 Exception Interceptor  | 
 exception  | 
 将异常定位到一个画面  | 
| 
 File Upload Interceptor  | 
 fileUpload  | 
 提供文件上传功能  | 
| 
 I18n Interceptor  | 
 i18n  | 
 记录用户选择的locale  | 
| 
 Logger Interceptor  | 
 logger  | 
 输出Action的名字  | 
| 
 Message Store Interceptor  | 
 store  | 
 存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。  | 
| 
 Model Driven Interceptor  | 
 model-driven  | 
 如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。  | 
| 
 Scoped Model Driven  | 
 scoped-model-driven  | 
 如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。  | 
| 
 Parameters Interceptor  | 
 params  | 
 将请求中的参数设置到Action中去。  | 
| 
 Prepare Interceptor  | 
 prepare  | 
 如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。  | 
| 
 Scope Interceptor  | 
 scope  | 
 将Action状态存入session和application的简单方法。  | 
| 
 Servlet Config Interceptor  | 
 servletConfig  | 
 提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。  | 
| 
 Static Parameters Interceptor  | 
 staticParams  | 
 从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。  | 
| 
 Roles Interceptor  | 
 roles  | 
 确定用户是否具有JAAS指定的Role,否则不予执行。  | 
| 
 Timer Interceptor  | 
 timer  | 
 输出Action执行的时间  | 
| 
 Token Interceptor  | 
 token  | 
 通过Token来避免双击  | 
| 
 Token Session Interceptor  | 
 tokenSession  | 
 和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中  | 
| 
 Validation Interceptor  | 
 validation  | 
 使用action-validation.xml文件中定义的内容校验提交的数据。  | 
| 
 Workflow Interceptor  | 
 workflow  | 
 调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面  | 
| 
 Parameter Filter Interceptor  | 
 N/A  | 
 从参数列表中删除不必要的参数  | 
| 
 Profiling Interceptor  | 
 profiling  | 
 通过参数激活profile 
  | 
如果为了简化struts.xml文件的配置,避免在每个Action重复配置该拦截器,可以将拦截器配置成了一个默认拦截器栈
1 <struts> 2 <package name="test" extends="struts-default" namespace="/"> 3 4 <interceptors> 5 <!-- 定义拦截器 --> 6 <interceptor name="customInterceptor" 7 class="com.testInterceptor" /> 8 <!-- 定义一个拦截器栈 --> 9 <interceptor-stack name="mydefault"> 10 <interceptor-ref name="defaultStack" /> 11 <interceptor-ref name="customInterceptor" /> 12 </interceptor-stack> 13 </interceptors> 14 15 <!-- 定义默认拦截器 --> 16 <default-interceptor-ref name="mydefault" /> 17 18 <!-- 定义全局处理结果 --> 19 <global-results> 20 <!-- 逻辑名为login的结果,映射到/login.jsp页面 --> 21 <result name="login">/login.jsp</result> 22 </global-results> 23 24 <action name="user" class="com.UserAction" > 25 <result name="success">/success.jsp</result> 26 </action> 27 </package> 28 29 <package name="test1" extends="struts-default" namespace="/"> 30 <action name="admin" class="com.UserAction" > 31 <result name="success">/success.jsp</result> 32 </action> 33 </package> 34 </struts>
一旦在某个包下定义了默认拦截器栈,在该包下的所有action都会使用此拦截器栈。对于那些不想使用这些拦截器栈的action,则应该将它放置在其它的包下【如:test1】
拦截器与过滤器的区别:
   1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
   2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
   3.拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。
   4.拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。
   5.在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次。
参考:http://blog.csdn.net/laner0515/article/details/27692673/
http://blog.csdn.net/qjyong/article/details/1824607
标签:
原文地址:http://www.cnblogs.com/cmyxn/p/5700781.html