Struts2属性驱动和模型驱动详解


    属性驱动,就是在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之间传递的是一个封装好的对象,更接近面向对象编程,减少了代码量、提高可维护性、可复用性等等。



你可能感兴趣的:(Struts2属性驱动和模型驱动详解)