Struts2_day02
Struts2課程安排
第一天 struts2 入門(mén) 2017年10月27日
第二天 struts2 數(shù)據(jù) 2017年10月28日
第三天 struts2 值棧 2017年10月29日
第四天 struts2攔截器 2017年10月30日
1.結(jié)果頁(yè)面配置
1.1全局結(jié)果頁(yè)面
result標(biāo)簽配置action方法的返回值到不同的路徑里面
-
創(chuàng)建兩個(gè)action,執(zhí)行默認(rèn)的方法execute方法,讓兩個(gè)action的方法都返回success熟呛,返回success之后,配置到同一個(gè)頁(yè)面里面
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)如果多個(gè)action脸秽,方法里面返回值相同的,到頁(yè)面也是相同的牲剃,這個(gè)時(shí)候可以使用全局結(jié)果頁(yè)面配置
(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é)果頁(yè)面
<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>
- 配置全局頁(yè)面话速,也配置了局部頁(yè)面,最終以局部配置為準(zhǔn)购公,比如上面配置萌京,執(zhí)行book.action會(huì)跳轉(zhuǎn)到world.jsp頁(yè)面
1.3result標(biāo)簽type屬性
- 默認(rèn)值dispatcher做轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)地址不變宏浩,內(nèi)容變
- redirect做重定向枫夺,重定向地址和內(nèi)容都變
- 上面兩個(gè)值dispatcher、redirect绘闷,這兩個(gè)值一般針對(duì)到頁(yè)面中配置
- 配置到其他的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對(duì)象里面的方法獲取印蔗,getParameter,getParameterMap
- 提交表單到action丑勤,但是action沒(méi)有request對(duì)象华嘹,不能直接使用request對(duì)象
2.1使用ActionContext類獲取
(1)因?yàn)榉椒ú皇庆o態(tài)的方法,需要?jiǎng)?chuàng)建ActionContext類的對(duì)象
(2)這個(gè)ActionContext類對(duì)象不是new出來(lái)的法竞,
- 具體演示
(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對(duì)象
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使用接口注入方式獲惹看臁(了解)
讓action實(shí)現(xiàn)ServletRequestAware接口,得到request對(duì)象
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對(duì)象
// 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í)體類對(duì)象,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屬性封裝(會(huì)用)
直接把表單內(nèi)容封裝到action的屬性里面型宝,只能封裝到類屬性里面八匠,不能封裝到對(duì)象里面
實(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ū)動(dòng)封裝(重點(diǎn))
- 使用模型驅(qū)動(dòng)方式趴酣,可以直接把表單數(shù)據(jù)封裝到實(shí)體類對(duì)象里面
- 要求:實(shí)體類里面的成員屬性名和表單name名一樣
- 實(shí)現(xiàn)步驟:
(1)action
實(shí)現(xiàn)接口ModelDriven
public class FormAction extends ActionSupport implements ModelDriven<User>
泛型要寫(xiě)封裝數(shù)據(jù)的類的類型
(2)實(shí)現(xiàn)接口里面的方法 getModel方法把創(chuàng)建對(duì)象返回
// 返回創(chuàng)建的user對(duì)象
public User getModel() {
return user;
}
(3)在action里面創(chuàng)建實(shí)體類對(duì)象
// 創(chuàng)建對(duì)象
private User user = new User();
- 使用模型驅(qū)動(dòng)和屬性封裝注意問(wèn)題:
- 在一個(gè)action中梨树,獲取表單數(shù)據(jù)可以屬性封裝,也可以使用模型驅(qū)動(dòng)封裝岖寞,但不能同時(shí)使用屬性封裝和模型驅(qū)動(dòng)封裝獲取同一個(gè)表單數(shù)據(jù)抡四,如果同時(shí)使用,只會(huì)執(zhí)行模型驅(qū)動(dòng)
3.4表達(dá)式封裝(會(huì)用)
- 實(shí)現(xiàn)過(guò)程
(1)使用表達(dá)式封裝可以把表單數(shù)據(jù)封裝到實(shí)體類對(duì)象里面
(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屬性值里面寫(xiě)表達(dá)式形式
<form action="${pageContext.request.contextPath }/form4.action" method="post">
<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫(xiě)表達(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ū)動(dòng)封裝比較
-
相同點(diǎn):
可以把數(shù)據(jù)封裝到實(shí)體類對(duì)象里面
-
不同點(diǎn):
表達(dá)式封裝可以封裝到不同的實(shí)體類里面
使用模型驅(qū)動(dòng)只能把數(shù)據(jù)封裝到一個(gè)實(shí)體類對(duì)象里面
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ù)封裝到集合中(會(huì)用)
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)里面寫(xiě)表達(dá)式
<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫(xiě)表達(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)里面寫(xiě)表達(dá)式
<!-- 3.在表單輸入項(xiàng)的name屬性值里面寫(xiě)表達(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"/>