Preparable 拦截器
- Struts 2.0 中的 modelDriven 拦截器负责把 Action 类以外的一个对象压入到值栈栈顶
- 而 prepare 拦截器负责准备为 getModel() 方法准备 model
PrepareInterceptor拦截器用方法
- 若 Action 实现 Preparable 接口,则 Action 方法需实现 prepare() 方法
- PrepareInterceptor 拦截器将调用 prepare() 方法,prepareActionMethodName()方法 或 prepareDoActionMethodName ()方法
- PrepareInterceptor 拦截器根据 firstCallPrepareDo 属性决定获取 prepareActionMethodName 、prepareDoActionMethodName的顺序。默认情况下先获取 prepareActionMethodName (), 如果没有该方法,就寻找prepareDoActionMethodName()。如果找到对应的方法就调用该方法
- PrepareInterceptor 拦截器会根据 alwaysInvokePrepare 属性决定是否执行prepare()方法
使用 paramsPrepareParamsStack 拦截器栈
- paramsPrepareParamsStack 从字面上理解来说, 这个stack的拦截器调用的顺序为:首先 params,然后 prepare,接下来 modelDriven,最后再 params
- Struts 2.0的设计上要求 modelDriven 在 params 之前调用,而业务中prepare要负责准备model,准备model又需要参数,这就需要在 prepare之前运行params拦截器设置相关参数,这个也就是创建paramsPrepareParamsStack的原因。
- 流程如下:
- params拦截器首先给action中的相关参数赋值,如id
- prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象
- modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的
- params拦截器再将参数赋值给model对象
- action的业务逻辑执行
取消prepare()方法
在struts.xml中配置:
<interceptors>
<interceptor-stack name="sshStack">
<interceptor-ref name="paramsPrepareParamsStack">
<!-- 使得struts默认拦截器不调用prepare方法 -->
<param name="prepare.alwaysInvokePrepare">false</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 使用新的拦截器栈 -->
<default-interceptor-ref name="sshStack"></default-interceptor-ref>
总结:
prepare是为getModel对象准备对象的
顺序:
1. params拦截器把request的参数赋给栈顶的Action
2. 然后prepare拦截器,为getModel()方法准备Model对象
3. getModel返回的对象置于栈顶,
4. params拦截器把request的参数再赋值给getModel放到栈顶的对象