1.paramsPrepareParamsStack拦截器栈:
paramsPrepareParamsStack 从字面上理解来说, 这个stack的拦截器调用的顺序为:
首先 params,然后 prepare,接下来 modelDriven,最后再 params
Struts 2.0的设计上要求 modelDriven 在 params 之前调用,而业务中prepare要负责准备model,
准备model又需要参数,这就需要在 prepare之前运行params拦截器设置相关参数,
这个也就是创建paramsPrepareParamsStack的原因。
2. •流程如下:
2.1 params拦截器首先给action中的相关参数赋值,如id
2.2 prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象
2.3 modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的
2.4 params拦截器再将参数赋值给model对象
2.5 action的业务逻辑执行
3. 特点:相对于struts2默认的拦截器栈,在modelDriven拦截器之前存在一个params拦截器,后面还有一个params拦截器
所以就可以在modelDriven拦截器创建实现改接口的对象,并将该对象压入值栈顶部之前,获取请求参数来进行判断。
<interceptor-stack name="paramsPrepareParamsStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
<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>
4.例子:
注意需要再struts-xml中配置默认的拦截器栈:
<package name="testUser" extends="struts-default">
<default-interceptor-ref name="paramsPrepareParamsStack"></default-interceptor-ref>
<action name="emp-*" class="com.lishenhuan.action.EmpAction" method="{1}">
<result name="{1}">/emp-{1}.jsp</result>
<result name="delete" type="redirectAction">emp-list</result>
<result name="save" type="redirectAction">emp-list</result>
</action>
</package>
2.1 浏览器请求: http://localhost:8080/struts2-5/emp-edit?id=1001
2.2 得到第一个params拦截器,此时栈顶对象时Action,所以把参数中对应的属性赋值给Action
public void setId(Integer id) {
this.id = id;
}
2.3 接着到modelDriven拦截器
@Override
public Employee getModel() {
//没有id参数
if(id == null)
this.emp = new Employee();
else
//有id参数
this.emp = dao.get(id);
return emp;
}