数据的封装主要是关于如何将前端页面的数据封装起来并且传到后台进行下一步的操作,在struts2中,提供了两大类三种方法对数据进行封装。分别是属性驱动(set方法,页面中表达式),模型驱动方法。
1属性驱动——在action中提供set方法,action中的代码如下所示:
public class UserAction1 extends ActionSupport {
private String username;
private String password;
private Integer age;
private Date birthday;
private Double salary;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(username);
System.out.println(password);
System.out.println(age);
System.out.println(birthday);
System.out.println(salary);
//数据封装
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setAge(age);
user.setBirthday(birthday);
user.setSalary(salary);
return NONE;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public void setSalary(Double salary) {
this.salary = salary;
}
}
这一种方法在jsp页面中不需要修改,只是将domain对象中的变量在action中声明,并且提供对应的set方法,就可以将数据传递到后台。利用domain对象中的set方法可以对数据进行封装。
2,属性驱动——表单表达式方式,代码如下所示:
public class UserAction2 extends ActionSupport {
//页面封装的方法
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(user);
return NONE;
}
}
在action中只需要对domain对象,User类进行实例化,并且提供User对象的set,get方法。在User类中toString方法,在这里就能利用System.out.println(user),将结果输出。但是jsp页面对应数据的name属性的书写有了变化,如下所示:
<form action="${pageContext.request.contextPath}/userAction2.action" method="post">
用户名:<input type="text" name="user.username"/><br/>
密码:<input type="password" name="user.password"/><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="提交"/>
</form>
name属性的书写要使用类对象.变量的形式。
3,模型驱动
模型驱动顾名思义是实现了模型驱动接口,代码如下所示:
public class UserAction3 extends ActionSupport implements ModelDriven<User>{
private User user = new User();
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(user);
return NONE;
}
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
使用模型驱动的时候一定要添加其默认方法public User getModel(),这个方法中获取了前端页面传递过来的值,在User类中添加toString方法后,便能将数据输出。而前端页面也不需要修改。
对于这三种数据封装的形式,模型驱动方法是在开发中最常用的方式,第一种set方法由于书写起来麻烦而最不常用。
对于复杂类型struts2也提供了方法对其封装,分别是使用List和Map进行封装:(复杂类型是指如果前端页面传来很多数据需要一次性传递到数据库)
List方法封装代码如下所示:
public class ProductAction1 extends ActionSupport {
private List<Produce> produces;
public List<Produce> getProduces() {
return produces;
}
public void setProduces(List<Produce> produces) {
this.produces = produces;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
for(Produce produce:produces){
System.out.println(produce);
}
return NONE;
}
}
在action中,声明domain对象为List类型,并且提供set,get方法。利用迭代器就可将其输出,但是前端页面中name属性的书写也有了变化,代码如下所示:
<form action="${pageContext.request.contextPath}/productAction1.action" method="post">
商品名称:<input type="text" name="produces[0].pname"/><br/>
商品价格:<input type="text" name="produces[0].pprice"/><br/>
商品名称:<input type="text" name="produces[1].pname"/><br/>
商品价格:<input type="text" name="produces[1].pprice"/><br/>
商品名称:<input type="text" name="produces[2].pname"/><br/>
商品价格:<input type="text" name="produces[2].pprice"/><br/>
<input type="submit" value="提交"/>
</form>
name属性中利用数组的方式进行书写,注意数组名要与在acion中声明的一致。
而使用map进行封装的代码如下:
public class ProductAction2 extends ActionSupport {
private Map<String, Produce> map;
public Map<String, Produce> getMap() {
return map;
}
public void setMap(Map<String, Produce> map) {
this.map = map;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
for (String key: map.keySet()){
Produce produce = map.get(key);
System.out.println(key+" "+produce);
}
return NONE;
}
}
在action中声明一个map类型,其value是domain对象,并提供set,get方法。使用迭代器将其输出。jsp页面中name属性的书写也采用map形式,如下:
<form action="${pageContext.request.contextPath}/productAction2.action" method="post">
商品名称:<input type="text" name="map['one'].pname"/><br/>
商品价格:<input type="text" name="map['one'].pprice"/><br/>
商品名称:<input type="text" name="map['two'].pname"/><br/>
商品价格:<input type="text" name="map['two'].pprice"/><br/>
商品名称:<input type="text" name="map['three'].pname"/><br/>
商品价格:<input type="text" name="map['three'].pprice"/><br/>
<input type="submit" value="提交"/>
</form>
使用key+value的形式将数据封装进map中。