从struts拦截器说起

truemylife 2010-01-22
    struts2拦截器是aop思想的一种实现,struts2绝大部分思想源于xworks,与spring的设计思路也比较一致,与spring成为java建站时被广泛采用的开源框架。
    struts2相对于xworks,对于拉截器的使用显的更加隐式,webwork还是有很多拦截器需要开发人员自己配置。比如struts对页面数据的转换,对数据的校验,对数据的初始化都使用了拦截器,但却可以不用显式的配置。虽然给开发人员减少了一些工作,但也让开发人员少了一份对拦截器的理解。
   struts2提供了十几种拉截器,这里介绍三种拦截器:
1、validator拦截器,采用validation验证框架时,默认加载此拦截器进行验证。
2、prepare、prepareFunc,prepare会在任何struts转向方法前,被执行;prepareFunc会在func方法执行之前被执行,用于初始化数据。
3、paramsPrepareParamsStack拦截器,需要显示的配置;使用此拦截器,可以调高拦截器的优先顺序,从而为下一级拦截器提供参数。
   一个验证过程,默认的是prepareFunc->paramsPrepareParamsStack->validator;而在prepareFunc里,如果需要回传参数,按默认的顺序将得不到参数值,此时需要手动显式的配置paramsPrepareParamsStack,如下代码
<action name="save" class="xxxAction" method="save">
    		<interceptor-ref name="paramsPrepareParamsStack" />
    		<result name="input">/WEB-INF/templates/questions/input.ftl</result>
    	</action>


这样把拦截器顺序调整为paramsPrepareParamsStack->prepareFunc->validator,这时候在prepareFunc可以获取参数。
  
    struts2在验证不通过时,只回显能提交回action部分的数据,而页面除了这部分数据外,可能存在大量只作附且显示,但不提交回来的数据,这时候采用validation验证时,可以需要准备较多的初始化数据,这些数据可以封装在prepareFunc方法里,如果prepareFunc需要传入参数,那么就需要上述的paramsPrepareParamsStack配置。感觉上还不是最好的解决办法,因为方法func只有在出错的时候,才需要prepareFunc以防止return INPUT时出错,而在成功的时候,大多数都是跳转到别的页面,并不需要prepareFunc加载的数据,目前也没找到更好的办法,而prepare就更加要慎重使用。
Global site tag (gtag.js) - Google Analytics