以UserAction为例,当UserAction实现了ModelDriven接口之后,与该接口相关的默认配置的拦截器会在拦截请求之后判断该请求是将要被UserAction处理而且UserAction实现了ModelDriven接口,因此就会在执行UserAction的相应方法之前,调用getModel方法,将UserAction中的Model类(比如Use)r的对象(假设为u)压入ValueStack中,作为root对象。这时候如果提交的表单或者url中传值过来,比如username,password等,会直接赋值给u中的属性(达到了将属性存储在对象中,避免了在Controller中书写大量属性和getset方法,同时也避免了在传值的时候书写大量的u.XXXX,u.XXX造成理解困难和不直观)。

在S:debug显示的页面中,可以看到,此时一个User类在栈顶,属性为username和password(其值可以通过表单提交和url传递),栈顶下面是UserAction类,属性为u和model两个对User对象的引用,此时指向的是栈顶root中的User对象-----①。

然而,如果UserAction中对应--该请求的方法在getModel之后再将u指向另外一个User对象(UserAction中的model属性和u同时指向新对象,可以理解为如果之后再执行getModel方法,那么这个model指向的对象那个将被压入),那么这个对象不会被压入ValueStack,不会作为root对象,因此其属性不会被当做root对象属性,被不加#的直接取到viewer页面中。

此时,在view页面中,取u.username,却可以取到新对象的值,能取到值不难理解,但是为什么u现在不在root中,前面不用   #     就可以取到呢?原因是u.username在栈顶里面找不到,会在接下来里面找,找到之后就返回。

假设UserAction在被调用getModel方法之后,执行的方法中不是将u赋与一个新对象,而是用u.setUsername方法呢?那么因为①的原因,此时u指向的还是root对象,所以可以改变root中username的值的。达到更新的目的。

ModelDrivenInterceptor的源代码中可以看到有个refreshModelBeforeResult属性为false,如果设为true,则会在UserAction的方法调用之后,再调用一次getModel,如果此时u的指向有所改变,那么会把u新指向的对象压入栈中,达到更新的目的。

Struts2 的ModelDriven理解的更多相关文章

  1. 接触Struts2的ModelDriven<>接口

    最近在学SSH框架,实战项目,用到了Struts2的ModelDriven<>接口,在这做一点记录 ModelDriven,意为模型驱动,意思是直接把实体类当成页面数据的收集对象 参考他人 ...

  2. Struts2 之 modelDriven & prepare 拦截器详解

    struts2 ModelDriven & Prepareable 拦截器 前面对于 Struts2 的开发环境的搭建.配置文件以及 Struts2 的值栈都已经进行过叙述了!这次博文我们讲解 ...

  3. Struts2之ModelDriven的使用

    http://www.cnblogs.com/luoyanli/archive/2012/11/20/2778361.html 我们可以根据Action属性的不同将它分为两类:Field-Driven ...

  4. struts2之ModelDriven

    在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口.ModelDriven让你可以直接操作应 ...

  5. struts2重点——ModelDriven

    一.属性驱动 在目标 Action 类中,通过 setXxx() 方法来接收请求参数. 二.模型驱动 1.ParametersInterceptor 拦截器工作原理 ParametersInterce ...

  6. 关于struts2的modelDriven

    今天做毕业设计,前台往后台赋值,习惯性的用了modelDriven.但是刚写完就奇怪它的机理是怎样的,它怎么知道我前台传的参是哪个Model的属性(之前用servlet都是手动),于是手贱的ctrl点 ...

  7. Struts2中ModelDriven的使用

    它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动 (ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口, ...

  8. Struts2之ModelDriven和Preparable拦截器

    首先struts.xml文件配置如下 默认拦截器设置为paramsPrepareParamsStack <package name="default" namespace=& ...

  9. struts2之ModelDriven的用法

    在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口.ModelDriven让你可以直接操作应 ...

随机推荐

  1. icp算法基本思想

    Icp基本思想参考资料:http://www.cnblogs.com/jian-li/articles/4945676.html ,包括点-点,点-面的各种icp变种 Icp算法就是两个点云X.Y之间 ...

  2. js树目录结构

    jstree https://www.jstree.com/demo/ treejs http://www.treejs.cn/v3/demo.php#_206

  3. jquery 全选功能

    1.直接全选(复选框名字要统一) <input type="CHECKBOX" id="cbSelectAll" onclick="$('inp ...

  4. android AutoCompleteTextView和Spinner选中项加亮

    package com.example.spinnerexample; import java.util.ArrayList; import java.util.List; import androi ...

  5. TWaver HTML5 (2D)--基本概念

    基本概念 TWaver HTML5(以下简称TWaver)使用HTML5技术和javascript语言,可在支持HTML5的浏览器上进行绘图. 使用TWaver前,需熟悉几个基本概念:图元(Eleme ...

  6. 如何让div中的内容垂直居中

    虽然Div布局已经基本上取代了表格布局,但表格布局和Div布局仍然各有千秋,互有长处.比如表格布局中的垂直居中就是Div布局的一大弱项,不过好在千变万化的CSS可以灵活运用,可以制作出准垂直居中效果, ...

  7. python2 安装scrapy问题解决方法

    错误代码: build/temp.linux-x86_64-:: fatal error: openssl/opensslv.h: 没有那个文件或目录 compilation terminated. ...

  8. mvc json post执行顺序

    function GetFlightNo() {        var falg = false; var value = $("#No").val();        $.pos ...

  9. JSON 换行、JSON \r\n、怎么处理 ?(转载)

    参考地址: http://www.cnblogs.com/mamingbo/archive/2010/11/27/1889583.html 在最后json的字符串上:.Replace("\r ...

  10. JAVA 正则 Pattern 和 Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...