1、为什么要使用数据的封装?
> 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中
> 封装数据为开发提供了很多便利之处
> Struts2框架提供了很强大的数据封装的功能,不再需要使用Servlet的API完成手动封装!!!
2、Struts2中提供了两种数据封装的方式
第一种方式:属性驱动
> 提供对应属性的set方法进行数据的封装
* 表单的哪些属性需要封装数据,那么在对应的Action类中提供该属性的set方法即可。
* 表单中的数据提交,最终找到Action类中的setXxx的方法,最后赋值给全局变量。
> 注意点:
* Struts2的框架采用的拦截器完成数据的封装.
* 这种方式不是特别好:因为属性特别多,提供特别多的set方法,而且还需要手动将数据存入到对象中.
* 这种情况下,Action类相当于一个JavaBean,就没有体现出MVC的思想,Action类又封装数据,又接收请求处理,耦合性较高。
页面代码:
属性驱动的方式
Action类代码:
/**
* 属性驱动
* @author Administrator
*/
public class Regist1Action extends ActionSupport {
private String username;
private String password;
private Integer age;
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 String execute() throws Exception {
System.out.println(username + " " + password + " " + age);
return NONE;
}
}
配置文件:
> 在页面上,使用OGNL表达式进行数据封装
* 在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中
* 在页面中定义一个JavaBean,并且提供set方法。例如:private User user;
* 页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:
* 注意:只提供一个set方法还不够,必须还需要提供user属性的get方法!!!
>> 先调用get方法,判断是否有user对象的实例对象,如果没有,调用set方法把拦截器创建的对象注入进来。
Jsp页面代码:
属性驱动的方式(把对象封装到JavaBean的对象中)
JavaBean代码:
// JavaBean
public class User {
private String username;
private String password;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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 toString() {
return "User [username=" + username + ", password=" + password + ", age=" + age + "]";
}
}
Action类的代码:
/**
* 属性驱动方式,把数据封装到JavaBean的对象中
* @author Administrator
*/
public class Regist2Action extends ActionSupport {
// 注意二: 属性驱动的方式,现在要提供的是get和set方法
private User user;
public User getUser() {
System.out.println("getUser...");
return user;
}
public void setUser(User user) {
System.out.println("setUser...");
this.user = user;
}
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}
配置文件:
第二种方式:模型驱动
> 使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别!
> 编写的页面不需要任何变化,正常编写name属性的值
> 模型驱动的编写步骤:
* 手动实例化JavaBean,即:private User user = new User();
* 必须实现ModelDriven
页面代码:
模型驱动方式
JavaBean代码:
// JavaBean
public class User {
private String username;
private String password;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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 toString() {
return "User [username=" + username + ", password=" + password + ", age=" + age + "]";
}
}
Action类代码:
/**
* 模型驱动的方式
* 实现ModelDriver接口
* 必须要手动实例化对象(需要自己new)
* @author Administrator
*/
public class Regist3Action extends ActionSupport implements ModelDriven{
// 必须要手动实例化
private User user = new User();
// 获取模型对象
public User getModel() {
return user;
}
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}
配置文件:
3、属性驱动另外两种方式:把数据封装到List和Map集合中
* 封装到List集合中
向List集合封装数据(默认情况下,采用的是属性驱动的方式)
Action类:
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
/**
* 属性驱动的方式,把数据封装到List集合中
*/
public class Register4Action extends ActionSupport{
private List list;
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public String execute() throws Exception {
for (User user : list) {
System.out.println(user);
}
return NONE;
}
}
JavaBean:
// JavaBean
public class User {
private String username;
private String password;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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 toString() {
return "User [username=" + username + ", password=" + password + ", age=" + age + "]";
}
}
配置文件:
* 数据封装到Map集合中
向Map集合封装数据(默认情况下,采用的是属性驱动的方式)
Action类代码:
/**
* 属性驱动的方式,把数据封装到Map集合中
*/
public class Register5Action extends ActionSupport {
private Map map;
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public String execute() throws Exception {
System.out.println(map);
return NONE;
}
}
JavaBean代码:
// JavaBean
public class User {
private String username;
private String password;
private Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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 toString() {
return "User [username=" + username + ", password=" + password + ", age=" + age + "]";
}
}
配置文件代码:
下一篇:Struts2的拦截器技术