ValueStack、Preparable、ModelDriven的关系

 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的原因。
  • 流程如下:
    1. params拦截器首先给action中的相关参数赋值,如id
    2. prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象
    3. modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的
    4. params拦截器再将参数赋值给model对象
    5. 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放到栈顶的对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值