`

修改struts2 的默认拦截器的参数 时的顺序问题

阅读更多
struts2 的默认拦截器的参数可以修改,比如打开exception拦截器的log功能,设定checkbox没有选择时的默认值等等,在使用过程中发现如果顺序不对,设定是无效的。
例如:
我想打开Exception的log,并且想重定义checkbox.uncheckedValue。
一开始是这么写的,defaultStack不动,在我自己定义的拦截器栈mydefault中重新定义。
			<!-- 自定义拦截器栈:名为mydefault -->
			<interceptor-stack name="mydefault">
				<!-- 自定义拦截器 -->
				<interceptor-ref name="message" />
				
				<!-- 自定义拦截器 -->
				<interceptor-ref name="authority" />

				<!-- 覆盖checkbox拦截器的属性,当页面上的checkbox没有被选择时,默认为0 -->
                                <!-- 打开log -->
				<interceptor-ref name="defaultStack">
					<param name="checkbox.uncheckedValue">0</param>
					<param name="exception.logEnabled">true</param>
					<param name="exception.logLevel">info</param>
				</interceptor-ref>
				
				<!-- 系统默认的拦截器 -->
				<interceptor-ref name="defaultStack" />
			</interceptor-stack>

这么设定看似没有问题,但是exception.logEnabled和exception.logLevel并没有生效。
如果把<interceptor-ref name="defaultStack" />这一行放在设定参数的前面,就会导致checkbox.uncheckedValue无效。

最后采用了重定义defaultStack,把log参数的重定义写在defaultStack中,如下所示:
<!-- 重新定义默认拦截器栈 -->
			<interceptor-stack name="defaultStack">
				<interceptor-ref name="exception">
                                        <!-- 重定义默认拦截器的参数 -->
					<param name="logEnabled">true</param>
					<param name="logLevel">info</param>
				</interceptor-ref>
				<interceptor-ref name="alias" />
				<interceptor-ref name="servletConfig" />
				<interceptor-ref name="prepare" />
				<interceptor-ref name="i18n" />
				<interceptor-ref name="chain" />
				<interceptor-ref name="debugging" />
				<interceptor-ref name="profiling" />
				<interceptor-ref name="scopedModelDriven" />
				<interceptor-ref name="modelDriven" />
				<interceptor-ref name="fileUpload" />
				<interceptor-ref name="checkbox" />
				<interceptor-ref name="staticParams" />
				<interceptor-ref name="params">
					<param name="excludeParams">dojo\..*</param>
				</interceptor-ref>

				<!-- 把ConversionError换成自己的 -->
				<interceptor-ref name="myConversionError" />
				<!-- 				<interceptor-ref name="conversionError" /> -->
				<interceptor-ref name="validation">
					<param name="excludeMethods">input,back,cancel,browse</param>
				</interceptor-ref>
				<interceptor-ref name="workflow">
					<param name="excludeMethods">input,back,cancel,browse</param>
				</interceptor-ref>
			</interceptor-stack>

然以把第一段代码中关于log参数重定义的部分去掉。这么一来,log和checkbox的参数都被重新定义了。

不知道为什么会这样,或许因为CheckboxInterceptor和ExceptionMappingInterceptor一个在struts2包中,一个在xwork包中的缘故吧。有时间再调查吧。
分享到:
评论
1 楼 cjh326419411 2013-04-12  
你上面肯定不行啊,你自己这么定义就覆盖了 struts2的默认拦截器

相关推荐

Global site tag (gtag.js) - Google Analytics