Struts2_day02---結果頁面配置、獲取表單資料、封裝資料到集合
阿新 • • 發佈:2018-11-03
一、 結果頁面配置
(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>