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";
}
}