1. 程式人生 > >Struts2_day02---結果頁面配置、獲取表單資料、封裝資料到集合

Struts2_day02---結果頁面配置、獲取表單資料、封裝資料到集合

一、 結果頁面配置


(1)區域性結果頁面
1)對每個action進行單獨配置。
2)在<action>內部配置
(2)全域性結果頁面 :統一配置多個action

作用:使多個具有相同返回值的action返回到相同頁面

優點:統一配置,減少程式碼量

使用方法:使用<global-results>對返回值設定頁面,在<package>內部配置

生效範圍:只在<global-results>標籤所在package內生效。

示例:對下面兩個action配置相同返回值,並跳轉到相同頁面

	<!-- 全域性結果頁面配置: 將所有返回值相同的action,配置跳轉到相同頁面 -->
	<global-results>
		<result name="ok">/index.jsp</result>
	</global-results>
	
	<!-- action標籤:配置action訪問路徑 -->
	<action name="add" class="action.ActionTest" method="add">
	</action>
	<action name="delete" class="action.ActionTest" method="delete">
	</action>

注:若全域性配置中存在區域性配置,則以區域性配置為準!!

二、action中獲取表單提交資料的三種方式


(1)使用ActionContext類獲取
原因:為了使用類中getParameters()方法,該方法可獲取表單資料。

方法:
	1)Map<String,Object> getParameters();
		--返回Map物件,其中包含所有HttpServletRequest引數資訊
	2)getContext();
		ActionContext中靜態方法,用來得到ActionContext物件。
使用步驟:
	在action中:
	1)使用靜態方法getContext()獲取ActionContext物件
	2)呼叫方法獲取表單資料
	
程式碼示例:	
	/*
	 * 使用ActionContext獲取資料
	 * 	步驟:
	 * 		1)獲取ActionContext物件,使用Action.getContext.getContext()方法
	 * 		2)呼叫getParameters()方法獲取表單資料 
	 * 				方法返回值為Map
	 * 		3)使用key遍歷Map
	 */

	public class Form1 extends ActionSupport {
		
		public String execute() throws Exception {
			//1)獲取ActionContext物件
			ActionContext context = ActionContext.getContext();
			
			//2)呼叫方法得到表單資料
			Map<String, Object> map = context.getParameters();
			
			//使用key遍歷Map--根據key得到value值
			//3)得到key的集合,使用.keySet()方法。 返回值為Set<String>集合
			Set<String> keys = map.keySet();
			
			//4)遍歷,輸出
			for (String key : keys) {
				
				//因為輸入項中可能存在複選框情況,所以使用陣列形式接收value
				Object[] obj = (Object[]) map.get(key);
				System.out.println(Arrays.toString(obj));
			}
			return NONE;
		}
	}
(2)使用ServletActionContext類獲取
優點:可用來操作action域物件

背景:頁面查詢顯示操作中,需要將查詢到的資料放入域物件中,然後遍歷輸出	

程式碼示例:	
	/*
	 * 使用ServletActionContext類獲取表單書資料
	 * 	步驟:
	 * 		1)獲取request物件。 
	 * 			使用ServletActionContext類中getRequest()方法
	 * 		2)呼叫request中getParameters得到引數值
	 * 		
	 */
	public class Form2 extends ActionSupport {
		@Override
		public String execute() throws Exception {
			//1)獲取request物件。 
			HttpServletRequest request = ServletActionContext.getRequest();
			
			//2)呼叫request中getParameters得到引數值
			String username = request.getParameter("username");
			String password = request.getParameter("password");
			String address = request.getParameter("address");
			
			System.out.println(username +"--"+ password +"--"+ address);
			
			return NONE;
		}
	}

ServletActionContext類中常用方法:
在這裡插入圖片描述

(3)使用介面注入方式獲取(瞭解)
原理:讓action實現介面,從而得到request物件

/** 使用ServletActionContext類操作域物件演示
 *
 * 操作三種域物件演示
 * 	1)Request
 * 	2)Session
 * 	3)ServletContext
 * 
 * 步驟:
 * 	1)得到域物件  getXxx()
 * 	2)設定域物件屬性名、屬性值  setAttribute()
 * @author 一萬年行不行
 *
 */
public class Form3 extends ActionSupport {
	@Override
	public String execute() throws Exception {
		//操作域物件演示
		//1)Request域   得到域物件、設定屬性名,屬性值
		HttpServletRequest request = ServletActionContext.getRequest();
		request.setAttribute("req", "reqValue");
		
		//2)Session域  得到域物件、設定屬性名,屬性值
		HttpSession Session = request.getSession();
		Session.setAttribute("sess", "sessValue");
		
		//3)ServletContext域  
		//得到域物件、設定屬性名,屬性值
		ServletContext Context= ServletActionContext.getServletContext();
		Context.setAttribute("contextname", "contextValue");
		
		return NONE;
	}
}

三、 struts2中提供的獲取表單資料方式


三種方式:
	1)模型驅動封裝
	2)屬性封裝
	3)表示式封裝
1)模型驅動封裝(重點)
作用:直接把表單資料封裝到實體類物件裡面

前提條件:表單輸入項中name屬性值和實體類屬性名相同

步驟: 
	1)對action實現介面  -- implements ModelDriven<User>   User為模型類
	2)建立模型類物件
	3)實現介面中方法

