在Struts 2中,提供了另外一种直接使用领域对象的方式,就是让action实现com.opensymphony. xwork2.ModelDriven接口。ModelDriven让你可以直接操作应用程序中的领域对象(模型对象),允许你在Web层和业务逻辑层使用相同的对象。

ModelDriven接口中只有一个方法,如下:

@override
public T getModel();

该方法返回一个用于接收用户输入数据的模型对象。

在页面中,这个模型对象中的属性可以直接通过属性名来访问(如username),而不需要使用形如“user.username”这种格式的表达式,在action中也不需要为这个模型对象提供JavaBean风格的getter和setter方法。但是必须要在action中进行new操作,ModelDriven要使用泛型。

下面我们让在3.1节创建的LoginAction类实现ModelDriven接口,修改后的代码如例3-7所示。

例3-7 LoginAction.java

  1. package org.sunxin.struts2.ch03.action;
  2. import org.sunxin.struts2.ch03.model.User;
  3. import com.opensymphony.xwork2.Action;
  4. import com.opensymphony.xwork2.ModelDriven;
  5. public class LoginAction implements Action,ModelDriven<User>
  6. {
  7. private User user = new User();
  8. @Override
  9. public String execute() throws Exception
  10. {
  11. //省略
  12. }
  13. @Override
  14. public User getModel()
  15. {
  16. return user;
  17. }
  18. }

修改login.jsp,修改后的代码如例3-8所示。

例3-8 login.jsp

  1. <form action="login.action" method="post">
  2. <table>
  3. <tr>
  4. <td>用户名:</td>
  5. <td><input type="text" name="username"></td>
  6. </tr>
  7. <tr>
  8. <td>密码:</td>
  9. <td><input type="password" name="password"></td>
  10. </tr>
  11. <tr>
  12. <td><input type="reset" value="重填"></td>
  13. <td><input type="submit" value="登录"></td>
  14. </tr>
  15. </table>
  16. </form>

LoginAction实现了ModelDriven接口,表单字段就不需要再使用“user.”前缀了。

修改success.jsp,修改后的代码如例3-9所示。

例3-9 success.jsp

  1. <body>
  2. <h3><s:property value="username" />,欢迎您登录程序员之家网站(www.sunxin.org)。</h3>
  3. </body>

那么什么时候应该直接使用领域对象,什么时候应该实现ModelDriven接口呢?

这两种方式实际上并没有本质的区别,对于大多数的应用,使用任何一种方式都可以。

此外,注意区别field-driven/model-driven:

field-driven:
属性驱动,action拥有自己的属性,这些属性一般是java的基本类型,并且提供属性的getter和setter方法。表单字段直接和action的属性对应。

private UserModel um;
public void setUm(UserModel um){
this.um = um;
}
public UserModel getUm(){
return this.um;
}

在jsp页面中,id:<input type=“text” name=“um.id”>  中间的um.id就是基于field-driven取值的。

model-driven:
实现了ModelDriven接口可以在action中直接获得例如User对象,它会将表单字段自动封装到所需对象(如User)里去。使用ModelDriven必须实现泛型的getModel方法,并实现泛型实例。

public class GroupAction implements ModelDriven<Group>{
private Group group;
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
@Override
public Group getModel() {
if(group==null) group = new Group();
return group;
}
public String addInput() {
//处理
return "success";
}
}

http://blog.csdn.net/heyutao007/article/details/5980607

加深理解可以再看:

http://www.cnblogs.com/Topless/archive/2012/01/17/2324980.html

区别field-driven/model-driven:

http://blog.sina.com.cn/s/blog_8b3c701b010103it.html

struts2之ModelDriven的更多相关文章

  1. 接触Struts2的ModelDriven<>接口

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

  2. struts2重点——ModelDriven

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

  3. 关于struts2的modelDriven

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

  4. Struts2中ModelDriven的使用

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

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

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

  6. Struts2之ModelDriven和Preparable拦截器

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

  7. struts2之ModelDriven的用法

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

  8. Struts2之ModelDriven的使用

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

  9. Struts2中ModelDriven的陷阱及其预防

    页面表单 <form action="updateInput.action" method="post"> <input type=" ...

随机推荐

  1. 手动实现一个vue的mvvm,思路解析

    1.解析dom.fragment编译,初始化new watcher 2 ,数据劫持,Object.defineProperty(obj,key,{ configurable:true,// 可以配置 ...

  2. elasticsearch 深入 —— 近似匹配

    近似匹配 使用 TF/IDF 的标准全文检索将文档或者文档中的字段作一大袋的词语处理. match 查询可以告知我们这大袋子中是否包含查询的词条,但却无法告知词语之间的关系. 思考下面这几个句子的不同 ...

  3. 阿里云LNMP环境安装

    文档里有一键部署LNMP环境和手动搭建LNMP环境您看下 镜像部署 LNMP 环境:https://help.aliyun.com/document_detail/25427.html?spm=517 ...

  4. Java虚拟机(JVM)与垃圾回收机制(GC)的详解

    一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时 ...

  5. Sass-@each

    @each 循环就是去遍历一个列表,然后从列表中取出对应的值. @each 循环指令的形式: @each $var in <list> 如果你没有接触过列表,也不要紧,他也非常简单. 在下 ...

  6. 如何改变string中的字符值?

    string本身是不可变的,因此要改变string中字符,需要如下操作: str := “hello world” s := []byte(str) s[] = ‘o’ str = string(s) ...

  7. STM32中stm32f0xx_flash.icf文件的作用详解!(不错的!)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/weibo1230123/article/details/80142210 每个芯片开发商都会针对每款 ...

  8. Graphics 绘图

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力. Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形等 ...

  9. Java Web学习总结(2)Servlet(一)

    一,Servlet 简介 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间 ...

  10. [CSP-S模拟测试]:大新闻(主席树)

    题目传送门(内部题20) 输入格式 第一行为两个数$n,m$,意义如题所述.接下来一行$n$个数,代表一开始$n$条大新闻的$naive$值.接下来$m$行,每行一个操作,输入格式如下:读入$1$,代 ...