引自http://emavaj.blog.163.com/blog/static/133280557201011945440749/
Struts2里面想定义个拦截器是非常简单的
只需要集成Struts2的抽象类
AbstractInterceptor
然后重写intercept方法,就可以完成拦截器
最后在struts.xml中配置上:
<interceptors>
<interceptor name="interceptorName" class="类路径"/>
</interceptors>
这样就可以在action中使用interceptor-ref来引用拦截器了
在此过程中,有一些问题是特别需要注意的
1) 拦截器的工作原理
invocation.invoke();
这一句就是拦截器的核心,调用下一个拦截器,最后执行Action 中的方法
invoke返回的String就是Action的结果
如果:
public String intercept(ActionInvocation invocation) throws Exception {
//....
return "login";
}
请求处理后返回命名为login的result. 拦截器中可以动态改变Action对应的result的值
拦截器不可以为http请求对应的对象添加属性:
invocation.getInvocationContext()(从而拿到request、session)从而放置额外的属性.
2) Action的前后拦截
如果能理解拦截器的意义,那么这个肯定是理解的
-------------- Action执行前拦截:
// ....你的逻辑
String re = invocation.invoke();
return re;
-------------- Action执行后拦截:
String re = invocation.invoke();
//....你的逻辑 (其中re的值可能被改变,从而导致result的走向不同)
return re;
3) 默认拦截器栈
许多个拦截器的一个组就是一个拦截器栈
Struts2的默认拦截器栈(defaultStack),可以说就是Struts2 大部分默认功能的实现代码
(参数获取,流处理,结果集)
如果你定义了一个自己的拦截器
之后你让你的Action使用到这个拦截器,而且仅使用了这个拦截器(也就是没有使用Struts2默认拦截器栈)
那么你的Action就丢失了所有Struts提供的默认功能(包括参数传递,流处理等等)
所以你选要的是,使用回Struts2的默认拦截栈,再加上你的拦截器
方法1,把你的拦截器并入默认拦截器中:
<interceptors>
<interceptor name="新拦截器" class="com.xxxxxxxx"/>
<interceptor-stack name="新默认拦截器(名字随便)">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="新拦截器"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="新默认拦截器"/>
方法2,你的Action同时使用多个拦截器(如果顺序有关系,注意顺序)
...略