Struts2 中拦截器和Action的调用关系

来源:互联网 发布:python 判断奇数偶数 编辑:程序博客网 时间:2024/05/16 07:04

所谓的拦截器就是指实现了Interceptor接口的类,该接口中定义了三个方法:init(),destroy(),intercept()。init()用于在服务器启动的时候,初始化这个拦截器。destroy()用于清理分配给拦截器的资源,intercept()是用来起拦截作用的,这个方法还有一个ActionInvocation类型的参数invocation,并且返回一个字符串。ActionInvocation类中有一个方法,是invoke(),这个方法很重要,它的作用是首先判断一下有没有其他的拦截器了,如果有,则继续进入下一个拦截器,如果没有那么就进入Action中执行业务逻辑。intercept()方法的执行过程也很特殊,在invoke()函数之前的代码先执行,执行到invoke()时,判断一下,进入下一个拦截器,或是进行Action的业务处理,等到执行完所有请求转发的Action时,会再回到intercept()方法,继续执行invoke()后面的内容。

注意上面红颜色的部分,为什么是执行完所有的请求转发的Action呢?这是因为执行完当前的Action,可能会请求转发或是重定向到另一个Action中或是结果页面,若是重定向的话,那么就不是在一个请求过程中了,就会重新发一次请求,请求另一个Action,因为一个拦截器只会对一个特定的Action起作用,所以重定向,就完全是另一次请求过程了。然而在拦截器中,若是重定向到另一个Action的话,那么当前的Action就算完成了它的业务逻辑,就会返回执行invoke()方法之后的内容,然后,再进行另一次请求过程。如果是请求转发的话,那么Action之间是在一个请求过程中,等到所有的请求转发的Action执行完之后,才会去执行invoke()后面的内容。

下面,举两个例子对比一下:

有一个jsp页面,两个Action:Action1和Action2

第一次:Action1和Action2之间是请求转发关系

第二次:Action1和Action2之间是重定向关系

[html] view plaincopy
  1. Login.jsp:  
  2.       
  3. <form action="/struts2/test/action1" method="post">  
  4.         姓名:<input type="text" name="username"/><br/>  
  5.         密码:<input type="password" name="password"/><br/>  
  6.         <input type="submit" value="提交"/>  
  7. </form>  
[java] view plaincopy
  1. 拦截器:MyInterceptor.java:  
  2.   
  3. package com.suo.interceptor;  
  4.   
  5. import com.opensymphony.xwork2.ActionInvocation;  
  6. import com.opensymphony.xwork2.interceptor.Interceptor;  
  7.   
  8. public class MyInterceptor implements Interceptor {  
  9.   
  10.     @Override  
  11.     public void destroy() {  
  12.         // TODO Auto-generated method stub  
  13.         System.out.println("destroy invoke !");  
  14.     }  
  15.   
  16.     @Override  
  17.     public void init() {  
  18.         // TODO Auto-generated method stub  
  19.         System.out.println("init invoke !");  
  20.     }  
  21.   
  22.     @Override  
  23.     public String intercept(ActionInvocation invocation) throws Exception {  
  24.         System.out.println("before invoke !");  
  25.           
  26.         String result=invocation.invoke();  
  27.           
  28.         System.out.println("after invoke !");  
  29.           
  30.         return result;  
  31.     }  
  32.   
  33. }  
[java] view plaincopy
  1. Action1.java:  
  2.   
  3. package com.suo.actions;  
  4.   
  5. import com.opensymphony.xwork2.ActionSupport;  
  6.   
  7. public class Action1 extends ActionSupport {  
  8.       
  9.     private String username;  
  10.     private String password;  
  11.       
  12.     public String getUsername() {  
  13.         return username;  
  14.     }  
  15.     public void setUsername(String username) {  
  16.         this.username = username;  
  17.     }  
  18.     public String getPassword() {  
  19.         return password;  
  20.     }  
  21.     public void setPassword(String password) {  
  22.         this.password = password;  
  23.     }  
  24.       
  25.     public String execute()  
  26.     {  
  27.         System.out.println("action1 invoke !");  
  28.         return SUCCESS;  
  29.     }  
  30. }  
[java] view plaincopy
  1. Action2.java:  
  2.   
  3. package com.suo.actions;  
  4.   
  5. import com.opensymphony.xwork2.ActionSupport;  
  6.   
  7. public class Action2 extends ActionSupport {  
  8.       
  9.     private String username;  
  10.     private String password;  
  11.       
  12.     public String getUsername() {  
  13.         return username;  
  14.     }  
  15.     public void setUsername(String username) {  
  16.         this.username = username;  
  17.     }  
  18.     public String getPassword() {  
  19.         return password;  
  20.     }  
  21.     public void setPassword(String password) {  
  22.         this.password = password;  
  23.     }  
  24.   
  25.     public String execute()  
  26.     {  
  27.           
  28.         System.out.println("action2 invoke !");   
  29.         return SUCCESS;  
  30.     }  
  31. }  

在struts.xml中配置拦截器:
[html] view plaincopy
  1. <interceptors>  
  2.     <interceptor name="myInterceptor" class="com.suo.interceptor.MyInterceptor"></interceptor>  
  3. </interceptors>  
在action中,引用这个拦截器,注意,这里Action之间是请求转发的关系:
[html] view plaincopy
  1. <action name="action1" class="com.suo.actions.Action1">  
  2.      <result name="success" type="chain"><!--注意这里是请求转发类型-->  
  3.         <param name="actionName">action2</param>  
  4.      </result>  
  5.      <interceptor-ref name="myInterceptor"></interceptor-ref><!--这里是引用自定义的拦截器-->  
  6.      <interceptor-ref name="defaultStack"></interceptor-ref>  
  7. <!--注意,每一个action都有一个默认的拦截器,如果指定了自定义的拦截器,那么默认的拦截器就失去作用了,所以这里要再加上默认的拦截器-->  
  8. </action>  
  9.           
  10. <action name="action2" class="com.suo.actions.Action2">  
  11.      <result name="success">/WEB-INF/result/action.jsp</result>  
  12. </action>  
启动服务器,可以看到输出的结果是:
[html] view plaincopy
  1. before invoke !  
  2. action1 invoke !  
  3. action2 invoke !  
  4. after invoke !  
若是将Action间的类型换成redirectAction,那么输出的结果是:
[html] view plaincopy
  1. before invoke !  
  2. action1 invoke !  
  3. after invoke !  
  4. action2 invoke !  
补充:还可以给拦截器传递参数,进行初始化的工作。如下:
[html] view plaincopy
  1. <interceptors>  
  2.      <interceptor name="myInterceptor" class="com.suo.interceptor.MyInterceptor">  
  3.         <param name="suo">piao</param><!--传递一个参数-->  
  4.      </interceptor>  
  5. </interceptors>  
然后在拦截器中定义该参数的get/set方法,即可:
注意,这个参数的赋值,要早于init()方法的调用,因为初始化参数的作用,就是想在初始化的时候用到这个参数,所以要早于init()方法。
0 0
原创粉丝点击