属性驱动,就是在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>
接下来 是RoleAction 。属性驱动下 RoleAction 中需要对name和 description 分别进行定义。
<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>
我们可以看到,由于JSP页面的每一个name在action中都要有一个属性与之一一对应,因而随着属性数量的增加在
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之间传递的是一个封装好的对象,更接近面向对象编程,减少了代码量、提高可维护性、可复用性等等。