自定义拦截器
一、架构
二、拦截器创建
方式1:
import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; //拦截器:第一种创建方式 //拦截器生命周期:随项目的启动而创建,随项目关闭而销毁 public class MyInterceptor implements Interceptor { @Override //初始化方法 public void init() { } @Override //拦截方法 public String intercept(ActionInvocation arg0) throws Exception { return null; } @Override //销毁方法 public void destroy() { } }
方式2:
//创建方式2: 继承AbstractInterceptor -> struts2的体贴 //帮我们空实现了init 和 destory方法. 我们如果不需要实现这两个方法,就可以只实现intercept方法 public class MyInterceptor2 extends AbstractInterceptor { @Override public String intercept(ActionInvocation arg0) throws Exception { return null; } }
方式3:
//继承:MethodFilterInterceptor 方法过滤拦截器 //功能: 定制拦截器拦截的方法. // 定制哪些方法需要拦截. // 定制哪些方法不需要拦截 public class MyInterceptor3 extends MethodFilterInterceptor{ @Override protected String doIntercept(ActionInvocation invocation) throws Exception { //前处理 System.out.println("MyInterceptor3 的前处理!"); //放行 String result = invocation.invoke(); //后处理 System.out.println("MyInterceptor3 的后处理!"); return result; } }
三、拦截器api
1、放行
//放行 String result = invocation.invoke();
2、前后处理
//前处理 System.out.println("MyInterceptor3 的前处理!"); //放行 String result = invocation.invoke(); //后处理 System.out.println("MyInterceptor3 的后处理!");
3、不放行,直接跳转到一个结果页面
return SUCCESS;不执行后续的拦截器以及Action,直接交给Result处理结果,进行页面跳转
四、拦截器配置
步骤1:注册拦截器 --> 步骤2:配置拦截器栈 --> 步骤3:指定包中默认拦截器栈
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="inter" namespace="/" extends="struts-default" > <interceptors> <!-- 1.注册拦截器 --> <interceptor name="myInter3" class="cn.itcast.a_interceptor.MyInterceptor3"></interceptor> <!-- 2.注册拦截器栈 --> <interceptor-stack name="myStack"> <!-- 自定义拦截器引入(建议放在20个拦截器之前) --> <interceptor-ref name="myInter3"> <!-- 指定哪些方法不拦截 <param name="excludeMethods">add,delete</param> --> <!-- 指定哪些方法需要拦截 --> <param name="includeMethods">add,delete</param> </interceptor-ref> <!-- 引用默认的拦截器栈(20个) --> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 3.指定包中的默认拦截器栈 --> <default-interceptor-ref name="myStack"></default-interceptor-ref> <action name="Demo1Action_*" class="cn.itcast.a_interceptor.Demo1Action" method="{1}" > <!-- 为Action单独指定走哪个拦截器(栈) <interceptor-ref name="myStack"></interceptor-ref>--> <result name="success" type="dispatcher" >/index.jsp</result> </action> </package> <package name="tag" namespace="/" extends="struts-default" > <action name="Demo2Action" class="cn.itcast.b_tag.Demo2Action" method="execute" > <result name="success" type="dispatcher" >/tag1.jsp</result> </action> <action name="Demo3Action" class="cn.itcast.b_tag.Demo3Action" method="execute" > <result name="success" type="dispatcher" >/tag2.jsp</result> </action> </package> </struts>
如何定制拦截方法:
<!-- 指定哪些方法不拦截 --> <param name="excludeMethods">add,delete</param> <!-- 指定哪些方法需要拦截 --> <param name="includeMethods">add,delete</param>
全局结果集:
<!-- 定义全局结果集 --> <global-results> <result name="toLogin" type="redirect">/login.jsp</result> </global-results>