程式碼示例:
	/**
	 * 使用模型驅動獲取表單資料
	 * 
	 * @author 一萬年行不行
	 *
	 */

	//1)實現介面  -- implements ModelDriven<User>
	public class Data2 extends ActionSupport implements ModelDriven<User> {
		
		//2)建立模型類物件
		private User user = new User();
		
		//3)實現介面中方法 --getModel(), 返回建立物件
		@Override
		public User getModel() {
			return user;  //返回建立物件
		}
		
		@Override
		public String execute() throws Exception {
			//測試輸出
			System.out.println(user);
			return NONE;
		}
	}

注:
1)在一個action中,獲取表單資料可以屬性封裝,也可使用模型驅動封裝,
2)不能同時使用兩種封裝獲取同一個表單資料,若同時使用,只執行模型驅動
2)屬性封裝(會用即可)
底層技術:內省。根據表單值匹配action中屬性,匹配到後直接對屬性賦值

效果:直接把表單提交屬性封裝到action的屬性裡面

缺點:不能把資料封裝到實體類物件裡面。

實現步驟:
	1)在action成員變數位置定義變數
		變數名稱和表單輸入項的name屬性值一樣
	2)生成變數的set方法(把set和get方法都寫出來)
 
程式碼演示:
	/**
	 * 使用屬性封裝獲取表單資料
	 * 
	 * @author 一萬年行不行
	 *
	 */
	public class Form4 extends ActionSupport {
		
		//1)定義變數
		//變數名稱需要和表單輸入項中name屬性值相同
		private String username;
		private String password;
		private String address;
		
		//2)生成set方法
		public void setUsername(String username) {
			this.username = username;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		public void setAddress(String address) {
			this.address = address;
		}

		@Override
		public String execute() throws Exception {
			System.out.println(username +"--"+ password +"--"+ address);
			return NONE;
		}
	}
3)表示式封裝(會用)
效果:可以把表單資料封裝到實體類物件裡面

實現步驟:
	1)在action類裡面宣告實體類
	2)生成實體類變數的set和get方法
	3)在jsp頁面中表單輸入項的name屬性值裡面寫表示式形式

程式碼示例:
	/**
	 * 表示式封裝表單資料
	 * 
	 * @author 一萬年行不行
	 *
	 */
	public class Data3 extends ActionSupport{
		
		//1)在action類裡面宣告實體類
		private User user;
		
		//2)生成實體類變數的set和get方法
		public User getUser() {
			return user;
		}

		public void setUser(User user) {
			this.user = user;
		}
		
		@Override
		public String execute() throws Exception {
			System.out.println(user);
			return NONE;
		}
	}
	
	<!-- 3)在jsp頁面中表單輸入項的name屬性值裡面寫表示式形式    -->
	username:<input type="text" name="user.username"/> <br/>
	password:<input type="password" name="user.password"/> <br/>
	address:<input type="text" name="user.address"/> <br/>
 
注:把表示式封裝也可歸類到屬性封內

	
表示式封裝和模型驅動封裝比較
	相同點:可以把資料封裝到實體類物件裡面
	不同點:表示式封裝可以封裝到不同的實體類裡面

四、struts2獲取資料封裝到集合中(會用)


(1)封裝資料到list集合
步驟:
	1)在action宣告List
	2)生成list變數的set和get方法
	3)在表單輸入項裡面寫表示式

程式碼示例:	
	/**
	 * 封裝資料到list集合
	 * @author 一萬年行不行
	 *
	 */
	public class ListAction extends ActionSupport {

		// 1)宣告List變數
		private List<User> list;
		
		// 2)生成get和set方法
		public List<User> getList() {
			return list;
		}
		public void setList(List<User> list) {
			this.list = list;
		}

		@Override
		public String execute() throws Exception {
			System.out.println(list);
			return NONE;
		}
	}
	
	jsp頁面:
	<form action="${pageContext.request.contextPath }/list.action" method="post">
	<!-- 3)在表單輸入項裡面寫表示式 -->
		<!-- list[0] : 表示list集合中第一個user物件 -->
		username:<input type="text" name="list[0].username"/>
		<br/>
		password:<input type="text" name="list[0].password"/>
		<br/>
		address:<input type="text" name="list[0].address"/>
		
		<input type="submit" value="提交"/>
	</form>
(2)封裝資料到map集合
步驟:
	1)在action宣告Map
	2)生成list變數的set和get方法
	3)在表單輸入項裡面寫表示式

程式碼示例:
	/**
	 * 封裝資料到map集合
	 * @author 一萬年行不行
	 *
	 */
	public class MapAction extends ActionSupport {

		// 1)宣告map集合
		private Map<String,User> map;
		
		// 2)生成get和set方法
		public Map<String, User> getMap() {
			return map;
		}
		public void setMap(Map<String, User> map) {
			this.map = map;
		}

		@Override
		public String execute() throws Exception {
			System.out.println(map);
			return NONE;
		}
	}
	jsp頁面:
	<form action="${pageContext.request.contextPath }/map.action" method="post">
	<!-- 3)在表單輸入項裡面寫表示式 -->
		<!-- 設定key值 map['key值']
			設定value值
		 -->
		username:<input type="text" name="map['one'].username"/>
		<br/>
		password:<input type="text" name="map['one'].password"/>
		<br/>
		address:<input type="text" name="map['one'].address"/>
	
		<input type="submit" value="提交"/>
	</form>