struts2默认的拦截器为何会失效
发表于:2007-05-17 | 零回复

  这几天一直没有更新blog,主要是将tycho整个框架升了一下级。由原来的jdk1.4升级为jdk6.0,velocity1.4升级为1.5,struts1.29升级为struts2.0.5,spring1.2.9升级为spring2,还有hibernate2升级为hibernate3。从头到脚的翻新了一遍。级升过程中,最为复杂的要属struts了。复杂其实并不是说它的结构,而是改动的地方实在太多。使用过struts2的朋友都应该道知,struts2其实就是webwork的下一个版本,运用了面向方面的思想。在这个版本当中,struts自身保留下来的东西实在是少之又少。一直以来我都没有学习过webwork,这次将系统升级到struts2,着实费了不少功夫。

  即然升级到struts2,那就应该充分利用面向方面这一思想(虽然方面与对象存在着冲突,但在某些场合的确比对象更为合适一些),自定义了一些拦截器,用来完成某些方面的应用。其实struts2自身也有许多功能是通过拦截器完成的。如:效验(validation)。拦截器虽然有用,但是,当在配置中加入自定义的拦截器后,struts2自身的拦截器失效。struts2对拦截器的处理流程是这样的:当配置中声明了拦截器,那么仅执行该拦截器,若没有声明,将执行默认的拦截器“defaultStack”。由此可知,struts2的拦截器失效是因为我们自定义的拦截器覆盖了它自身的拦截器所造成的。解决方法很简单,可以配置一个拦截器栈,并将defaultStack配置进去即可。如下:

  1. <interceptors>   
  2.     <!– 自定义拦截器 –>   
  3.     <interceptor name="noLogin" class="com.mxjava.tycho.servlet.interceptor.NoLoginInterceptor"/>   
  4.     <!– 拦截器栈 –>   
  5.     <interceptor-stack name="appStack">   
  6.         <interceptor-ref name="noLogin"/>   
  7.         <!– struts2自身拦截器 –>   
  8.         <interceptor-ref name="defaultStack"/>   
  9.     </interceptor-stack>   
  10. </interceptors>   
  11. <action name="login" class="LoginAction">   
  12.     <!– 配置拦截器栈 –>   
  13.     <interceptor-ref name="appStack"/>   
  14.     <result type="velocity">/vms/user/login.vm</result>   
  15.     <result name="login" type="redirect-action">index.htm</result>   
  16. </action>  

评论留言