在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. GeneXus笔记本——部分环境属性设置项

    这些属性的设置是我们在做项目的过程中都会设置的属性 当然也因项目而异 这里也只是单纯的记录一下 知识库 属性设置“Maximun numeric length" 效果:设置数值型最大值 版本 ...

  2. 二、IDS4配置服务

    它是根据定义配置服务Config.cs文件来生成客户端和API使用该服务所需的配置数据. 一.IDS4签名服务 1.为项目添加NuGet包. 2.IDS4服务制定的配置Config.cs. using ...

  3. hadoop1.2.1配置与运行子串统计程序

    一.虚拟机版本 VirtualBox-4.3.30 二.操作系统 CentOS-6.7-x86_64-bin-DVD1.iso 下载地址1:http://www.centoscn.com/Centos ...

  4. squid代理与缓存(下)

    squid代理与缓存(下) 6. squid代理模式案例 6.1 squid传统正向代理生产使用案例 6.1.1 squid传统正向代理两种方案 (1)普通代理服务器 作为代理服务器,这是SQUID的 ...

  5. day19 python模块 json模块 pickle模块

    day19 python   一.序列化模块     序列类型: 列表 字符串 元组 bytes     序列化: 特指字符串和bytes, 就是把其他的数据类型转化成序列的数据类型的过程 dic = ...

  6. 解决js ajax跨越请求 Access control allow origin 异常

    // 解决跨越请求的问题 response.setHeader("Access-Control-Allow-Origin", "*");

  7. .net core 控制台程序生成EXE

    在项目上右键编辑xxx.csproj,添加一行 <RuntimeIdentifier>win7-x64</RuntimeIdentifier>

  8. win7系统下IIS7.5配置MVC5环境注意事项与CentOS的MVC5设置

    注意事项: 1.IIS程序应用池更换为4.0net集成 2.网站目录加入IIS帐号的权限(基本设置里是administrators组帐号)注:服务器拒绝时是这里的问题 3.在“ISAPI和CGI限制” ...

  9. MYSQL5.7.9改密码相关设置

    Centos7上,对MySQL5.7开启远程连接. 1.修改/etc/my.cnf [mysqld] validate_password=off 2.命令行进入mysql use mysql; GRA ...

  10. ROS基础学习总结

    最近一周因为工程需要,把ROS的一些基础学习了一下,现在做一下总结. 学习资源: #创客智造整理的wiki上的ROS入门教程(中文)https://www.ncnynl.com/category/ro ...