ModelDriven,prepare拦截器和paramsPrepareParamsStack栈

来源:互联网 发布:西安航空学院网络教育 编辑:程序博客网 时间:2024/06/05 04:27
一、为什么使用ModelDriven拦截器?
①在我们struts2的企业级开发中,把Action和Model清晰的隔离开是很有必要的。有些Action不代表任何Model对象,它们的功能仅限于显示服务。把动作对象和model模型隔离开说明我们的模型对象不能再是动作对象的实例,那么我们如何让提交的参数映射到model对象里面去呢?那就要使用modeldriven拦截器。
②实现了modeldriven拦截器的Action类需要实现getModel()方法。当用户触发动作时,ModelDriven会调用相应Action动作对象的getModel()方法,并且把getModel()方法返回的model对象压入到值栈中的Object stack的栈顶。那么Parameter拦截器将会将页面提交的参数映射到栈顶的模型对象相应的属性当中去,如果某个参数模型对象中没有与之匹配的属性,那么将从栈顶的下一个对象中继续找与之匹配的属性并且映射到相应的属性中去。

二、那么为什么需要使用Preparable拦截器呢?
①struts2的ModelDriven的getModel()方法返回一个model对象,ModelDriven将该对象压入到栈顶中去,而这里的Preparable拦截器则负责为我们的getModel()方法准备model对象。
②实现了Preparable接口的Action类需要实现prepare()方法。但是在执行prepare()方法之前,struts尝试执行prepare[ActionMethodName]()方法,若prepare[ActionMethodName]()方法不存在,那么尝试执行下一个prepareDo[ActionMethodName]方法,如果也不存在就都不执行。最后再执行prepare()方法。这里需要说明的是,加入我们的Action中有一个处理action请求的add()方法,在Action类中添加prepareAdd()或者prepareDoAdd()方法,那么就可以通过该方法来为当前的Action准备模型对象并压入到栈顶,是的传过来的参数成功映射到model对象中去。
③我们可以通过设置PrepareInterceptor拦截器的alwaysInvokePrepare属性来告诉struts是否执行prepare()方法。默认是执行prepare()方法的。如果想要设置不执行prepare()方法,方法如下:

三、paramsPrepareParamsStack栈有什么作用呢?
①paramsPrepareParamsStack是用来设置action请求时执行拦截器的循序。从字面上理解来说,这个stack的拦截器调用拦截器的顺序是为如下:


②struts2设计时将modeldriven拦截器放到了params拦截器之前。这里参数就能成功的设置到栈顶的model对象当中去,但是在prepare拦截器准备model对象时有需要某些提交过来的参数,那么就需要在执行modeldriven之前再执行一次params拦截器,这就是设置拦截器栈paramsPrepareParamsStack的原因。
③根据paramsPrepareParamsStack的拦截器顺序我们可以看出其重要的几个流程如下:
1)当发出action请求时,struts2创建一个对应的Action类放到栈顶,第一个params拦截器将特定的属性映射到Action对象中去。
2)prepare拦截器根据Action中的某些属性来准备model对象。
3)modelDriven拦截器将准备好的model对象压入到值栈的栈顶。
4)params拦截器再将参数映射到栈顶的model对象中去。
5)执行Action类中的action请求对象的方法。

四、若Action实现了Preparable拦截器接口paramsPreparParamsStack的流程
params ->prepar-> modelDriven -> params
1. params拦截器首先给action中的相关参数赋值,如id
2. prepare拦截器执行prepare方法,prepare方法中会根据参数,如id,去调用业务逻辑,设置model对象
Action 方法需实现 prepare() 方法
PrepareInterceptor 拦截器将调用 prepare() 方法,prepareActionMethodName()方法 或 prepareDoActionMethodName ()方法
PrepareInterceptor 拦截器根据 firstCallPrepareDo 属性决定获取 prepareActionMethodName 、prepareDoActionMethodName的顺序。
默认情况下先获取 prepareActionMethodName (), 如果没有该方法,就寻找prepareDoActionMethodName()。如果找到对应的方法就调用该方法
PrepareInterceptor 拦截器会根据 alwaysInvokePrepare 属性决定是否执行prepare()方法.
可以为每一个 ActionMethod 准备 prepare[ActionMethdName] 方法, 而抛弃掉原来的 prepare() 方法
将 PrepareInterceptor 的 alwaysInvokePrepare 属性置为 false, 以避免 Struts2 框架再调用 prepare() 方法.
3. modelDriven拦截器将model对象压入value stack,这里的model对象就是在prepare中创建的
4. params拦截器再将参数赋值给model对象
阅读全文
0 0
原创粉丝点击