Struts2結果頁面配置
全局結果頁面
場景:多個action,有相同的方法返回值,且都到同一個結果頁面
需求:創建兩個action,執行默認的方法execute方法,讓兩個action的方法都返回success,返回success之後,配置到同一個結果頁面
(1)未使用全局結果頁面,需要分別配置
創建兩個action,並且默認方法execute都返回success
public class BookAction extends ActionSupport {
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return "success";
}
}
public class UserAction extends ActionSupport {
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return "success";
}
}
分別配置結果頁面
<struts>
<package name="demo" extends="struts-default" namespace="/">
<action name="book" class="cn.itcast.action.BookAction">
<result name="success">/index.jsp</result>
</action>
<action name="user" class="cn.itcast.action.UserAction">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
(2)使用全局結果頁面,只需要在package標籤下,使用<golbal-results>標籤和<result>標籤即可
如果多個action,方法裏面返回值是相同的,且到同一個結果頁面,這個時候可以在package標籤裏面,使用全局結果頁面配置。
<struts>
<package name="demo" extends="struts-default" namespace="/">
<global-results >
<result name="success">/index.jsp</result>
</global-results>
<action name="book" class="cn.itcast.action.BookAction">
</action>
<action name="user" class="cn.itcast.action.UserAction">
</action>
</package>
</struts>
局部結果頁面
在package標籤下,配置的結果頁面是全局結果頁面
<global-results >
<result name="success">/index.jsp</result>
</global-results>
在action標籤下,配置的結果頁面是局部結果頁面
<action name="book" class="cn.itcast.action.BookAction">
<result name="success">/index.jsp</result>
</action>
注意:既配置了全局頁面,也配置了局部頁面,最終以局部頁面配置爲準
result標籤中type屬性
(1)type屬性表示如何到路徑裏面(轉發還是重定向)
- 轉發(dispatcher),默認值
- 重定向(redirect)
示例:兩個action的execute方法,分別採用轉發和重定向到結果頁面
<struts>
<package name="demo" extends="struts-default" namespace="/">
<action name="book" class="cn.itcast.action.BookAction">
<result name="success" type="dispatcher">/hello.jsp</result>
</action>
<action name="user" class="cn.itcast.action.UserAction">
<result name="success" type="redirect">/hello.jsp</result>
</action>
</package>
</struts>
(2)上面兩個值dispatcher,redirect這兩個值一般針對跳轉到頁面中配置,配置到其他action裏面使用chain,redirectAcion
- chain:轉發到action(一般不用,緩存問題)
- redirectAction:重定向到action--------直接寫action的訪問名稱,即要重定向的action的name屬性值
示例:兩個action(book和user)的execute方法,訪問book的action時,將請求重定向到user的action
public class BookAction extends ActionSupport {
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("book");
return "success";
}
}
public class UserAction extends ActionSupport {
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("user");
return "success";
}
}
<struts>
<package name="demo" extends="struts-default" namespace="/">
<action name="book" class="cn.itcast.action.BookAction">
<result name="success" type="redirectAction">/user</result>
</action>
<action name="user" class="cn.itcast.action.UserAction">
<result name="success" type="redirect">/hello.jsp</result>
</action>
</package>
</struts>
在action中獲取表單提交的數據
之前在web階段,提交表單數據到Servlet中,在Servlet中使用request對象的getParameter方法獲取。
現在提交表單數據到action中,但是action中沒有request對象,所以不能直接使用request對象,需要先獲取request對象。
使用一下幾種方式,不需要得到request對象,即可獲取表單數據。
(1)使用ActionContext類獲取
使用這種方式,不需要得到request對象,即可獲取表單數據。
使用ActionContext類中的getParameters()方法,獲取包含所有HttpServletRequest參數信息的map對象
Map<String,Object> getParameters() //返回一個包含所有HttpServletRequest參數信息的map對象
因爲這個方法不是靜態的,所以需要創建ActionContext類的對象。但是這個ActionContext類對象不可以採用new的方式來獲取,需要使用getContext()方法獲取ActionContext類對象
static ActionContext getContext() //獲取當前線程的ActionContext對象
示例:
書寫form表單,並將form表單提交到對應的action中
<body>
<h1>表單提交demo</h1>
<hr/>
<form action="form" method="post">
用戶名:<input type="text" name="uname" value=""/>
密碼:<input type="password" name="pwd" value=""/>
<input type="submit" value="提交"/>
</form>
</body>
書寫form表單處理的action
public class FormAction extends ActionSupport {
@Override
public String execute() throws Exception {
//獲取ActionContext對象
ActionContext ac=ActionContext.getContext();
//調用方法得到表單數據
//key是表單輸入項name屬性值,value是表單輸入項value屬性值
Map<String,Object> map=ac.getParameters();
//遍歷map
Set<String> keys=map.keySet();
for(String key:keys){
//根據key得到value
//value是數組形式,因爲輸入項裏面可能由複選框的情況
Object[] obj=(Object[]) map.get(key);
System.out.println(Arrays.toString(obj));
}
return "none";
}
}
配置struts.xml文件
<action name="form" class="cn.itcast.action.FormAction">
</action>
(2)使用ServletActionContext類獲取
調用類裏面的靜態方法,即可得到request對象,response對象等
示例:
書寫form表單,並將form表單提交到對應的action中
<body>
<h1>表單提交demo</h1>
<hr/>
<form action="form" method="post">
用戶名:<input type="text" name="uname" value=""/>
密碼:<input type="password" name="pwd" value=""/>
<input type="submit" value="提交"/>
</form>
</body>
書寫form表單處理的action
public class FormAction extends ActionSupport {
@Override
public String execute() throws Exception {
//使用ServletActionContext類獲取request對象
HttpServletRequest request=ServletActionContext.getRequest();
//調用request對象裏面的方法得到結果
String unameString= request.getParameter("uname");
String pwdString= request.getParameter("pwd");
System.out.println(unameString+"---"+pwdString);
return "none";
}
}
配置struts.xml文件
<action name="form" class="cn.itcast.action.FormAction">
</action>
(3)使用接口注入方式獲取(一般不用)
讓action實現接口,爲了得到request對象
示例:
書寫form表單,並將form表單提交到對應的action中
<body>
<h1>表單提交demo</h1>
<hr/>
<form action="form" method="post">
用戶名:<input type="text" name="uname" value=""/>
密碼:<input type="password" name="pwd" value=""/>
<input type="submit" value="提交"/>
</form>
</body>
書寫form表單處理的action
public class FormAction implements ServletRequestAware {
HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
public String execute(){
String uname=request.getParameter("uname");
String pwd=request.getParameter("pwd");
System.out.println(uname+"---"+pwd);
return "none";
}
}
配置struts.xml文件
<action name="form" class="cn.itcast.action.FormAction">
</action>
在action中操作域對象
在Servlet中,有三個域對象,分別是request域,session域,servletcontext域
使用ServletActionContext類來操作三個域對象:
public class FormAction {
public String execute(){
//request域
HttpServletRequest request=ServletActionContext.getRequest();
request.setAttribute("req", "reqValue");
//session域
HttpSession session=request.getSession();
session.setAttribute("session", "sessionValue");
//ServletContext域
ServletContext context=ServletActionContext.getServletContext();
context.setAttribute("context", "contextValue");
return "none";
}
}
Struts2提供獲取表單數據的方式
原始方式獲取表單數據封裝到實體類對象(使用ServletActionContext類獲取request對象,並獲取表單數據)
示例:
實體類代碼:
public class User {
private String username;
private String password;
private String address;
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 User(String username, String password, String address) {
super();
this.username = username;
this.password = password;
this.address = address;
}
public User() {
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password
+ ", address=" + address + "]";
}
}
獲取表單數據的action類:
public class UserAction extends ActionSupport {
@Override
public String execute() throws Exception {
//獲取表單數據
HttpServletRequest request=ServletActionContext.getRequest();
String username=request.getParameter("username");
String password=request.getParameter("password");
String address=request.getParameter("address");
//封裝到實體類對象中
User user=new User();
user.setUsername(username);
user.setPassword(password);
user.setAddress(address);
System.out.println(user);
return "none";
}
}
(1)屬性封裝
直接把表單提交數據封裝到action的屬性裏面
使用屬性封裝獲取表單數據到屬性裏面,不能把數據直接封裝到實體類對象裏面
實現步驟:
- 在action成員變量位置定義變量(變量名稱和表單輸入項的name屬性值一樣)
- 生成變量的set方法(把set和get方法都寫出來)
示例:
public class UserAction extends ActionSupport {
//定義變量(變量名稱與表單name屬性值一樣)
private String username;
private String password;
private String address;
//生成變量的set和get方法
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;
}
@Override
public String execute() throws Exception {
System.out.println(username+"---"+password+"---"+address);
return "none";
}
}
(2)模型驅動封裝(重點)
使用模型驅動方式,可以直接把表單數據封裝到實體類對象裏面
實現步驟:(前提要求:表單輸入項name屬性值和實體類屬性名稱一樣)
- action實現接口ModelDriver
- 實現接口裏面的方法getModel方法
- 在action裏面創建實體類對象
示例:
創建實體類:
public class User {
private String username;
private String password;
private String address;
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 User(String username, String password, String address) {
super();
this.username = username;
this.password = password;
this.address = address;
}
public User() {
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password
+ ", address=" + address + "]";
}
}
創建action類,實現ModelDriver接口,重寫getModel方法
public class UserAction extends ActionSupport implements ModelDriven<User> {
User user=new User();
@Override
public String execute() throws Exception {
System.out.println(user);
return "none";
}
@Override
public User getModel() {
//返回創建的user對象
return user;
}
}
使用屬性封裝和模型驅動封裝注意問題:
- 在action中,獲取表單數據可以使用屬性封裝,也可以使用模型驅動封裝,但是不能同時使用屬性封裝和模型驅動封裝獲取同一個表單數據。
(3)表達式封裝
使用表達式封裝也可以把表單數據封裝到實體類對象裏面
實現步驟:
- 在action裏面聲明實體類
- 生成實體類變量的set和get方法
- 在表單輸入項的name屬性值裏面書寫表達式形式
示例:
創建實體類:
public class User {
private String username;
private String password;
private String address;
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 User(String username, String password, String address) {
super();
this.username = username;
this.password = password;
this.address = address;
}
public User() {
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password
+ ", address=" + address + "]";
}
}
創建action類,聲明實體類,並書寫實體類的get和set方法
public class UserAction extends ActionSupport {
//聲明實體類
User user;
//生成實體類變量的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";
}
}
在表單輸入項的name屬性值裏面書寫表達式形式
<body>
<h1>form表單提交demo</h1>
<hr/>
<form action="user" method="post">
username:<input type="text" name="user.username" value=""/><br/>
password:<input type="password" name="user.password" value=""/><br/>
address:<input type="text" name="user.address" value=""/><br/>
<input type="submit" value="提交"/>
</form>
</body>
比較表達式封裝和模型驅動封裝
相同點:
- 使用表達式封裝和模型驅動封裝都可以把數據封裝到實體類對象裏面
不同點:
- 使用模型驅動只能把數據封裝到一個實體類對象裏面,在一個action裏面不能使用模型驅動把數據封裝到不同的實體對象裏面
- 使用表達式封裝可以把數據封裝到不同的實體類對象裏面
示例:使用表達式封裝將表單數據封裝到不同實體類對象裏面,這裏建立兩個實體類,分別爲User和Book。
創建實體類:
public class User {
private String username;
private String password;
private String address;
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 User(String username, String password, String address) {
super();
this.username = username;
this.password = password;
this.address = address;
}
public User() {
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password
+ ", address=" + address + "]";
}
}
public class Book {
private String bname;
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public Book(String bname) {
super();
this.bname = bname;
}
public Book() {
}
@Override
public String toString() {
return "Book [bname=" + bname + "]";
}
}
創建action類,聲明實體類,並書寫實體類的get和set方法
public class UserAction extends ActionSupport {
//聲明實體類
User user;
Book book;
//生成實體類變量的set和get方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
@Override
public String execute() throws Exception {
System.out.println(user);
System.out.println(book);
return "none";
}
}
在表單輸入項的name屬性值裏面書寫表達式形式
<body>
<h1>form表單提交demo</h1>
<hr/>
<form action="user" method="post">
username:<input type="text" name="user.username" value=""/><br/>
password:<input type="password" name="user.password" value=""/><br/>
address:<input type="text" name="user.address" value=""/><br/>
bookname:<input type="text" name=book.bname value=""/></br>
<input type="submit" value="提交"/>
</form>
</body>
Struts2獲取數據封裝到集合中(會用)
(1)封裝到list集合
實現步驟:
- 在action中聲明List
- 生成List變量的set和get方法
- 在表單輸入項裏面書寫表達式
示例:
書寫form表單,以提交多個用戶的數據信息,在表單輸入項的name屬性值裏面書寫表達式形式(採用List集合)
<body>
<h1>form表單提交demo</h1>
<hr/>
<form action="user" method="post">
username:<input type="text" name="list[0].username" value=""/><br/>
password:<input type="password" name="list[0].password" value=""/><br/>
address:<input type="text" name="list[0].address" value=""/><br/>
<hr/>
username:<input type="text" name="list[1].username" value=""/><br/>
password:<input type="password" name="list[1].password" value=""/><br/>
address:<input type="text" name="list[1].address" value=""/><br/>
<hr/>
<input type="submit" value="提交"/>
</form>
</body>
創建action類,聲明List集合類,並書寫List類對象的get和set方法
public class UserAction extends ActionSupport {
private List<User> list;
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";
}
}
(2)封裝到map集合
實現步驟:
- 在action中聲明Map
- 生成Map變量的set和get方法
- 在表單輸入項裏面書寫表達式
示例:
書寫form表單,以提交多個用戶的數據信息,在表單輸入項的name屬性值裏面書寫表達式形式(採用Map集合)
<body>
<h1>form表單提交demo</h1>
<hr/>
<form action="user" method="post">
username:<input type="text" name="map['one'].username" value=""/><br/>
password:<input type="password" name="map['one'].password" value=""/><br/>
address:<input type="text" name="map['one'].address" value=""/><br/>
<hr/>
username:<input type="text" name="map['one'].username" value=""/><br/>
password:<input type="password" name="map['one'].password" value=""/><br/>
address:<input type="text" name="map['one'].address" value=""/><br/>
<hr/>
<input type="submit" value="提交"/>
</form>
</body>
創建action類,聲明Map集合類,並書寫Map類對象的get和set方法
public class UserAction extends ActionSupport {
private Map<String, User> map;
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";
}
}