查看文章 |
Struts2中defaultStack的更改问题
2008-06-17 16:19
在Struts2中,默认的struts-default package中有一个defaultStack的拦截器堆栈,据我推断如果不配置则Struts2会默认执行这个堆栈里的拦截器。最近在做项目的时候遇到了这么一个问题,如果想向这个defaultStack中添加一个自定义的interceptor,那么针对两种情况会有不同的配置注意事项。 1. 使用经典的配置方式。 2. 使用annotation的配置方式,也就是所谓的'0'配置。 这两种情况在配置stack的时候有一点不同,第1种,可以配置如下, <package name="base-package" extends="struts-default"> <interceptors> <interceptor name="ajaxInterceptor" class="interceptors.AjaxInterceptor"></interceptor> <interceptor-stack name="defaultStack"> ... <interceptor-ref name="ajaxInterceptor" /> ... </interceptor-stack> </interceptors> </package> <package name="demo" extends="base-package" namespace="/demo"> <action name="BizAction_*" method="{1}" class="demo.BizAction"> <result name="input">/demo/BizEdit.jsp</result> <result name="list">/demo/BizList.jsp</result> </action> </package> 这个时候是不会出现问题的,在BizAction_*的调用过程中会调用到ajaxInterceptor。注意这里是直接更改defaultStack,而没有另外起名字。 第2种,如果根据如上的配置,是有问题的struts永远也不会调用到ajaxInterceptor,刚开始不明白为什么,其实现在也没太搞清楚原理,感觉无法自定义拦截器了,几乎崩溃,后来发现需要新增一个stack而这个stack的名字不能等于defaultStack,定义如下: <package name="base-package" extends="struts-default"> <interceptors> <interceptor name="ajaxInterceptor" class="interceptors.AjaxInterceptor"></interceptor> <interceptor-stack name="myStack"> ... <interceptor-ref name="ajaxInterceptor" /> ... </interceptor-stack> </interceptors> <default-interceptor-ref name="myStack"/> </package> Action的annotation配置: @ParentPackage("base-package") public class WLogAction{ } 这样等于是显式的告诉struts用一个全新定义的package,这样配置后就可以调用到ajaxInterceptor了。 |
最近读者: