标签: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