Struts2 的ModelDriven理解
以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理解的更多相关文章
- 接触Struts2的ModelDriven<>接口
最近在学SSH框架,实战项目,用到了Struts2的ModelDriven<>接口,在这做一点记录 ModelDriven,意为模型驱动,意思是直接把实体类当成页面数据的收集对象 参考他人 ...
- Struts2 之 modelDriven & prepare 拦截器详解
struts2 ModelDriven & Prepareable 拦截器 前面对于 Struts2 的开发环境的搭建.配置文件以及 Struts2 的值栈都已经进行过叙述了!这次博文我们讲解 ...
- Struts2之ModelDriven的使用
http://www.cnblogs.com/luoyanli/archive/2012/11/20/2778361.html 我们可以根据Action属性的不同将它分为两类:Field-Driven ...
- struts2之ModelDriven
在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口.ModelDriven让你可以直接操作应 ...
- struts2重点——ModelDriven
一.属性驱动 在目标 Action 类中,通过 setXxx() 方法来接收请求参数. 二.模型驱动 1.ParametersInterceptor 拦截器工作原理 ParametersInterce ...
- 关于struts2的modelDriven
今天做毕业设计,前台往后台赋值,习惯性的用了modelDriven.但是刚写完就奇怪它的机理是怎样的,它怎么知道我前台传的参是哪个Model的属性(之前用servlet都是手动),于是手贱的ctrl点 ...
- Struts2中ModelDriven的使用
它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动 (ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口, ...
- Struts2之ModelDriven和Preparable拦截器
首先struts.xml文件配置如下 默认拦截器设置为paramsPrepareParamsStack <package name="default" namespace=& ...
- struts2之ModelDriven的用法
在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口.ModelDriven让你可以直接操作应 ...
随机推荐
- javascript强制转换详解
转换成数值 Number函数强制转换成数值 数值->转换成原来的值 字符串->如果可以解析为数值,则转换成数值:否则转换成NaN或者0 true->1,falSe->0 und ...
- 【转】 C++中的new VS C语言中的malloc
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 前几天一个朋友去面试百度空间的一个职位,被问及这个问题,我听后说了几点,不过感觉还是不透彻,所以上网查阅了一些资 ...
- windows+tomcat 7配置二级域名访问其他web程序
1.在域名管理中做好二级域名的解析 2.在tomcat的server.xml中增加如下: <Host name="wx.ai77.cn" debug="0" ...
- python 练习 10
#!/usr/bin/python # -*- coding: UTF-8 -*- i = int(raw_input('净利润:')) arr = [1000000,600000,400000,20 ...
- CentOS 6.x安装配置
简述 VMware可以创建多个虚拟机,每个虚拟机上都可以安装各种类型的操作系统.安装方法也有很多种.下面,主要以ISO镜像安装为例,介绍CentOS 6.x的安装过程及相关的参数设置. 简述 创建虚拟 ...
- [转载]Badboy使用教程
Badboy-系列教程-资料整理: Badboy自动化测试工具1 界面介绍 http://leafwf.blog.51cto.com/872759/1107079 Badboy自动化测试工具2 录制 ...
- Linux基础:Grep查询&AWK查询
Grep:搜索文件内匹配指定内容的行 常用的Grep搜索方法: 1. grep "普通搜索内容" file( 或者 cat file|grep "普通搜索内容" ...
- UITabBarController加载之后不显示sub view controller
原代码: fileprivate func createSubiewControllers() { let newsVC = NewsViewController() let newsItem = U ...
- 221. Maximal Square -- 矩阵中1组成的最大正方形
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and re ...
- Checked 和 UnChecked 异常 的使用场合
异常的概念 任何的异常都是Throwable类(为何不是接口??),并且在它之下包含两个子类Error / Exception,而Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的 ...