属性驱动,就是在Action中定义的是和表单中对应的一个个属性,每个属性都有对应的get/set方法。当表单提
交到Action后,Struts2将会自动将根据表单的name属性调用Action中相应的属性setter,去自动赋值。
模型驱动,就是事先定义一个模型即Model,将表单传递过来的数据封装成一个Model对象后,再传递给Action。
当表单提交到Action后,Action就会去自动调用Model的setter,将表单中的属性的值赋给私有对象的属性。
对两者有了宏观了解之后,我们结合下面的实例来切实体验一下在用法上的异同。首先,定义一个javaBean。
<span style="font-family:SimSun;font-size:18px;">/** * 用户角色类 * @author WYQ * */ public class Role { //角色id public Long id; //角色名称 public String name; //角色说明 public String description; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getName() { return name; } public void setName(String name) { this.name = name; } }</span></span>
首先,我们看一下属性驱动的用法。JSP页面中用到了两个变量name和description。
<span style="font-family:SimSun;font-size:18px;"> <!--显示数据列表--> <tbody id="TableData" class="dataContainer" datakey="roleList"> <s:iterator value="#roleList"> <tr class="TableDetail1 template"> <td><s:property value=%{name}/></td> <td><s:property value=%{description}/></td> <td><s:a action="role_delete?id=%{id}" >删除</s:a> <s:a action="role_editUI?id=%{id}">修改</s:a> </td> </tr> </s:iterator> </tbody></span>
<span style="font-family:SimSun;font-size:18px;">public class RoleAction extends ActionSupport { @Resource private RoleService roleService; //角色id private Long id; //角色说明 private String description; //角色名称 private String name; /*添加*/ public String add() throws Exception{ //封装到对象中 Role role=new Role(); role.setName(name); role.setDescription(description); //保存到数据库中 roleService.save(role); //返回列表页面 return "toList"; } /*------------getter and setter----------*/ public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } </span>
Action中会出现很多的getter和setter方法。增加了代码量,而且不利于代码维护。
接下来看一下模型驱动。模型驱动下的Action需要满足以下三点:
(1)模型驱动的Action必须实现ModelDriven接口。
(2)必须实现ModelDriven接口中唯一的方法getModel,返回泛型的一个对象。
(3)在Action中定义一个封装所有数据信息的javabean私有对象并提供相应的getter与setter。
下面是模型驱动下的实现。首先,JSP页面操作的不再是独立的变量属性。
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;"><!--显示数据列表--> <tbody id="TableData" class="dataContainer" datakey="roleList"> <s:iterator value="#roleList"> <tr class="TableDetail1 template"> <td><s:property value=%{<span style="color:#FF0000;">role.name</span>}/> </td> <td><s:property value=%{<span style="color:#FF0000;">role.description</span>}/></td> <td><s:a action="role_delete?id=%{id}" >删除</s:a> <s:a action="role_editUI?id=%{id}">修改</s:a> </td> </tr> </s:iterator> </tbody></span></span>
模型驱动下的Action实现。
<span style="font-family:SimSun;font-size:18px;">public class RoleAction extends ActionSupport <span style="color:#FF0000;">implements ModelDriven<Role></span> { @Resource private RoleService roleService; <span style="color:#FF0000;"><span style="background-color: rgb(255, 255, 255);">private Role role;</span></span> // 实现ModelDriven的方法返回泛型对象 public Role <span style="color:#FF0000;">getModel</span>() { return role; } /* 添加 */ public String add() throws Exception { // 保存到数据库中 roleService.save(role); // 返回列表页面 return "toList"; } /*------------getter and setter----------*/ public Role getRole() { return role; } public void setRole(Role role) { this.role = role; } } </span>
这样,无论我们再扩充多少个属性,由于操作的是对象,都不需要添加Action实现。大大提高了开发和可维护性。
通过代码实现,我们可以得出属性驱动在JSP和Action之间传递的是一个个单独的属性,而模型驱动在JSP和
Action之间传递的是一个封装好的对象,更接近面向对象编程,减少了代码量、提高可维护性、可复用性等等。