以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. VIm vi 使用 汇总

    x 删除当前光标下的字符dw 删除光标之后的单词剩余部分.d$ 删除光标之后的该行剩余部分.dd 删除当前行. c 功能和d相同,区别在于完成删除操作后进入INSERT MODEcc 也是删除当前行, ...

  2. redirect模块的秘密

    所有的redirect记录都在config/url_directs下面, 但是某个node/edit的redirect记录只包含redirect到自己的记录,且不验证url的合理性. 现在比如,a跳转 ...

  3. Google V8扩展利器发布:v8-native-binding-generator

    用C++扩展Google V8很简单,但是类比较多时还是很烦的.前段时间开发cantk-runtime-v8时,我写了一个代码产生器v8-native-binding-generator,让扩展Goo ...

  4. Date的那一大堆事儿--1

    String perfTimeStr = "";// 统一设置日历格式 Calendar calendar = Calendar.getInstance(); calendar.s ...

  5. Windows 8 IIS配置PHP运行环境

    在Windows 8 的IIS(8.0)中搭建PHP运行环境: 一:安装IIS服务器 1.进入控制面板>>程序和功能>>打开或关闭Windows 功能,找到Internet信息 ...

  6. WLAN频段介绍-04

    ISM频段 ISM频段,此频段主要是开放给工业.科学.医学三个主要机构使用,该频段是依据美国联邦通讯委员会(FCC)所定义出来,并没有所谓使用授权的限制. 工业频段:美国频段为902-928MHz,欧 ...

  7. nodeschool.io 4

    ~~ MY FIRST ASYNC I/O! ~~ Write a program that uses a single asynchronous filesystem operationto rea ...

  8. 详细解读Jquery各Ajax函数

    $.get(),$.post(),$.ajax(),$.getJSON() 一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表,callba ...

  9. WebForm MapPageRoute 路由配置(转载)

    使用场景是:MVC 混合使用 WebForm,然后对 WebForm 进行路由配置 http://www.cnblogs.com/xishuai/archive/2015/02/26/web-form ...

  10. ABAP简单表维护的制作

    为了知识的积累,特作了个简单的表维护. 因为自己之前做dynpro程序的时候建了一个Tree node的表,所以就不在此重复.(在表的交付和维护页签中标的属性要是‘允许标准表维护的’) 直接Alt+U ...