拦截器体系是struts2框架的重要组成部分。
param拦截器负责解析HTTP请求参数,并设置Action的属性
servlet-config拦截器直接将HTTP请求中的HttpServletRequest实例和HttpServletResponse实例传给Action
fileUpload拦截器负责解析请求参数中的文件域,并将文件域设置成Action的三个属性。
struts2工作原理
这张图的FilterDispatcher是struts2.0-2.1(应该是)的版本,现在使用的是StrutsPrepareAndExecuteFilter。当他拦截到用户请求之后,大量拦截器对用户请求进行处理。
StrutsPrepareAndExecuteFilter会初始化一个ActionProxy实例,并调用他的execute方法。拦截器方法会先拦截,并处理用户请求,然后到Action的execute方法处理用户请求,最后返回逻辑视图资源呈现给用户。
配置拦截器
<interceptor name="拦截器名" class="拦截器实现类"/>
可以传入相关参数 要有setter方法。
<interceptor name="拦截器名" class="拦截器实现类">
<param name="参数名">参数值</param>
</interceptor>
配置拦截器栈
<interceptor-stack name="拦截器栈名">
<interceptor-ref name="拦截器一"/>
<interceptor-ref name="拦截器二"/>
</interceptor-stack>
自己开发拦截器类,应该实现Intercepto接口,接口定义
public interface Interceptor extends Serializable{
//销毁该拦截器之前的回调方法
void destroy();
//初始化该拦截器的回调方法
void init();
//拦截器实现拦截的逻辑方法
String intercept(ActionInvocation invocation ) throws Exception;
}
自定义一个拦截器
public class SimpleInterceptor extends AbstractInterceptor {
//拦截器的名字
private String name;
//为该拦截器设置名字的setter方法
public void setName(String name){
this.name = name;
}
public String intercept(ActionInvocation invocation) throws Exception {
// 取得被拦截的Action实例
LoginAction action = (LoginAction)invocation.getAction();
// 打印执行开始的时间
System.out.println(name + " 拦截器的动作---------" +
"开始执行登录Action的时间为:" + new Date());
// 取得开始执行Action的时间
long start = System.currentTimeMillis();
// 执行该拦截器的后一个拦截器
// 如果该拦截器后没有其他拦截器,则直接执行Action的被拦截方法
String result = invocation.invoke();
// 打印执行结束的时间
System.out.println(name + " 拦截器的动作---------" +
"执行完登录Action的时间为:" + new Date());
long end = System.currentTimeMillis();
System.out.println(name + " 拦截器的动作---------" +
"执行完该Action的时间为" + (end - start) + "毫秒");
return result;
}
}
拦截器执行顺序(补充:2016-11-27)
在Action的控制方法执行之前,位于拦截器链前面的拦截器将先发生作用;在Action的控制方法执行之后,位于拦截器链前面的拦截器将后发生作用。(图上的拦截器123 321 就是这么回事,,)
struts.xml配置
<interceptors>
<interceptor name="mySimple" class="org.crazyit.app.interceptor.SimpleInterceptor">
<param name="name">简单拦截器</param>
</interceptor>
</interceptors>
<action name="login" class="org.crazyit.app.action.LoginAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="mySimple">
<param name="name">改名后的拦截器</param>
</interceptor-ref>
<result>/WEB-INF/content/welcome.jsp</result>
<result name="error">./welcome.jsp</result>
</action>
以上是关于实现普通拦截继承AbstractInterceptor。
实现拦截方法是继承MethodFilterInterceptor
1.拦截方法
继承MethodFilterInterceptor 重写doIntercept
配置文件中传入参数有2中 1种拦一种不拦
<param name="excludeMethods">execute</param> <!--拦-->
setExcludeMethods 不拦 setIncludeMethods 拦
2.普通拦截
继承AbstactInterceptor 重写intercept
拦截器将在execute方法执行之前之后的动作都定义在拦截器intercept方法中,
监听器也可注册在拦截器中,只要拦截器起作用的地方,监听器都会触发。brforeResult方法在intercept的Result之前执行的动作。