Struts2_day02
Struts2課程安排
第一天 struts2 入門 2017年10月27日
第二天 struts2 數(shù)據(jù) 2017年10月28日
第三天 struts2 值棧 2017年10月29日
第四天 struts2攔截器 2017年10月30日
1.結(jié)果頁面配置
1.1全局結(jié)果頁面
result標(biāo)簽配置action方法的返回值到不同的路徑里面
-
創(chuàng)建兩個action,執(zhí)行默認(rèn)的方法execute方法,讓兩個action的方法都返回success,返回success之后,配置到同一個頁面里面
public class BookAction extends ActionSupport { public String execute() throws Exception { return "success"; } } public class OrdersAction extends ActionSupport { public String execute() throws Exception { return "success"; } }(1)如果多個action,方法里面返回值相同的,到頁面也是相同的,這個時候可以使用全局結(jié)果頁面配置
(2)在package標(biāo)簽里面配置
<package name="action1" extends="struts-default" namespace="/"> <action name="book" class="com.ghw.action.BookAction"> <result name="success" type="redirect">/hello.jsp</result> </action> <action name="order" class="com.ghw.action.OrdersAction"> <result name="success">/hello.jsp</result> </action> </package>
1.2局部結(jié)果頁面
<package name="action1" extends="struts-default" namespace="/">
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
<action name="book" class="com.ghw.action.BookAction">
<result name="success">/world.jsp</result>
</action>
<action name="order" class="com.ghw.action.OrdersAction"></action>
</package>
- 配置全局頁面,也配置了局部頁面,最終以局部配置為準(zhǔn),比如上面配置,執(zhí)行book.action會跳轉(zhuǎn)到world.jsp頁面
1.3result標(biāo)簽type屬性
- 默認(rèn)值dispatcher做轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)地址不變,內(nèi)容變
- redirect做重定向,重定向地址和內(nèi)容都變
- 上面兩個值dispatcher、redirect,這兩個值一般針對到頁面中配置
- 配置到其他的action里面
- chain:轉(zhuǎn)發(fā)到action
- redirectAction:重定向到action
<action name="book" class="com.ghw.action.BookAction">
<result name="success" type="redirectAction">order</result>
</action>
<action name="book" class="com.ghw.action.BookAction">
<result name="success" type="chain">order</result>
</action>
2.在action獲取表單提交數(shù)據(jù)
- 之前web階段,提交表單到servlet里面,在servlet里面使用request對象里面的方法獲取,getParameter,getParameterMap
- 提交表單到action,但是action沒有request對象,不能直接使用request對象
2.1使用ActionContext類獲取

(1)因?yàn)榉椒ú皇庆o態(tài)的方法,需要創(chuàng)建ActionContext類的對象
(2)這個ActionContext類對象不是new出來的,

- 具體演示
(1)創(chuàng)建表單,提交表單到action里面
<form action="${pageContext.request.contextPath }/form4.action" method="post">
username:<input type="text" name="username"/>
<br/>
password:<input type="text" name="password"/>
<br/>
address:<input type="text" name="address"/>
<br/>
<input type="submit" value="submit"/>
</form>
(2)在action使用ActionContext獲取數(shù)據(jù)
public class FormAction extends ActionSupport {
public String execute() throws Exception {
ActionContext context = ActionContext.getContext();
Map<String, Object> map = context.getParameters();
Set<String> keys = map.keySet();
for (String key : keys) {
Object[] obj = (Object[]) map.get(key);
System.out.println(Arrays.toString(obj));
}
return "success";
}
}
2.2使用ServletActionContext類獲取
public class FormAction extends ActionSupport {
public String execute() throws Exception {
// 1.使用Servlet類獲取request對象
HttpServletRequest httpServletRequest = ServletActionContext.getRequest();
// 2.使用request里面的方法得到結(jié)果
String username = httpServletRequest.getParameter("username");
String password = httpServletRequest.getParameter("password");
String address = httpServletRequest.getParameter("address");
System.out.println("username:" + username + " password:" + password + " address" + address);
return "success";
}
}
2.3使用接口注入方式獲?。私猓?/h3>
讓action實(shí)現(xiàn)ServletRequestAware接口,得到request對象
package com.ghw.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
public class FormAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
public HttpServletRequest getRequest() {
return request;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String execute() throws Exception {
// 1.使用Servlet類獲取request對象
// 2.使用request里面的方法得到結(jié)果
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address");
System.out.println("username:" + username + " password:" + password + " address" + address);
return "success";
}
}
2.4在action操作域?qū)ο?/h3>
- request、session、servletContext域?qū)ο?/li>
- 使用ServletActionContext類操作
3.獲取表單數(shù)據(jù)方式
3.1原始方式(了解)

