struts2拦截器的使用(二)

来源:互联网 发布:php图片投票系统源码 编辑:程序博客网 时间:2024/06/09 21:38

在struts2中的拦截器的基础上进行修改,以实现Interceptor接口的方式创建一个新的拦截器,如下所示:

Java代码 复制代码 收藏代码
  1. public class MyInterceptor implements Interceptor {   
  2.   
  3.     @Override  
  4.     public void destroy() {   
  5.     }   
  6.   
  7.     @Override  
  8.     public void init() {   
  9.     }   
  10.   
  11.     @Override  
  12.     public String intercept(ActionInvocation invocation)   
  13.             throws Exception {   
  14.         System.out.println("开始拦截");   
  15.         invocation.invoke();   
  16.         System.out.println("结束拦截");   
  17.         return "success";   
  18.     }   
  19. }  

方式二、继承AbstractInterceptor抽象类

代码如下所示:

Java代码 复制代码 收藏代码
  1. import com.opensymphony.xwork2.ActionInvocation;   
  2. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;   
  3.   
  4. public class MyAbstractInterceptor extends AbstractInterceptor {   
  5.   
  6.     @Override  
  7.     public String intercept(ActionInvocation invocation)   
  8.             throws Exception {   
  9.         System.out.println("Abs开始拦截");   
  10.         String result = invocation.invoke();   
  11.         System.out.println("Abs结束拦截");   
  12.         return result;   
  13.   
  14.     }   
  15. }  

 AbstractInterceptor的源代码如下所示:

Java代码 复制代码 收藏代码
  1. public abstract class AbstractInterceptor   
  2.   implements Interceptor   
  3. {   
  4.   public void init()   
  5.   {   
  6.   }   
  7.   
  8.   public void destroy()   
  9.   {   
  10.   }   
  11.   
  12.   public abstract String intercept(ActionInvocation paramActionInvocation)   
  13.     throws Exception;   
  14. }  

 方式三、继承MethodFilterInteceptor类

Java代码 复制代码 收藏代码
  1. public class MyMethodFilterInterceptor extends MethodFilterInterceptor {   
  2.   
  3.     @Override  
  4.     protected String doIntercept(ActionInvocation invocation)   
  5.             throws Exception {   
  6.         System.out.println("method开始拦截");   
  7.         String result=invocation.invoke();   
  8.         System.out.println("method结束拦截");   
  9.         return result;   
  10.     }   
  11. }  

 配置文件如下所示:

Xml代码 复制代码 收藏代码
  1. <package name="myDemo" namespace="/demo" extends="struts-default">  
  2.         <interceptors>  
  3.             <interceptor name="myInterceptor" class="demo.action.MyInterceptor" />  
  4.             <interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" />  
  5.             <interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" />  
  6.         </interceptors>  
  7.         <action name="login" class="demo.login.action.LoginAction">  
  8.             <result name="success">/WEB-INF/jsp/success.jsp</result>  
  9.             <interceptor-ref name="myInterceptor"></interceptor-ref>  
  10.             <interceptor-ref name="absInterceptor" />  
  11.             <interceptor-ref name="methodInterceptor" />  
  12.         </action>  
  13.     </package>  

 或者为

Xml代码 复制代码 收藏代码
  1. <package name="myDemo" namespace="/demo" extends="struts-default">  
  2.     <interceptors>  
  3.         <interceptor name="myInterceptor" class="demo.action.MyInterceptor" />  
  4.         <interceptor name="absInterceptor" class="demo.action.MyAbstractInterceptor" />  
  5.         <interceptor name="methodInterceptor" class="demo.action.MyMethodFilterInterceptor" />  
  6.     </interceptors>  
  7.     <interceptor-stack name="myInterceptors">  
  8.             <interceptor-ref name="myInterceptor" />  
  9.             <interceptor-ref name="absInterceptor" />  
  10.         <interceptor-ref name="methodInterceptor" />  
  11.         </interceptor-stack>  
  12.     <action name="login" class="demo.login.action.LoginAction">  
  13.         <result name="success">/WEB-INF/jsp/success.jsp</result>  
  14.         <interceptor-ref name="myInterceptors" />  
  15.     </action>  
  16. </package>  

 分析:当配置到此,实质便为LoginAction配置了三个拦截器,当我们点击登录时会在控制台打印出如下语句:
