Struts2-拦截器配置

<interceptor>定义一个拦截器

  • name属性定义拦截器的引用名称
  • class属性定义拦截器类

<interceptor-stack>定义一组拦截器的组合

  • 内部使用interceptor-ref标签引用已经定义了的拦截器
  • name属性定义拦截器组的引用名称

<interceptor-ref>定义对拦截器的引用

  • name属性指向已经定义了的拦截器名

<default-interceptor-ref> 指明默认的拦截器,如果action没有自定义拦截器的引用,则应用默认的

<struts>    
    <!-- 
        注意:一旦继承了struts-default包(package),所有Action都会默认调用拦截器栈 defaultStack。
        但是当在Action配置中加入“<interceptor-ref name=”..“ />”则会覆盖defaultStack,
        所以在action中写拦截器引用时,需要显示引用defaultStack(而且最好在第一句)
        <interceptor-ref name="defaultStack"></interceptor-ref>
        <interceptor-ref name="myint1"></interceptor-ref>
     -->



    <!-- 自定义拦截器
        1,创建拦截器类
        2,定义拦截器
        3,配置action使用拦截器
     -->
    <package name="myinterceptor" extends="struts-default">
        <!-- 拦截器配置
            1, 配置<interceptors> 里面时拦截器的定义及拦截器栈
         -->    
         <interceptors>
             <!-- 拦截器 是对拦截器的定义
             <interceptor name="拦截器名" class="对应的类"></interceptor>
             -->
             <interceptor name="myint1" class="com.java4struts.intercepter.MyInterceptor"></interceptor>
             <interceptor name="myint2" class="com.java4struts.intercepter.MyInterceptor2"></interceptor>
             <!-- 方法过滤拦截器
                 只要(有)在includemethods参数中出现的方法名都拦截
                 在includeMethods中没出现,而且在excludeMethods中出现的,不拦截
              -->
             <interceptor name="mymethodint" 
                 class="com.java4struts.intercepter.MyMethodFilterInterceptor">
                     <param name="excludeMethods">abc</param>
                     <param name="includeMethods">xyz,execute,abc</param>
             </interceptor>
         
              
              
             <!-- 拦截器栈:一组拦截器 -->
             <interceptor-stack name="mystack">
                 <!-- 拦截器的引用 
                 <interceptor-ref name="拦截器名"></interceptor-ref>
                 -->
                 <interceptor-ref name="defaultStack"></interceptor-ref>
                 <interceptor-ref name="myint1"></interceptor-ref>
                 <interceptor-ref name="myint2"></interceptor-ref>
                 <interceptor-ref name="mymethodint"></interceptor-ref>
                 
             </interceptor-stack>
             
         </interceptors>
         
         
         <action name="demoaction" class="com.java4struts.intercepter.DemoAction" >
             <!-- 在action中应用拦截器 
             注意:一旦应用了自定义的拦截器配置,那么默认拦截器将不再应用,需要明确指明,
             这样才能实现action的默认功能
             <interceptor-ref name="defaultStack"></interceptor-ref>
             <interceptor-ref name="拦截器名"></interceptor-ref>
             -->
             <!-- 第一种方法:单独引用每一个拦截器-->
                 <interceptor-ref name="defaultStack"></interceptor-ref>
                 <interceptor-ref name="myint1"></interceptor-ref>
                 <interceptor-ref name="myint2"></interceptor-ref>
                 <interceptor-ref name="mymethodint"></interceptor-ref>
              
             <!-- 第二种方法:定义拦截器栈 
             <interceptor-ref name="mystack"></interceptor-ref>
             -->
             
             <result name="success">/WEB-INF/securitypages/security.jsp</result>
         </action>    
         
    </package>
</struts>

拦截器的三种实现方式

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.Interceptor;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class MyMethodFilterInterceptor extends MethodFilterInterceptor {

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        //这个方法实现拦截器应用
        //1,调用action方法前的处理操作
        System.out.println("MyMethodFilterInterceptor action方法调用前");
        
        //2,调用下一个拦截器或action方法(如果没有下一个拦截器)
        String result = invocation.invoke();        
        
        //3,action(或下一个拦截器)返回结果后的处理操作
        System.out.println("MyMethodFilterInterceptor action方法调用后");
        return result;
    }


}
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor2 extends AbstractInterceptor {

    public String intercept(ActionInvocation invocation) throws Exception {
        //这个方法实现拦截器应用
        //1,调用action方法前的处理操作
        System.out.println("MyInterceptor2 action方法调用前");
        
        //2,调用下一个拦截器或action方法(如果没有下一个拦截器)
        String result = invocation.invoke();        
        
        //3,action(或下一个拦截器)返回结果后的处理操作
        System.out.println("MyInterceptor2 action方法调用后");
        return result;
    }

}
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class MyInterceptor implements Interceptor {

    public void destroy() {
        // 销毁拦截器时被调用
        System.out.println("MyInterceptor被销毁了");
    }

    public void init() {
        // 实例化拦截器之后被调用
        System.out.println("MyInterceptor初始化"); 
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        //这个方法实现拦截器应用
        //1,调用action方法前的处理操作
        System.out.println("MyInterceptor1 action方法调用前");
        
        //2,调用下一个拦截器或action方法(如果没有下一个拦截器)
        String result = invocation.invoke();        
        
        //3,action(或下一个拦截器)返回结果后的处理操作
        System.out.println("MyInterceptor1 action方法调用后");
        return result;
    }

}

 

posted @ 2013-03-16 11:15  水不会停留  阅读(160)  评论(0编辑  收藏  举报