以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. 例题:for循环迭代法。一个棋盘有n个格子,第一个格子有一粒米,第二个格子有两粒米,第三个格子有四粒米,依次类推,第n个格子里有多少粒米,棋盘里一共有多少粒米。

    decimal a = 1;//定义初始值,decimal可以定义比较长的数值            decimal sum = 1;            Console.WriteLine(&qu ...

  2. c语言数据结构:01背包问题-------动态规划

    两天的时间都在学习动态规划:小作业(01背包问题:) 数据结构老师布置的这个小作业还真是让人伤头脑,自己实在想不出来了便去网上寻找讲解,看到一篇不错的文章: http://www.cnblogs.co ...

  3. js时间差转为天数

    function DateDiff(sDate1, sDate2){ //sDate1和sDate2是2006-12-18格式 var aDate, oDate1, oDate2, iDays aDa ...

  4. 20145218 《Java程序设计》第04次实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.22 实验名称:Android开发基础 一.实验内容 1.基于Android ...

  5. [hadoop] 集群启动和内存调优

    1.启动Hadoop集群 #首先查看下zoo.cfg里面配置的server.id和集群主机的id是否一致 #如果不一致会造成yarn控制不了从节点的启动 cat /home/hadoop/zookee ...

  6. win7开启硬盘AHCI

    问题描述:装win7的时候没有在AHCI模式下安装,而是在IDE模式下安装的,后来安装完毕以后想更改成AHCI模式,可是更改以后启动电脑蓝屏并重启 解决方法: 如果是在IDE模式下安装的系统,由于在安 ...

  7. hdu----(1599)最大子矩阵(几何/dp)

    最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  8. js 时间处理

    1.格式化时间 function GetDateTimeFormatter(value) {        if (value == undefined) {            return &q ...

  9. 368. Largest Divisible Subset -- 找出一个数组使得数组内的数能够两两整除

    Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of ...

  10. mouseover和mouseout多次触发解决方法(兼容ie和firefox)(转)

    在用到mouseover和mouseout事件来作为事件触发的条件,但是如果我们用做触发的元素内部有其他的元素的时候当鼠标移上的时候会反复的触发mouseover和mouseout事件,如导致菜单闪烁 ...