(Struts2)Struts2框架的数据封装

1、为什么要使用数据的封装?

     >  作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中

     >  封装数据为开发提供了很多便利之处

     >  Struts2框架提供了很强大的数据封装的功能,不再需要使用Servlet的API完成手动封装!!!


2、Struts2中提供了两种数据封装的方式

      第一种方式:属性驱动

             >  提供对应属性的set方法进行数据的封装

                  *   表单的哪些属性需要封装数据,那么在对应的Action类中提供该属性的set方法即可。

                  *   表单中的数据提交,最终找到Action类中的setXxx的方法,最后赋值给全局变量。

             >  注意点

                  *  Struts2的框架采用的拦截器完成数据的封装.

                  *  这种方式不是特别好:因为属性特别多,提供特别多的set方法,而且还需要手动将数据存入到对象中.

                  *  这种情况下,Action类相当于一个JavaBean,就没有体现出MVC的思想,Action类又封装数据,又接收请求处理,耦合性较高。

              页面代码:

<h3>属性驱动的方式</h3>
<form action="${ pageContext.request.contextPath }/register1.action" method="post">
	姓名: <input type="text" name="username" /><br/>
	密码: <input type="password" name="password"/><br/>
	年龄: <input type="text" name="age"/><br/>
	<input type="submit" value="注册" />
</form>

             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;
	}
}

    配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="demo2" namespace="/" extends="struts-default">
	        <!-- 属性驱动的方式 -->
            <action name="register1" class="com.itheima.demo2.Register1Action" method="execute"></action>
	</package>
</struts>


     >   在页面上,使用OGNL表达式进行数据封装

           *   在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中

           *   在页面中定义一个JavaBean,并且提供set方法。例如:private  User  user;

           *   页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:<input name="user.username" />

           *   注意:只提供一个set方法还不够,必须还需要提供user属性的get方法!!!

                   >>   先调用get方法,判断是否有user对象的实例对象,如果没有,调用set方法把拦截器创建的对象注入进来

           Jsp页面代码:

<h3>属性驱动的方式(把对象封装到JavaBean的对象中)</h3>
<!-- 注意一: 页面的编写规则,发送了变化,使用的OGNL表达式的写法 -->
<form action="${ pageContext.request.contextPath }/register2.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="submit" value="注册" />
</form>

           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;
	}
	
}

         配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="demo2" namespace="/" extends="struts-default">
		<!-- 属性驱动的方式,把数据封装到JavaBean对象中 -->
		<action name="register2" class="com.itheima.demo2.Register2Action" method="execute"></action>
	</package>
</struts>


     第二种方式:模型驱动

            >  使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别!

            >  编写的页面不需要任何变化,正常编写name属性的值

            >  模型驱动的编写步骤

                    *   手动实例化JavaBean,即:private  User  user  =  new  User();

                    *   必须实现ModelDriven<T> 接口,实现getModel()的方法,在getModel()方法中返回user即可

           页面代码:

<h3>模型驱动方式</h3>
<form action="${ pageContext.request.contextPath }/register3.action" method="post">
	姓名: <input type="text" name="username" /><br/>
	密码: <input type="password" name="password"/><br/>
	年龄: <input type="text" name="age"/><br/>
	<input type="submit" value="注册" />
</form>

           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<User>{
	// 必须要手动实例化
	private User user = new User();
	
	// 获取模型对象
	public User getModel() {
		return user;
	}
	
	public String execute() throws Exception {
		System.out.println(user);
		return NONE;
	}
}

            配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="demo2" namespace="/" extends="struts-default">
		<!-- 模型驱动的方式 -->
		<action name="register3" class="com.itheima.demo2.Register3Action" method="execute"></action>
	</package>
</struts>

3、属性驱动另外两种方式:把数据封装到List和Map集合

         *   封装到List集合中

<h3>向List集合封装数据(默认情况下,采用的是属性驱动的方式)</h3>
<!-- 后台: List<User> list -->
<form action="${ pageContext.request.contextPath }/register4.action" method="post">
	姓名: <input type="text" name="list[0].username" /><br/>
	密码: <input type="password" name="list[0].password"/><br/>
	年龄: <input type="age" name="list[0].age"/><br/>
		
	姓名: <input type="text" name="list[1].username" /><br/>
	密码: <input type="password" name="list[1].password"/><br/>
	年龄: <input type="age" name="list[1].age"/><br/>
	      <input type="submit" value="注册" />
</form>
        Action类:
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 属性驱动的方式,把数据封装到List集合中
 */
public class Register4Action 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 {
		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 + "]";
	}
}

          配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="demo2" namespace="/" extends="struts-default">
		<!-- 把数据封装到List集合中 -->
		<action name="register4" class="com.itheima.demo2.Register4Action" method="execute"></action>
	</package>
</struts>


    *   数据封装到Map集合中

<h3>向Map集合封装数据(默认情况下,采用的是属性驱动的方式)</h3>
<form action="${ pageContext.request.contextPath }/register5.action" method="post">
	姓名: <input type="text" name="map['one'].username" /><br/>
	密码: <input type="password" name="map['one'].password"/><br/>
	年龄: <input type="age" name="map['one'].age"/><br/>
		
	姓名: <input type="text" name="map['two'].username" /><br/>
	密码: <input type="password" name="map['two'].password"/><br/>
	年龄: <input type="age" name="map['two'].age"/><br/>
	      <input type="submit" value="注册" />
</form>

        Action类代码:

/**
 * 属性驱动的方式,把数据封装到Map集合中
 */
public class Register5Action 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);
		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 + "]";
	}
}
         配置文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="demo2" namespace="/" extends="struts-default">
		<!-- 把数据封装到Map中 -->
		<action name="register5" class="com.itheima.demo2.Register5Action" method="execute"></action>
	</package>
</struts>


下一篇:Struts2的拦截器技术

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值