Struts2中数据的封装
Struts2框架是一个web层框架,web层主要是处理网页传过来的数据。
Struts2提供了数据封装的功能。
Struts2中有三种数据封装的方式:
(1)属性驱动:提供属性set方法的方式(不常用)
(2)属性驱动:页面中提供表达式方式(偶尔用)
(3)模型驱动:实现ModelDriven<T>接口(常用)
先定义一个User类:
package com.pipi.struts2.demo2;
// 注册时的用户信息类
public class User {
private String name;
private String password;
private Integer age;
private String birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public User() {
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
1、属性驱动:提供属性set方法的方式(不常用)
编写JSP:
Struts中日期自动转换格式有点问题,这里的生日只能为text,写xxxx-xx-xx类型。
<h3>方式一:属性驱动,提供set方法</h3>
<form action="${ pageContext.request.contextPath }/userAction1.action" method="post">
名称:<input type="text" name="name" /><br />
密码:<input type="password" name="password" /><br />
年龄:<input type="number" name="age" /><br />
生日:<input type="text" name="birthday" /><br />
<input type="submit" value="注册" />
</form>
<hr />
编写Action类:
package com.pipi.struts2.demo2;
import com.opensymphony.xwork2.ActionSupport;
// 方式一:属性驱动,提供set方法
public class UserAction1 extends ActionSupport {
// 提供对应的属性
private String name;
private String password;
private Integer age;
private String birthday;
// 提供setter方法,不需要提供getter
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
@Override
public String execute() throws Exception {
// 只要提供对应属性,提供setter方法,数据会自动接收到
System.out.println(name);
System.out.println(password);
System.out.println(age);
System.out.println(birthday);
// 封装数据
User user = new User();
user.setName(name);
user.setPassword(password);
user.setAge(age);
user.setBirthday(birthday);
System.out.println(user);
return NONE;
}
}
附上:自定义的日期转换类:
package com.pipi.myutils;
import com.opensymphony.xwork2.conversion.TypeConversionException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyDateFormat {
// 支持多种日期格式
public static final SimpleDateFormat[] dateArray = {
new SimpleDateFormat("yyyy-MM-dd"),
new SimpleDateFormat("yyyy/MM/dd"),
new SimpleDateFormat("yyyy.MM.dd"),
new SimpleDateFormat("yyyy年MM月dd日")
};
// 字符串 转 日期
public static Date StringToDate(String str) {
// 遍历支持的日期格式,尝试进行转换
for (int i = 0; i < dateArray.length; i++) {
try {
return dateArray[i].parse(str);
} catch (ParseException e) {
continue;
}
}
//如果遍历完毕后仍没有转换成功,表示出现转换异常
System.out.println("字符串格式有点问题,转换失败!");
throw new TypeConversionException();
}
// 日期 转 字符串
public static String DateToString(Date date) {
// 返回yyyy-MM-dd形式的字符串
return new SimpleDateFormat("yyyy-MM-dd").format(date);
}
}
2、属性驱动:页面中提供表达式方式
编写JSP:
注意:表单中的name值的写法。
user是Action类中的属性名称,user.后面的是User对象的属性。
<h3>方式二:属性驱动,页面中提供表达式</h3>
<form action="${ pageContext.request.contextPath }/userAction2.action" method="post">
名称:<input type="text" name="user.name" /><br />
密码:<input type="password" name="user.password" /><br />
年龄:<input type="number" name="user.age" /><br />
生日:<input type="text" name="user.birthday" /><br />
<input type="submit" value="注册" />
</form>
<hr />
编写Action类:
package com.pipi.struts2.demo2;
import com.opensymphony.xwork2.ActionSupport;
// 方式二:属性驱动,页面中提供表达式。需要在Action类中封装一个User属性
public class UserAction2 extends ActionSupport {
// 封装一个User属性对象
private User user;
// 一定得提供setter and getter
// 因为拦截器完成数据封装,需要创建User对象。通过get方法可以获取同一个对象,通过set方法将数据封装到同一个对象中。
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
// 接收数据,到属性user中
System.out.println(user);
return NONE;
}
}
3、模型驱动:采用模型驱动方式(最常用的)
编写JSP:
<h3>方式三:模型驱动:采用模型驱动方式</h3>
<form action="${ pageContext.request.contextPath }/userAction3.action" method="post">
名称:<input type="text" name="name" /><br />
密码:<input type="password" name="password" /><br />
年龄:<input type="number" name="age" /><br />
生日:<input type="text" name="birthday" /><br />
<input type="submit" value="注册" />
</form>
<hr />
编写Action类:
package com.pipi.struts2.demo2;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
// 方式三:模型驱动:采用模型驱动方式。实现ModelDriven<T>接口。
public class UserAction3 extends ActionSupport implements ModelDriven<User> {
// 封装一个User属性,必须自己手动初始化
private User user = new User();
@Override
public User getModel() {
return user;
}
@Override
public String execute() throws Exception {
// 接收数据,封装到user属性中
System.out.println(user);
return NONE;
}
}
模型驱动方式虽然是最常用的方式,但是也存在缺点。
就是只能同时向一个对象中封装数据。但通常就是往一个对象中存数据。
使用第二种页面表达式的方式,可以向多个对象中同时封装数据。