转载

《研磨struts2》 第六章 拦截器 之 6.3 自定义的拦截器

6.3  自定义的拦截器

6.3.1  什么是自定义的拦截器

所谓自定义的拦截器,就是由我们自己定义并实现的拦截器,而不是由Struts2定义好的拦截器。

虽然Struts2的预定义拦截器已经满足了大多数情况的需要。但在有些时候,我们可能会根据项目的实际需要而自定义一些拦截器,来实现一些特别的功能。

       比如,我们可能认为Struts2预置的logger拦截器功能比较弱,我们希望在任何一个action运行的时候,都会先打印出所访问的动作类Action,再打印出所有的request参数,最后打印出要跳转到的jsp。这个功能并不影响真正的业务逻辑,但是对调试错误是非常有帮助的,免的我们再手工一一对应和查看。

6.3.2  开发自定义拦截器

好了,了解了什么是自定义的拦截器过后,一起来看看究竟如何实现自定义的拦截器。

其实在Struts2里面,要实现自定义的拦截器是非常简单的,只要写一个实现Interceptor接口的类就可以了。

       也就是说,所有的拦截器都要实现com.opensymphony.xwork2.interceptor.Interceptor接口,这个接口中定义如下:

 

java代码:
查看复制到剪贴板打印
  1. public interface Interceptor extends Serializable {  
  2.     void destroy();  
  3.     void init();  
  4.     String intercept(ActionInvocation invocation) throws Exception;  
  5. }  

方法的基本说明如下:

  • init方法就类似于构造方法,用于初始化一些相关资源
  • destory方法类似于析构方法,用于释放资源
  • intercept方法,就是拦截器执行的处理方法,我们要实现的功能主要就写在这个方法里面。

对于intercept方法,再说明几点:

(1)在intercept方法中写“invocation.invoke();”,这句话的意思是继续运行拦截器后续的处理,如果这个拦截器后面还有拦截器,那么会继续运行,一直到运行Action,然后执行Result。

如果intercept方法中没有写“invocation.invoke();”这句话,那就意味着对请求的运行处理到此为止,不再继续向后运行了,换句话说,后续的拦截器和Action就不再执行了。而是在这里返回Result字符串,直接去进行Result处理了。

(2)在“invocation.invoke();”这句话之前写的功能,会在Action运行之前执行

(3)在“invocation.invoke();”这句话之后写的功能,会在Result运行之后执行

(4)intercept方法的返回值就是最终要返回的Result字符串,这个只是在前面没有执行Result的时候才有效,也就是前面没有“invocation.invoke();”这句话的时候,这个返回值就相当于是最终要返回的Result字符串,然后才执行相应的Result处理。

       说了这么多,还是来示例一下,看看如何实现自定义的拦截器吧。

1:先来个最简单的,就是在Action运行之前,和Result运行之后输出一点信息,当然,有实际功能需求的时候,就写成实际功能的处理代码了,示例代码如下:

 

java代码:
查看复制到剪贴板打印
  1. package cn.javass.action.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionInvocation;  
  4. import com.opensymphony.xwork2.interceptor.Interceptor;  
  5.   
  6. public class MyInterceptor implements Interceptor{    
  7.     public void destroy() {  
  8.         System.out.println("MyInterceptor 销毁");  
  9.     }     
  10.     public void init() {  
  11.         System.out.println("MyInterceptor 初始化");          
  12.     }  
  13.       
  14.     public String intercept(ActionInvocation invocation) throws Exception {  
  15.         System.out.println("在acton执行之前");  
  16.         String result = invocation.invoke();  
  17.         System.out.println("在Result运行之后");  
  18.           
  19.         return result;  
  20.     }  
  21. }  

可以看到,这个Interceptor的init方法和destroy方法只是输出了一句信息,它的intercept方法用来执行响应,在“invocation.invoke();”这句话之前和之后分别输出了一句信息。最后返回的result,就是invocation.invoke()的返回值。

2:HelloWorldAction这个类不用修改

3:需要到struts.xml里面配置拦截器的声明和引用,示例如下:

 

java代码:
查看复制到剪贴板打印
  1. <package name="helloworld"  extends="struts-default">  
  2.     <interceptors>  
  3.             <interceptor name=“myInterceptor” class="cn.javass.action.action.MyInterceptor"/>  
  4.         </interceptors>  
  5.                   
  6.         <action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction">  
  7.             <result name="toWelcome">/s2impl/welcome.jsp</result>  
  8.             <interceptor-ref name=“myInterceptor”/>  
  9.             <interceptor-ref name="defaultStack"/>  
  10.         </action>  
  11. </package>  

在这个<package>元素中,首先声明了一个自定义的拦截器:

 

java代码:
查看复制到剪贴板打印
  1. <interceptors>  
  2.         <interceptor name=“myInterceptor” class="cn.javass.action.action.MyInterceptor"/>  
  3.     </interceptors>  

然后在<action>中引用了这个拦截器。

4:运行测试一下,后台输出:

 

java代码:
查看复制到剪贴板打印
  1. 在acton执行之前  
  2. 用户输入的参数为===account=test,password=test,submitFlag=login  
  3. 在Result运行之后  

可以看到加粗部分就是在拦截器里输出的信息,它分别运行于Action运行之前和Result运行之后。可能有朋友会说,从这里只看到了Action的运行,并没有看到Result的运行啊,你怎么知道是在Result运行之后呢?

       很简单,前面增经做过一个自定义的Result,这里来使用它,这样就可以在里面输出信息,从而看出拦截器、Action和Result运行的顺序了。

5:上一章自定义Result的类MyResult不需要改动

6:修改struts.xml,在里面添加上Result的定义,配置如下:

 

java代码:
查看复制到剪贴板打印
  1. <package name="helloworld"  extends="struts-default">  
  2.         <result-types>  
  3.             <result-type name="MyResult" class="cn.javass.action.action.MyResult" default="false"/>  
  4.         </result-types>  
  5.                   
  6.         <interceptors>  
  7.             <interceptor name=“myInterceptor” class="cn.javass.action.action.MyInterceptor"/>  
  8.         </interceptors>  
  9.                   
  10.         <action name="helloworldAction" class="cn.javass.action.action.HelloWorldAction">  
  11.             <result name="toWelcome" type="MyResult">/s2impl/welcome.jsp</result>  
  12.             <interceptor-ref name=“myInterceptor”/>  
  13.             <interceptor-ref name="defaultStack"/>  
  14.         </action>  
  15. </package>  

7:再次访问登录页面,重新运行测试,后台的输出为:

 

java代码:
查看复制到剪贴板打印
收藏 分享
正文到此结束
Loading...