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