在以往的web开发中,如果要在表单显示什么内容,我们就需要在Action中提前定义好表单显示的所有属性,以及一系列的get和set方法。如果实体类的属性非常多,那么Action中也要定义相同的属性。在Struts2中,ModelDriven模型驱动就提供了另一种方式,减少了重复性的代码。

下面我们就来具体看看在项目中如何使用:

以用户管理为例,除jsp页面外,四个包action、dao、service、vo。

调用关系:action——>service——>dao

首先,无论是哪种方法,vo包中的User类都是一样的。

public class User {
//用户id
private Integer uid;
//用户名
private String username;
//密码
private String password; public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}

在Action中,如果不使用模型驱动,我们需要一一构造User对象的属性,作为参数传入调用。

使用模型驱动,就要实现ModelDriven这个接口,内部方法也很简单。

public abstract interface com.opensymphony.xwork2.ModelDriven {

  public abstract java.lang.Object getModel();
}
public class UserAction {
private int uid;
private String username;
private String password;
public String login(){
//构造user对象
User user = new User();
user.setUId(id);
user.setUsername(username);
user.setPassword(password);
User exitUser=userService.login(user);
if(exitUser==null){
this.addActionError("登录失败");
return "login"; }else{
//用户信息存入session、
ServletActionContext.getRequest().getSession().setAttribute("exitUser",exitUser);
return "loginSuccess";
}
} public int getUId() {
return uid;
}
public void setId(int uid) {
this.uid = uid;
} //剩下的get和set方法省去
......
...... }

而如果使用模型驱动,我们只需要让Action类去实现ModelDriven接口。

public class UserAction  extends ActionSupport implements ModelDriven<User> {
//模型驱动使用的对象
private User user=new User();
//MdoelDriven中的方法
public User getModel(){
return user; }
//注入userservice
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
} /**
* 登录
*/
public String login(){
User exitUser=userService.login(user);
if(exitUser==null){
this.addActionError("登录失败");
return "login"; }else{
//用户信息存入session、
ServletActionContext.getRequest().getSession().setAttribute("exitUser",exitUser);
return "loginSuccess";
} }
}

另外,模型驱动的好处还体现在数据回显时的应用。

在Action中,模型驱动的实体是CategorySecond,因而在回显jsp页面数据的时候,不需要保存到ValueStack值栈中,而一级分类集合cList需要保存到值栈中,前台才可以获取到值。

public class AdminCategorySecondAction extends ActionSupport implements ModelDriven<CategorySecond>{
//
//
//其余代码省去 //编辑二级分类
public String edit(){ //查询二级分类
categorySecond=categorySecondService.findByCid(categorySecond.getCsid());
//查询一级分类
List<Category> cList=categoryService.findAll();
//保存到值栈中
ActionContext.getContext().getValueStack().set("cList", cList);
return "editSuccess";
} }

前台的部分显示如下:

<tr>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
二级分类名称:
</td>
<td class="ta_01" bgColor="#ffffff" >
<input type="text" name="csname" value="<s:property value="model.csname"/>" id="userAction_save_do_logonName" class="bg"/>
</td>
<td width="18%" align="center" bgColor="#f5fafe" class="ta_01">
所属的一级分类:
</td>
<td class="ta_01" bgColor="#ffffff" >
<select name="category.cid">
<s:iterator var="c" value="cList">
<option value="<s:property value="#c.cid"/>" <s:if test="#c.cid==model.category.cid">selected</s:if>><s:property value="#c.cname"/></option>
</s:iterator>
</select>
</td>
</tr>

二级分类信息使用model来显示数据,而一级分类信息接收action中传来的cList。两种方法都可以实现数据显示,但模型驱动更为简单方便。

小结:

Struts2提供的两种方式:属性驱动和模型驱动。模型驱动可以提高代码的重用性,使得操作简便。但在小型项目中,表单比较少时,并不提倡使用模型驱动。还有一点,在上面的例子中也能看出,模型驱动只能对应一个对象,当表单数据来源比较复杂时,使用模型驱动也无法起到十分明显的作用。

