6.struts2数据的封装

**Struts2数据的封装(重点)**
	
	1.为什么要使用数据的封装呢?
		* 作为MVC框架,必须要负责解析HTTP请求参数,并将其封装到Model对象中
		* 封装数据为开发提供了很多方便 
		* Struts2框架提供了很强大的数据封装的功能,不再需要使用Servlet的API完成手动封装了!!		
	
	2.Struts2中提供了两类数据封装的方式?
		* 属性驱动
			> 提供对应属性的set方法进行数据的封装。
				* 表单的哪些属性需要封装数据,那么在对应的Action类中提供该属性的set方法即可。
				* 表单中的数据提交,最终找到Action类中的setXxx的方法,最后赋值给全局变量。
				
				* 注意0:Struts2的框架采用的拦截器完成数据的封装。
				* 注意1:这种方式不是特别好:因为属性特别多,提供特别多的set方法,而且还需要手动将数据存入到对象中.
				* 注意2:这种情况下,Action类就相当于一个JavaBean,就没有体现出MVC的思想,Action类又封装数据,又接收请求处理,耦合性较高。
			
			> 在页面上,使用OGNL表达式进行数据封装。
				* 在页面中使用OGNL表达式进行数据的封装,就可以直接把属性封装到某一个JavaBean的对象中。
				* 在页面中定义一个JavaBean,并且提供set方法:例如:private User user;
				* 页面中的编写发生了变化,需要使用OGNL的方式,表单中的写法:<input type="text" name="user.username">
				
				* 注意:只提供一个set方法还不够,必须还需要提供user属性的get和set方法!!!
					> 先调用get方法,判断一下是否有user对象的实例对象,如果没有,调用set方法把拦截器创建的对象注入进来,
		
		* 模型驱动(拦截器是modelDriven)
			> 使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别!
			> 编写的页面不需要任何变化,正常编写name属性的值。
			> 模型驱动的编写步骤:
				* 手动实例化JavaBean,即:private User user = new User();
				* 必须实现ModelDriven<T>接口,实现getModel()的方法,在getModel()方法中返回user即可!!
	
	3.三种封装的方式的总结
		* 属性驱动(把数据直接封装到某一个具体的属性中)
			* 在Action的类中,提供属性,提供对应的set方法就可以了!
			
		* 属性驱动(把数据封装到JavaBean对象中)
			* JSP的页面需要改变:user.username
			* 定义对象的属性,提供get和set方法		

		* 模型驱动
			* 页面不需要改变的
			* 实现ModelDriven接口,实现getModel()方法,返回实例化后的对象
	
	4.提供的测试页面
		* 测试的页面代码
			<form action="${ pageContext.request.contextPath }/xxx.action" method="post">
				姓名:<input type="text" name="username" /><br/>
				年龄:<input type="text" name="age" /><br/>
				爱好:<input type="checkbox" name="love" value="lq"/>篮球
					  <input type="checkbox" name="love" value="zq"/>足球
					  <input type="checkbox" name="love" value="pq"/>排球	
					 <br/>
				<input type="submit" value="登陆" />
			</form>
		
		* 需要的JavaBean的代码
			private String username;
			private int age;
			private String[] love;

demo1.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<h3>数据的封装(属性驱动方式,数据封装到Action中)</h3>
<form action="${ pageContext.request.contextPath }/reg1.action" method="post">
	姓名:<input type="text" name="username" /><br/>
	年龄:<input type="text" name="age" /><br/>
	爱好:<input type="checkbox" name="love" value="lq"/>篮球
		<input type="checkbox" name="love" value="zq"/>足球
		<input type="checkbox" name="love" value="pq"/>排球	
		 <br/>
	<input type="submit" value="注册" />
</form>

<h3>数据的封装(属性驱动方式,数据封装到JavaBean对象中)</h3>
<form action="${ pageContext.request.contextPath }/reg2.action" method="post">
	姓名:<input type="text" name="user.username" /><br/>
	年龄:<input type="text" name="user.age" /><br/>
	爱好:<input type="checkbox" name="user.love" value="lq"/>篮球
		<input type="checkbox" name="user.love" value="zq"/>足球
		<input type="checkbox" name="user.love" value="pq"/>排球	
		 <br/>
	<input type="submit" value="注册" />
</form>

<h3>模型驱动的方式(数据直接封装到JavaBean对象中)</h3>
<form action="${ pageContext.request.contextPath }/reg3.action" method="post">
	姓名:<input type="text" name="username" /><br/>
	年龄:<input type="text" name="age" /><br/>
	爱好:<input type="checkbox" name="love" value="lq"/>篮球
		<input type="checkbox" name="love" value="zq"/>足球
		<input type="checkbox" name="love" value="pq"/>排球	
		 <br/>
	<input type="submit" value="注册" />
</form>
</body>
</html>

属性驱动(set属性):

package demo1;
import java.util.Arrays;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 数据的封装(属性驱动方式,数据封装到Action中)
 * @author mjl
 *
 */
public class UserAction extends ActionSupport{

	//提供属性:一定要提供对应的set方法
	private String username;
	private int age;
	private String[] love;
	public void setUsername(String username) {
		this.username = username;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setLove(String[] love) {
		this.love = love;
	}
	
	public String regist(){
		System.out.println("用户名:"+username);
		System.out.println("年龄:"+age);
		System.out.println("爱好:"+Arrays.toString(love));
		return null;
	}
}

属性驱动(set /get JavaBean):

package demo1;

import com.opensymphony.xwork2.ActionSupport;
/**
 * 数据的封装(属性驱动方式,数据封装到JavaBean对象中)
 * @author mjl
 *
 */
public class UserAction2 extends ActionSupport{
	
	//提供属性,就是User对象
	private User user;
	//必须提供get set方法
	public String regist(){
		System.out.println(user);
		return NONE;
	}

	public User getUser() {
		System.out.println("get");
		return user;
	}

	public void setUser(User user) {
		System.out.println("set");
		this.user = user;
	}
}

模型驱动(实现ModelDriven接口):

package demo1;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 模型驱动的方式(数据直接封装到JavaBean对象中)
 * 必须要实现ModelDriven接口
 * @author mjl
 *
 */
public class UserAction3 extends ActionSupport implements ModelDriven{

	private User user=new User();
	
	public User getModel() {
		
		return user;
	}
	
	public String regist(){
		System.out.println("模型驱动的方式");
		System.out.println(user);
		return NONE;
	}
}

  

  

  

  

posted @ 2018-03-05 20:08  一日看尽长安花cxjj  阅读(150)  评论(0)    收藏  举报