Struts2请求参数的绑定

1. 属性驱动

1.1 提供属性的set方法的方式

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

表单的代码:

<form action="${pageContext.request.contextPath}/Demo1Action">
	用户名:<input type="text" name="name" /><br>
	年龄:<input type="text" name="age" /><br>
	生日:<input type="text" name="birthday" /><br>
	<input type="submit" value="提交" />
</form>

Action的代码:

public class Demo1Action extends ActionSupport  {
	
	private String name;
	private Integer age;
	private Date birthday;
	
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}

	public String execute() throws Exception { 
		System.out.println("name参数值:" + name + ", age参数值:" + age + ", 生日:" + birthday);
		return SUCCESS;
	}

}

以上这种方式需要通过在Action中定义属性,并且提供属性的set方法来完成。这种方式只需要提供set方法即可,但若需要传入的数据很多的话,那么Action的属性也会变得很多。再加上属性有对应的getter/setter方法,Action类的代码会很庞大,在Action里编写业务的代码时,会使Action非常臃肿,不够简洁。那么要怎样解决这个问题呢?

1.2 页面提供表达式的方式

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

表单的代码:

<!-- 使用 OGNL表达式的方式 -->
<form action="${pageContext.request.contextPath}/Demo2Action">
	用户名:<input type="text" name="user.name" /><br>
	年龄:<input type="text" name="user.age" /><br>
	生日:<input type="text" name="user.birthday" /><br>
	<input type="submit" value="提交" />
</form>

JavaBean的代码:

public class User {
	
	private String name;
	private Integer age;
	private Date birthday;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", birthday=" + birthday + "]";
	}
	
}

Action的代码:

public class Demo2Action extends ActionSupport  {
	
	private User user;
	
	//必须提供对象的 get方法	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
	public String execute() throws Exception { 
		System.out.println(user);
		return SUCCESS;
	}

}

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

2. 模型驱动

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

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

表单的代码:

<form action="${pageContext.request.contextPath}/Demo3Action">
	用户名:<input type="text" name="name" /><br>
	年龄:<input type="text" name="age" /><br>
	生日:<input type="text" name="birthday" /><br>
	<input type="submit" value="提交" />
</form>

Action的代码:

public class Demo3Action extends ActionSupport implements ModelDriven<User> {

	private User user = new User();

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

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

}

到这我们已经能够将数据封装到一个Java对象中了,大部分我们会优先使用模型驱动的方式,因为Struts2内部有很多结果是围绕模型驱动设计的。但如果页面向多个对象中封装,那么就需要使用属性驱动的方式二了。这些都是向某个对象中封装数据,那么如果Action中需要一个对象的集合呢,又应该如何进行数据的封装呢?那么接下来我们来了解一下Struts2中复杂类型数据的封装。

3. 封装集合类型的数据

在实际的开发中,有些时候我们需要批量插入用户或者批量插入其他的对象,在Action中需要接受到这多个Action中封装的对象,然后传递给业务层,那么这个时候就需要将表单的数据封装到集合中。一般我们通常使用的集合无非是List或者是Map集合,下面就以这两种集合进行数据的封装的示例演示。

3.1 封装数据到List集合中

表单的代码:

<form action="${pageContext.request.contextPath}/Demo4Action">
	用户名:<input type="text" name="list[0].name" /><br>
	年龄:<input type="text" name="list[0].age" /><br>
	生日:<input type="text" name="list[0].birthday" /><br>
	用户名:<input type="text" name="list[1].name" /><br>
	年龄:<input type="text" name="list[1].age" /><br>
	生日:<input type="text" name="list[1].birthday" /><br>
	<input type="submit" value="提交" />
</form>

Action的代码:

public class Demo4Action extends ActionSupport  {

	private List<User> list;
	
	public List<User> getList() {
		return list;
	}
	public void setList(List<User> list) {
		this.list = list;
	}
	
	public String execute() throws Exception { 
		System.out.println("list:" + list);
		return SUCCESS;
	}

}

3.2 封装数据到Map集合中

表单的代码:

<form action="${pageContext.request.contextPath}/Demo5Action">
	用户名:<input type="text" name="map['user1'].name" /><br>
	年龄:<input type="text" name="map['user1'].age" /><br>
	生日:<input type="text" name="map['user1'].birthday" /><br>
	用户名:<input type="text" name="map['user2'].name" /><br>
	年龄:<input type="text" name="map['user2'].age" /><br>
	生日:<input type="text" name="map['user2'].birthday" /><br>
	<input type="submit" value="提交" />
</form>

Action的代码:

public class Demo5Action extends ActionSupport  {

	private Map<String, User> map;
	
	public Map<String, User> getMap() {
		return map;
	}
	public void setMap(Map<String, User> map) {
		this.map = map;
	}
	
	public String execute() throws Exception { 
		System.out.println("map:" + map);
		return SUCCESS;
	}

}
发布了25 篇原创文章 · 获赞 0 · 访问量 468

猜你喜欢

转载自blog.csdn.net/weixin_45990046/article/details/103689270