开始拦截
Abs开始拦截
method开始拦截
--先执行拦截器,再执行此Action
method结束拦截
Abs结束拦截
结束拦截
其实当我们点击登录时,本来是要访问LoginAction,最后会把LoginAction的执行结果传递给访问者。但是当我们配置了拦截器时,当我们去访问Action时,会首先被拦截,随后拦截器执行一些操作后才会继续把请求传递下去。下面作图说明拦截流程:



 结合现实理解:比如我们要去某楼层找某人(LoginAction)取一个资源(LoginAction处理后返回的结果,这里表现为success.jsp),(1)进楼层时会被大门保安拦截检查(第一个拦截器:MyInterceptor拦截器),(2)检查通过后再进电梯时会被电梯保安员检查(第二个拦截器:MyAbstractInterceptor拦截器),(3)检查通过后再上到某楼层会被楼层保安员检查(第三个拦截器:MethodAction拦截器
),(4)检查通过后会找到某个(LoginAction),并与某个交谈(LoginAction处理),随后某个人和我们会带着请求的资源出去,(5)出去时,会依次被楼层,电梯,大门保安员检查,最终检查通过。某个人把资源给我们(实质就是返回请求资源给客户端)。 其实拦截器的执行流程和过滤器差不多,所以我们不防用过滤器的眼光来看这些拦截器。
注意:我们在为LoginAction配置拦截器时,都没使用默认的拦截器,是原因这里的测试可以不用,但是以后在我们使用自定义的拦截器是,一定要加上默认的拦截器,否则会导致许多不可预知的结果。
补充:从上面的图并结合代码,我们可以看出拦截器的核心过程应该是ActionInvocation对这些拦截器回调处理,下面我们我们作图分析ActionInvocation的实现过程:



 上面分别使用了三种方式来创建自定义的拦截器,第一种方式是最原始的实现方式,第二种方式的好处是我们可以不必重写所有的方法,较常用。第三种方式进行了扩展.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鬼火摩托车没力怎么办 摩托车油漆掉了怎么办 发动机怠速不稳怎么办 信用综合评分不足怎么办 综合评分不足是怎么办 综合信用分不足怎么办 iptv突然无信号怎么办 排气系统故障灯亮怎么办 空调冷凝器坏了怎么办 水温空调不制冷怎么办 用冷风机屋里潮怎么办 空调制热不出水怎么办 空调水管堵了怎么办 空调制冷不出水怎么办 空调出风口漏水怎么办 空调管漏水厉害怎么办 电动车车速变慢怎么办 遥控器按钮掉了怎么办 苹果6屏幕凸起怎么办 三星笔记本开机黑屏怎么办 笔记本电脑开机黑屏怎么办三星 笔记本电脑黑屏怎么办灯是亮得 九代雅阁收音机信号不好怎么办 九代雅阁电瓶亏电怎么办 17款雅阁混动汽车胎压灯怎么办 空调制冷出热风怎么办 轿车方向机漏油怎么办 车钥匙感应不灵怎么办 汽车助力泵漏油怎么办 奔腾b70油耗高怎么办 方向机漏油了怎么办 威志油耗高怎么办 佳美2.4油耗大怎么办 笔记本电脑按键坏了怎么办 电视主板坏了怎么办 面包车电量亏电怎么办 自动挡汽车亏电怎么办 自动挡亏电了怎么办 面包车打不起火怎么办 汽车电瓶亏电怎么办 小车电池没电怎么办