一、 拦截器概述
在AOP中用于某个方法或字段被访问之前,进行拦截然后再之前或之后加入某些操作。拦截是AOP的一种实现策略
二、 自定义拦截器——拦截器的创建
其拥有三种方式进行创建
方式一:实现Interceptor接口
//拦截器: 第一种创建方式
//拦截器生命周期: 随项目的启动而创建,随项目关闭而销毁
public class MyInterceptor implements Interceptor{}
方式二:继承AbstractInterceptor
只需要实现intercept方法即可
//拦截器: 第二种创建方式
//帮我们空实现了init和destroy方法,
public class MyInterceptor2 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
return null;
}
}
方式三:继承MethodFilterInterceptor
其需要定制哪些方法需要拦截,哪些方法不需要拦截
//拦截器: 第三种创建方式
//继承MethodFilterInterceptor
//功能定制拦截器拦截方法。
//定制哪些方法,intercept
//需要拦截。调用doIntercept方法
//定制哪些方法不需要拦截
public class MyInterceptor3 extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//前处理
System.out.println("MyInterceptor前处理");
//如何进行放行
invocation.invoke();
//后处理
System.out.println("MyInterceptor后处理");
return null;
}
}
方式三推荐,其中invocation.invoke为放行,如果不放行,直接跳转到一个结果页面,如:success页面或者error页面。不执行后续的拦截器以及Action,直接交给Result处理结果,进行页面跳转
三、 自定义拦截器——拦截器配置
1. 拦截器的配置
在struts.xml文件中完成的如下:
<interceptor name="myInterceptor" class="MyInterceptor3">
<param name="paramName">paramValue</param>
</interceptor>
上述语法中,name属性用来指定拦截器的名称,class属性用于指定拦截器的实现类,有时,在定义拦截器时需要传入参数,这时需要使用标签,其中name属性用来指定参数的名称,paramValue表示参数的值
2. 拦截器栈
在实际开发中,经常需要在Action执行前同时执行多个拦截动作。这时可以把多个拦截器组成一个拦截器栈。在使用时,可以将栈内多个拦截器当作一个整体来引用。当拦截器被附加到一个Action上时,在执行Action之前必须先执行拦截器栈中的每一个拦截器
如下:
<interceptors>
<interceptor name="myInterceptor" class="MyInterceptor3"></interceptor>
<!-- 注册拦截器栈 -->
<interceptor-stack name="mystack">
<!-- 自定义拦截器引入 -->
<!-- 引入默认的拦截器栈(20)个 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
3. 在指定保重设置默认拦截器/为Action单独指定哪个拦截器
<!-- 指定默认拦截器的栈 -->
<default-interceptor-ref name="mystack"></default-interceptor-ref>
<action name="Demo1Action_*" class="com.aiit.interceptor.Demo1Action" method="{1}" >
<!-- 为Action单独指定走哪个拦截器 -->
<!-- <default-interceptor-ref name="mystack"></default-interceptor-ref> -->
<result name="success" type="dispatcher" >/index.jsp</result>
</action>