【SSH】——使用ModelDriven的利与弊的更多相关文章

  1. ORACLE归档模式和非归档模式的利与弊

    转: 在Oracle数据库中,主要有两种日志操作模式,分别为非归档模式与归档模式.默认情况下,数据库采用的是非归档模式.作为一个合格的数据库管理员,应当深入了解这两种日志操作模式的特点,并且在数据库建 ...

  2. IT职场: 选择外企利与弊

    前几天有个同学打电话问我选择国内企业与外企的利弊,很可笑的是他是学机械的:既然和我完全不在一个行业,因此我只是说了我们IT外企的利与弊,毕竟隔行如隔山. 首先简单自我介绍一下,我所在的公司是美资500 ...

  3. 思考ASP.NET网站静态化的利与弊

    最近在思考网站要不要进行静态化的问题,在网上收集和整理了有关静态化利与弊的资料,于是写下此博文分享到网络上.由于本人是一名asp.net开发人员,所以本文的观点可能无法涉及到全部方面,但是比较注重于使 ...

  4. 什么是App加壳,以及App加壳的利与弊

    非著名程序员涩郎 非著名程序员,字耿左直右,号涩郎,爱搞机,爱编程,是爬行在移动互联网中的一名码匠!个人微信号:loonggg,微博:涩郎,专注于移动互联网的开发和研究,本号致力于分享IT技术和程序猿 ...

  5. [1,2,3].forEach(alert);这样的写法有什么利和弊吗?

    以下这个问题遇到了之后.问了太阳神,以下是太阳神的解答: [1,2,3].forEach(alert);这样的写法有什么利和弊吗? 首先forEach使用方法非常easy降低代码量, 可是也有非常多地 ...

  6. 关于Java8 Stream流的利与弊 Java初学者,大神勿喷

    题目需求: 1:第一个队伍只要名字为3个字成员的姓名,存储到新集合 2:第一个队伍筛选之后只要前3人:存储到一个新集合 3:第2个队伍只要姓张的成员姓名:存储到一个新集合 4:第2个队伍不要前2人,存 ...

  7. Storyboard、Nib文件和代码来实现UI的利与弊

    很清楚,这就是iOS里面两种可视化UI的方法.加上全部用代码来实现UI,总共有三种方法可以来实现. 我们先说一下全用代码来做,这个方法属于比较极端的程序员所推崇的,优点和缺点同样明显. 优点是可以实现 ...

  8. 十年Java开发程序员回答,自学Java,培训Java的利和弊

    最近有一个朋友在群里面问我:是应该去培训Java还是应该自学Java,我想的说的是我并不是想给他一个去培训或者不去培训,我用自己多年对于行业的了解去分析这个问题,然后让他自己去思考,哪种更加适合他.他 ...

  9. Android-Java-synchronized同步锁机制&利与弊

    synchronized同步锁机制 定义锁

随机推荐

  1. jquery mobile 移动web(4)

    下拉菜单: 设置label 元素的for 属性为 select label 元素的文本内容作为选项的名称 定义div元素并设置data-role 属性值为 fieldcontain. <div ...

  2. Easyui多个下拉框联动效果

    好久没写前端了,以前在做多级联动的时候,用的是easyui的tree结构,但是需要一次性全部加载,不是按需加载,性能不好,退而求其之,用多个下拉框做 eayui的combobox  有onSelect ...

  3. unexpected reloc type问题分析

    1.现象,程序在启动的时候报如下错误error while loading shared libraries: /home/test/lib/libtest.so: unexpected reloc ...

  4. 关于mysql的优化

    MYSQL的优化一个很棘手的问题,也是一个公司最想处理得当的问题. 那么今天,本人为大家带来几点优化数据库的方法: 1.选取最适用的字段属性 一般来说,数据库的的表越小,在其上面执行的查询也会越快.因 ...

  5. springmvc重定向请求。

    SpringMVC重定向传参数的实现(来自网友) 验证了我说的,从model层中拿来的数据,不管什么类型,都是通过隐含模型,中转,放入request中的.除非你特意把这些数据放到session域中. ...

  6. QQ群排名优化到霸屏的策略怎么做?

    谈起QQ群排名霸屏,首先要弄清楚概念,有些刚接触QQ群的朋友可能不太了解,所谓的QQ群排名霸屏,就是指当你的客户群体搜索QQ群某个关键词时,出现在QQ群搜索结果前面的群,全部或者大部分都是我们自己的群 ...

  7. 【Linux】Nginx无法加载.woff .eot .svg .ttf问题解决

    只需要修改Nginx的vhosts.ini,加上以下代码即可修复该问题 location ~ \.(eot|otf|ttf|woff|woff2|svg)$ { add_header Access-C ...

  8. 前端学习之HTML基础

    要点: 理解HTTP请求响应模式及通信规范 HTML的各种标签和常用标签 CSS是用于样式渲染和定位布局 JS将HTML动态化 jquery是JS的高级封装 理解HTTP请求响应模式及通信规范 HTT ...

  9. Linux命令备忘录:mount用于加载文件系统到指定的加载点

    mount命令用于加载文件系统到指定的加载点.此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命 ...

  10. uva 253 - Cube painting(相同骰子)

    习题4-4 骰子涂色(Cube painting, UVa 253) 输入两个骰子,判断二者是否等价.每个骰子用6个字母表示,如图4-7所示. 图4-7 骰子涂色 例如rbgggr和rggbgr分别表 ...