struts2 拦截器

 通过Java动态代理一文,我们了解了动态代理的好处,也知道了Struts2的拦截器也是利用Java动态代理实现的。那么什么是拦截器呢?

  拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。拦截器(Interceptor)是Struts 2的核心组成部分。很多功能(Feature)都是构建在拦截器基础之上的,例如文件的上传和下载、国际化、转换器和数据校验等,Struts 2利用内建的拦截器,完成了框架内的大部分操作。

  Struts2的拦截器和Servlet过滤器类似。在执行Action的execute方法之前,Struts2会首先执行在struts.xml中引用的拦截器,在执行完所有引用的拦截器的intercept方法后,会执行Action的execute方法。要实一个拦截器,你必须继承com.opensymphony.xwork2.interceptor.Interceptor接口,并实现Intercepter接口的以下三个方法:

  1. void destroy(); 
  2. void init(); 
  3. String intercept(ActionInvocation invocation) throws Exception;
拦截器链(Interceptor Chain,在 Struts 2中称为拦截器栈Interceptor Stack)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

  destroy和init不用多说,intercept方法是拦截器的核心方法,所有安装的拦截器都会调用这个方法。Struts 2已经为提供丰富多样的,功能齐全的拦截器实现。可以到struts2-all-2.0.1.jar或struts2-core-2.0.1.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。

   timer是Struts2中最简单的拦截器,这个拦截器对应的类是com.opensymphony.xwork2.interceptor.TimerInterceptor。它的功能是记录execute方法和其他拦截器(在timer后面定义的拦截器)的intercept方法执行的时间总和。

  1. <action name="first" class="action.FirstAction"> 
  2.     <interceptor-ref name="logger"/> 
  3.     <interceptor-ref name="timer" /> 
  4. </action> 

  在使用timer拦截器时,需要commons-logging.jar的支持。将logger引用放到timer的后面,就可以记录logger拦截器的intercept方法和Action的execute方法的执行时间总和,代码如下:

  1. <action name="first" class="action.FirstAction"> 
  2.     <interceptor-ref name="timer" /> 
  3.     <interceptor-ref name="logger"/> 
  4. </action> 

  使用以下Action类来测试timer拦截器。

  1. package action; 
  2. import com.opensymphony.xwork2.ActionSupport; 
  3.  
  4. public class FirstAction extends ActionSupport           
  5.        public String execute() throws Exception { 
  6.            Thread.sleep(1000); // 延迟1秒 
  7.            return null
  8.        } 

  当客户端的一个form向服务端提交请求时,如有一个textfield,代码如下:

  1. <s:form action="first" namespace="/test"> 
  2.    <s:textfield name="name"/> 
  3.    <s:submit/> 
  4. </s:form> 

  提交后,Struts2将会自动调用first动作类中的setName方法,并将name文本框中的值通过setName方法的参数传入。实际上,这个操作是由params拦截器完成的,params对应的类是com.opensymphony.xwork2.interceptor.ParametersInterceptor。由于params已经在defaultStack中定义,因此,在未引用拦截器的<action>中是会自动引用params的,如下面的配置代码,在访问first动作时,Struts2会自动执行相应的setter方法。  

  1. <action name="first" class="action.FirstAction"> 
  2.     … … 
  3. </action> 

  如果在<action>中引用了其他的拦截器,就必须再次引用params拦截器,Struts2才能调用相应的setter方法。如下面的配置代码所示:

  1. <action name="first" class="action.FirstAction"> 
  2.     <interceptor-ref name="timer" /> 
  3.     <interceptor-ref name="params"/> 
  4. </action> 

  static-params拦截器可以通过配置<params>标签来调用Action类的相应的setter方法,static-params拦截器对应的类是com.opensymphony.xwork2.interceptor.StaticParametersInterceptor。

  1. <action name="first" class="action.FirstAction"> 
  2.     <interceptor-ref name="timer" /> 
  3.     <param name="who">比尔</param> 
  4.     <interceptor-ref name="params"/> 
  5.     <interceptor-ref name="static-params"/> 
  6. </action> 

  如果first动作使用上面的配置,在访问first动作时,Struts2会自动调用setWho方法将“比尔”作为参数值传入setWho方法。

  为了能在多个动作中方便地引用同一个或几个拦截器,可以使用拦截器栈将这些拦截器作为一个整体来引用。拦截器栈要在<package>标签中使用<interceptors>和子标签<interceptor-stack>来定义。代码如下:

  1. <package name="demo" extends="struts-default" > 
  2.     <interceptors> 
  3.         <interceptor-stack name="mystack"> 
  4.             <interceptor-ref name="timer" /> 
  5.             <interceptor-ref name="logger" /> 
  6.             <interceptor-ref name="params" /> 
  7.             <interceptor-ref name="static-params" /> 
  8.         </interceptor-stack> 
  9.     </interceptors> 
  10.  
  11.     <action name="first" class="action.FirstAction"> 
  12.         <param name="who">比尔</param> 
  13.         <interceptor-ref name="mystack"/>             
  14.     </action> 
  15. </package>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值