先是正常的拦截器配置(struts.xml中配置):
<package name="GumiAction" extends="struts-default"> <!-- 声明拦截器、注册拦截器--> <interceptors> <interceptor name="TestInterceptor" class="com.Vocaloid.Kaito.Interceptor.TestInterceptor"></interceptor> <interceptor name="Test2Interceptor" class="com.Vocaloid.Kaito.Interceptor.Test2Interceptor"></interceptor> <interceptor name="Test3Interceptor" class="com.Vocaloid.Kaito.Interceptor.Test3Interceptor"></interceptor> </interceptors> <action name="i18nAction" class="com.Vocaloid.Kaito.Action.I18nAction" method="i18nLogin"> <interceptor-ref name="Test3Interceptor"> <param name="excludeMethods">i18nLogin</param> </interceptor-ref> <interceptor-ref name="Test2Interceptor"> </interceptor-ref> <interceptor-ref name="TestInterceptor"> </interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> <result name="success">/Jsp/i18nSuccess.jsp</result> </action> </package>
为了追踪方法调用顺序,我在每个可能被调用的方法前加了信息输出。此时的输出信息为:
可见,excludeMethods正常工作,排除了Test3Interceptor拦截器。
下面问题来了,如果我要让excludeMethods起作用,按设想,应该是我写在哪个拦截器上,在调用I18nAction方法时就排除哪个拦截器。可当我把excludeMethods写到Test2Interceptor或者TestInterceptor时,智能强大的idea直接给我报了红色的错误:
虽说xml文件有时即使报错也可以启动项目并正确执行,不过这一次好像没那么简单:
尽管Tomcat启动了,不过在启动时就报错了。
那测试一下实际效果:
很遗憾,Test2Interceptor并没有被排除成功。同样的TestInterceptor也没能生效。
一开始以为是拦截器声明的顺序问题,不过即使改了声明顺序或者在action中的使用顺序,仍然无法起作用。那么问题出在哪里呢?
经过反复尝试以后发现,原来问题出在拦截器的定义上。
自定义的拦截器类有三种实现方式:
1、实现接口Interceptor (implements Interceptor);
2、继承抽象类AbstractInterceptor (extends AbstractInterceptor );
3、继承MethodFilterInterceptor (extends MethodFilterInterceptor);
excludeMethods这个参数,只能用于继承MethodFilterInterceptor 类的拦截器上。如果用于其他两种定义方式定义的拦截器,则在框架启动时会报ognl.NoSuchPropertyException的异常。从名字就可以看出,这两类拦截器上根本没有excludeMethods这样的参数(NoSuchProperty)。
感慨一下idea果然还是很强大啊,用myeclipse和eclipse的同学,完全看不到这样的红色错误提示啊(滑稽)。
至于这三种类定义的拦截器有什么区别嘛。。。。别问我我也不知道- -反正现在用Struts2的貌似也不多了,大概了解一下,为以后学新框架做铺垫就好wwwwww