原始方式獲取表單封裝到實(shí)體類對象,2.1-2.3方法中只是把表單內(nèi)容獲取
public String execute() throws Exception {
// 1.獲取表單數(shù)據(jù)
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address");
// 2.封裝到實(shí)體類中
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setAddress(address);
System.out.println(
"username:" + user.getUsername() + " password:" + user.getPassword() + " address:" + user.getAddress());
return "success";
}
3.2屬性封裝(會用)
直接把表單內(nèi)容封裝到action的屬性里面,只能封裝到類屬性里面,不能封裝到對象里面
實(shí)現(xiàn)步驟:
- 在action中定義成員變量,變量名稱和表單輸入項(xiàng)name屬性值一樣
- 生成變量的get和set方法
package com.ghw.action;
import com.opensymphony.xwork2.ActionSupport;
public class FormAction extends ActionSupport {
// 1.定義與表單name相同的變量名
private String username;
private String password;
private String address;
// 2.生成setter和getter方法
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 String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String execute() throws Exception {
System.out.println("username:" + username + " password:" + password + " address" + address);
return "success";
}
}
3.3模型驅(qū)動封裝(重點(diǎn))
- 使用模型驅(qū)動方式,可以直接把表單數(shù)據(jù)封裝到實(shí)體類對象里面
- 要求:實(shí)體類里面的成員屬性名和表單name名一樣
- 實(shí)現(xiàn)步驟:
(1)action實(shí)現(xiàn)接口ModelDriven
public class FormAction extends ActionSupport implements ModelDriven<User>
泛型要寫封裝數(shù)據(jù)的類的類型
(2)實(shí)現(xiàn)接口里面的方法 getModel方法把創(chuàng)建對象返回
// 返回創(chuàng)建的user對象
public User getModel() {
return user;
}
(3)在action里面創(chuàng)建實(shí)體類對象
// 創(chuàng)建對象
private User user = new User();
- 使用模型驅(qū)動和屬性封裝注意問題:
- 在一個action中,獲取表單數(shù)據(jù)可以屬性封裝,也可以使用模型驅(qū)動封裝,但不能同時使用屬性封裝和模型驅(qū)動封裝獲取同一個表單數(shù)據(jù),如果同時使用,只會執(zhí)行模型驅(qū)動
3.4表達(dá)式封裝(會用)
- 實(shí)現(xiàn)過程
(1)使用表達(dá)式封裝可以把表單數(shù)據(jù)封裝到實(shí)體類對象里面
(2)把表達(dá)式封裝歸類到屬性封裝里面
第一步 在action里面聲明實(shí)體類
// 1.聲明實(shí)體類
private User user;
第二步 生成實(shí)體類變量的set和get方法
// 2.生成實(shí)體類的setter和getter方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
第三步 在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式
<form action="${pageContext.request.contextPath }/form4.action" method="post">
<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式 -->
username:<input type="text" name="user.username"/>
<br/>
password:<input type="text" name="user.password"/>
<br/>
address:<input type="text" name="user.address"/>
<br/>
<input type="submit" value="submit"/>
</form>
3.5表達(dá)式封裝和模型驅(qū)動封裝比較
-
相同點(diǎn):
可以把數(shù)據(jù)封裝到實(shí)體類對象里面
-
不同點(diǎn):
表達(dá)式封裝可以封裝到不同的實(shí)體類里面
使用模型驅(qū)動只能把數(shù)據(jù)封裝到一個實(shí)體類對象里面
private User user; private Book book; public User getUser() { return user; } public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } public void setUser(User user) { this.user = user; }username:<input type="text" name="user.username"/> <br/> password:<input type="text" name="book.password"/> <br/> address:<input type="text" name="user.address"/> <br/>
4.數(shù)據(jù)封裝到集合中(會用)
4.1封裝到list集合
第一步 在action聲明List
第二步 生成list變量的set和get方法
// 1.聲明list變量
private List<User> list;
// 2.生成list的set,get方法
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
第三步 在表單輸入項(xiàng)里面寫表達(dá)式
<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式 -->
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"/>
<br/>
username:<input type="text" name="list[1].username"/>
<br/>
password:<input type="text" name="list[1].password"/>
<br/>
address:<input type="text" name="list[1].address"/>
<br/>
4.2封裝到map集合
第一步 在action聲明Map
// 1.聲明map變量
private Map<String, User> map;
第二步 生成map變量的set和get方法
// 2.生成map的set,get方法
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
第三步 在表單輸入項(xiàng)里面寫表達(dá)式
<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫表達(dá)式形式 -->
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"/>
<br/>
username:<input type="text" name="map['two'].username"/>
<br/>
password:<input type="text" name="map['two'].password"/>
<br/>
address:<input type="text" name="map['two'].address"/>
<br/>
<input type="submit" value="submit"/>