struts2拦截器

引自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同时使用多个拦截器(如果顺序有关系,注意顺序)

...略

posted @ 2011-06-01 18:05  highriver  阅读(596)  评论(0编辑  收藏  举报