Struts2数据封装

本文记录Java学习过程中遇到的Struts2的数据封装~

在实际开发场景中,页面提交请求参数到Action,在Action中接收参数并且需要对请求参数进行数据的封装,将数据封装到一个JavaBean中,然后将JavaBean传递给业务层。Struts2将数据的封装分成两大类:一类是属性驱动,另一类是模型驱动。

属性驱动

属性驱动可以细分为两种,一种只需要提供属性的set方法,另一种可以通过表达式直接封装到对象中。

方式一:提供属性的set方法

在Struts2中,可以直接在Action中定义各种Java基础数据类型的字段,使这些字段与表单数据相对应,并利用这些字段进行数据封装。

示例代码(前端页面):

<form action="${pageContext.request.contextPath}/actionDemo.action" method="post">
	姓名:<input type="text" name="name"/><br/>
	年龄:<input type="text" name="age"/><br/>
	生日:<input type="text" name="birthday"/><br/>
	工资:<input type="text" name="salary"/><br/>
	<input type="submit" value="提交"/><br/>
</form>

示例代码(后端Action):

pubic class ActionDemo extends ActionSupport {
	// 接收参数
	private String name;
	private Integer age;
	private Date birthday;
	private Double salary;

	// set/get方法省略

	@Override
	public String execute() throws Exception {
		System.out.println(name);
		System.out.println(age);
		System.out.println(birthday);
		System.out.println(salary);

		return NONE;
	}
}

使用这种方式,如果需要传入的数据很多的话,那么Action的属性也会变得很多,再加上属性有对应的set/get方法,Action类的代码会很庞大,在Action里编写业务代码时,会使Action非常臃肿,不够简介。

方式二:页面提供表达式

把属性和相应的set/get方法从Action里提取出来,单独作为一个值对象,这个对象就是用来封装这些数据的,在相应的Action里可以直接使用这个对象,而且可以在多个Action里使用。采用这种方式,一般以JavaBean来实现,所封装的属性和表单的属性一一对应,JavaBean将成为数据传递的载体。

示例代码(前端代码):

<form action="${pageContext.request.contextPath}/actionDemo.action" method="post">
	姓名:<input type="text" name="user.name"/><br/>
	年龄:<input type="text" name="user.age"/><br/>
	生日:<input type="text" name="user.birthday"/><br/>
	工资:<input type="text" name="user.salary"/><br/>
	<input type="submit" value="提交"/><br/>
</form>

示例代码(后端Action):

public class ActionDemo extends ActionSupport {

	// 数据封装对象
	private User user;

	// set/get方法省略

	@Override
	public String execute() throws Exception {
		System.out.println(user);

		return NONE;
	}
}

注意:以上这种方式需要提供对user的get方法,如果没有提供get方法,在Struts2的底层就没有办法获得到该对象,那么在user中只会有一个属性被封装进去,而其他的属性都是null。

模型驱动

在Struts2中,Action处理请求参数还有另外一种方式,叫做模型驱动。通过实现ModelDriven接口来接收请求参数,Action类必须实现ModelDriven接口,并且要重写getModel()方法,这个方法返回的就是Action所使用的数据模型对象。

模型驱动方式通过JavaBean模型进行数据传递。只要是普通的JavaBean,就可以充当模型部分。采用这种方式,JavaBean所封装的属性与表单一一对应,JavaBean将成为数据传递的载体。

示例代码(前端页面):

<form action="${pageContext.request.contextPath}/actionDemo.action" method="post">
	姓名:<input type="text" name="name"/><br/>
	年龄:<input type="text" name="age"/><br/>
	生日:<input type="text" name="birthday"/><br/>
	工资:<input type="text" name="salary"/><br/>
	<input type="submit" value="提交"/>
</form>

示例代码(后端Action):

public class ActionDemo extends ActionSupport implements ModelDriven<User> {
	// 手动构建对象
	private User user = new User();

	@Override
	public User getModel() {
		return user;
	}

	@Override
	public String execute() throws Exception {
		System.out.println(user);
		return NONE;
	}
}

标签: none