Struts2拦截器简要说明

 

转载于:

http://www.mxjava.com/struts2-interceptor.html

拦截器,在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"> 
        <interceptor-ref name="logger"/> 
        <interceptor-ref name="timer" /> 
    </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; 
    import com.opensymphony.xwork2.ActionSupport; 
     
    public class FirstAction extends ActionSupport           
    { 
           public String execute() throws Exception { 
               Thread.sleep(1000); // 延迟1秒 
               return null; 
           } 
    } 
    
       当客户端的一个form向服务端提交请求时,如有一个textfield,代码如下:
  1. <s:form action="first" namespace="/test"> 
       <s:textfield name="name"/> 
       <s:submit/> 
    </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"> 
        <interceptor-ref name="timer" /> 
        <interceptor-ref name="params"/> 
    </action>
      

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

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

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

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

  1. <package name="demo" extends="struts-default" > 
        <interceptors> 
            <interceptor-stack name="mystack"> 
                <interceptor-ref name="timer" /> 
                <interceptor-ref name="logger" /> 
                <interceptor-ref name="params" /> 
                <interceptor-ref name="static-params" /> 
            </interceptor-stack> 
        </interceptors> 
     
        <action name="first" class="action.FirstAction"> 
            <param name="who">比尔</param> 
            <interceptor-ref name="mystack"/>             
        </action> 
    </package> 
     

你可能感兴趣的:(struts2)