从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就更加要慎重使用。 |