标签:struts2 modeldriven refreshmodelbeforere valuestack
已经和三大框架久违多时了,前段时间搞了一段时间的Android,各方面的知识都有所增长,但是框架的一些核心基础知识也忘得差不多了,在今后的时间里,我会不定期的发表框架中的一些基础知识的运用。
首先想介绍的是struts2的原型驱动ModelDriven机制。
所谓的ModelDriven,就是把一个实体类当成页面数据的收集对象。用法看起来像下面这个样子
<span style="font-size:14px;">public class UserAction implements ModelDriven{ private User user; @Override public Object getModel() { if(user == null){ user = new User(); } return user; } }</span>做法是利用ModelDriven机制,让UserAction实现一个ModelDriven接口,同时实现接口中的方法:getModel()
这个时候user就可以自动收集页面中传过来的数据。
那么 ModelDriven背后的机制到底是什么?
ModelDriven背后的机制其实就是ValueStack。界面中传过来的数据能够被直接赋值给user对象,这就说明user对象是ValueStack中的根对象(Root对象)!
那么,user对象什么时候出现在valueStack中并且为什么会出现在valueStack中呢?
一切原因源自于ModelDrivenInterceptor。ModelDrivenInterceptor是缺省的拦截器链(struts-default)的一部分,当一个请求经过ModelDrivenInterceptor的时候,在这个拦截器中,会判断当前要调用的Action对象是否实现了ModelDriven接口,如果实现了这个接口,则调用getModel()方法,并把返回值压入ValueStack。
请看以下ModelDrivenInterceptor一部分源码:
<span style="font-size:14px;"> @Override public String intercept(ActionInvocation invocation) throws Exception { Object action = invocation.getAction(); if (action instanceof ModelDriven) { //判断是否是原型驱动的实现类 ModelDriven modelDriven = (ModelDriven) action; ValueStack stack = invocation.getStack(); //拿到值栈对象 Object model = modelDriven.getModel(); //获得原型对象 if (model != null) { stack.push(model); //<span style="color:#FF0000;"><strong>注意:只有当原型对象不为null的时候,才会被压入栈顶。</strong></span> } if (refreshModelBeforeResult) { //<span style="color:#FF0000;"><strong>这是个很有用处的地方,下面会降到</strong></span> invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model)); } } return invocation.invoke(); }</span>
<span style="font-size:14px;"> public class UserAction implements ModelDriven{ private User user; @Override public Object getModel() { if(user == null){ user = new User(); } return user; } public String update(){ user = new UserManager().findUserById(user.getId()); </span><pre name="code" class="java"><span style="font-size:14px;"> user.setUsername("old");</span>return "update"; }
<span style="color:#333333;"> public void beforeResult(ActionInvocation invocation, String resultCode) { ValueStack stack = invocation.getStack(); CompoundRoot root = stack.getRoot(); boolean needsRefresh = true; Object newModel = action.getModel(); // Check to see if the new model instance is already on the stack for (Object item : root) { if (item.equals(newModel)) { needsRefresh = false; break; } } // Add the new model on the stack if (needsRefresh) { // Clear off the old model instance if (originalModel != null) { root.remove(originalModel); } if (newModel != null) { stack.push(newModel); } } }</span>
struts2回顾之一:ModelDriven机制中的refreshModelBeforeResult属性,布布扣,bubuko.com
struts2回顾之一:ModelDriven机制中的refreshModelBeforeResult属性
标签:struts2 modeldriven refreshmodelbeforere valuestack
原文地址:http://blog.csdn.net/andywuchuanlong/article/details/27374201