一、结果页面配置
全局结果页面
1.result标签配置action方法的返回值到不同的路径
2.创建两个action,执行默认的execute方法,让两个方法都返回success,返回success后,跳转到同一个页面
<package name="demo1" extends="struts-default" namespace="/">
<action name="book" class="cn.itcast.action.BookAction">
<result name="success">/hello.jsp</result>
</action>
<action name="order" class="cn.itcast.action.OrderAction">
<result name="success">/hello.jsp</result>
</action>
</package>
(1)如果多个action方法的返回值相同,跳转到的页面也是相同的,此时可以使用全局结果页面配置
(2)在package标签中使用<global-results>标签
<package name="demo1" extends="struts-default" namespace="/">
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
<action name="book" class="cn.itcast.action.BookAction">
<!-- <result name="success">/hello.jsp</result> -->
</action>
<action name="order" class="cn.itcast.action.OrderAction">
<!-- <result name="success">/hello.jsp</result> -->
</action>
</package>
局部结果页面
1.局部结果页面就是在每个action标签下配置的
<action name="book" class="cn.itcast.action.BookAction">
<result name="success">/hello.jsp</result>
</action>
2.全局结果页面和局部结果页面同时配置的情况下,以局部的为准。例如此时,将跳转到world.jsp,而不是hello.jsp
<global-results>
<result name="success">/hello.jsp</result>
</global-results>
<action name="book" class="cn.itcast.action.BookAction">
<result name="success">/world.jsp</result>
</action>
二、result标签的type属性
1.配置如何到路径中去(转发或重定向)
2.默认值为dispatcher,做转发操作,一次请求,地址栏不变
3.若值为redirect,做重定向操作,两次请求,地址栏改变
4.上面的两个值一般用于跳转到页面中,还可以跳转到其他action中
-chain:转发到action(一般不用)
-redirectAction:重定向到action
当执行book.action时要跳转到order.action,此时result标签的值为order.action的访问名称
<package name="demo1" extends="struts-default" namespace="/">
<action name="book" class="cn.itcast.action.BookAction">
<result name="success" type="redirectAction">order</result>
</action>
<action name="order" class="cn.itcast.action.OrderAction">
<result name="success" type="redirect">/hello.jsp</result>
</action>
</package>
三、action获取表单提交数据
1.使用ActionContext类获取
(1)创建表单,填写并提交数据
<form action="${pageContext.request.contextPath }/form1.action" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
地址:<input type="text" name="address"/><br/>
<input type="submit" value="提交"/>
</form>
(2)在action方法中创建ActionContext对象获取数据
public String execute() throws Exception {
//第一种 使用ActionContext类获取
//1.获取ActionContext对象
ActionContext context = ActionContext.getContext();
//2.调用方法得到表单数据
//key是表单中控件name;value是值,形式为object数组
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 NONE;
}
2.使用ServletActionContext类获取
(1)调用类里面静态方法,得到request对象
public String execute() throws Exception {
//第二种 使用ServletActionContext类获取
//1.获取request对象
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address");
System.out.println(username+"-"+password+"-"+address);
return NONE;
}
3.使用接口注入(了解)
(1)让action实现接口来得到request对象,再使用request对象获取数据
public class Form1Demo3 extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub
this.request = arg0;
}
public String execute() throws Exception {
//第三种 使用ServletRequestAware接口获取
//1.使用上面获取的request对象
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address");
System.out.println(username+"-"+password+"-"+address);
return NONE;
}
}
4.在action操作域对象
request、session、servletContext 三个域对象
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("context", "contextValue");
return NONE;
}
四、Struts2封装获取表单数据方式
1.原始方法获取表单数据并封装到实体类对象
public String execute() throws Exception {
//1.获取表单数据
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
String password = request.getParameter("password");
String address = request.getParameter("address");
//2.封装到实体对象中
User user = new User(username, password, address);
System.out.println(user.toString());
return NONE;
}
2.属性封装
直接把表单提交属性封装到action的属性里面
(1)在action成员变量位置定义变量,变量名称和表单输入项的name属性值一样
(2)生成变量的get和set方法
(3)这种方法可以把表单数据封装到action类的属性里面,并不能直接封装到实体类对象中
public class DataDemo1 extends ActionSupport{
//使用属性封装获取表单数据
//1.定义变量,变量名称需要与表单控件的name属性值一致
private String username;
private String password;
private String address;
//2.生成变量的get和set方法
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;
}
}
3.模型驱动封装(重点)
(1)让action类实现接口ModelDriven
(2)实现接口中的getModel方法,返回创建的对象
(3)这种方法,可以直接把表单数据封装到实体类对象中
public class DataDemo2 extends ActionSupport implements ModelDriven<User>{
//使用模型驱动封装获取表单数据
//1.创建对象,表单控件name属性值要与实体类属性名称一致
User user = new User();
//2.返回对象
public User getModel() {
return user;
}
public String execute() throws Exception{
System.out.println(user.toString());
return NONE;
}
}
4.表达式封装(会用)
(1)在action里面生命实体类
(2)生成实体类对象的get和set方法
(3)在表单输入控件的name属性值里面写表达式形式 类名.属性名
public class DataDemo3 extends ActionSupport{
//使用表达式封装获取表单数据
//1.声明对象
private User user;
//2.生成实体类对象的get和set方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String execute() throws Exception{
System.out.println(user.toString());
return NONE;
}
}
<form action="${pageContext.request.contextPath }/data3.action" method="post">
用户名:<input type="text" name="user.username"/><br/>
密码:<input type="text" name="user.password"/><br/>
地址:<input type="text" name="user.address"/><br/>
<input type="submit" value="提交"/>
</form>
5.模型驱动封装和表达式封装比较
- 相同点
(1)都可以把数据封装到实体类对象中
- 不同点
(1)在一个action中,模型驱动封装只能把数据封装到一个实体类中
(2)表达式封装可以把数据封装到不同的实体类中
public class DataDemo4 extends ActionSupport{
//使用表达式封装获取表单数据
//1.声明对象
private User user;
private Book book;
//2.生成实体类对象的get和set方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
//再创建一个book实体类
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public String execute() throws Exception{
System.out.println(user.toString());
System.out.println(book.getBname());
return NONE;
}
}
<form action="${pageContext.request.contextPath }/data4.action" method="post">
用户名:<input type="text" name="user.username"/><br/>
密码:<input type="text" name="user.password"/><br/>
地址:<input type="text" name="user.address"/><br/>
书名:<input type="text" name="book.bname"/><br/>
<input type="submit" value="提交"/>
</form>
五、Struts2获取表单数据封装到集合(会用)
1.List集合
(1)在action声明List
(2)生成List变量的get和set方法
(3)在表单输入项name属性中写表达式
public class ListDemo extends ActionSupport{
//封装数据到List集合
//1.声明List变量
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;
}
}
<form action="${pageContext.request.contextPath }/list.action" method="post">
用户名:<input type="text" name="list[0].username"/><br/>
密码:<input type="text" name="list[0].password"/><br/>
地址:<input type="text" name="list[0].address"/><br/><br/>
用户名:<input type="text" name="list[1].username"/><br/>
密码:<input type="text" name="list[1].password"/><br/>
地址:<input type="text" name="list[1].address"/><br/>
<input type="submit" value="提交"/>
</form>
2.Map集合
public class MapDemo extends ActionSupport{
//封装数据到Map集合
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;
}
}
<form action="${pageContext.request.contextPath }/map.action" method="post">
用户名:<input type="text" name="map['one'].username"/><br/>
密码:<input type="text" name="map['one'].password"/><br/>
地址:<input type="text" name="map['one'].address"/><br/><br/>
用户名:<input type="text" name="map['two'].username"/><br/>
密码:<input type="text" name="map['two'].password"/><br/>
地址:<input type="text" name="map['two'].address"/><br/>
<input type="submit" value="提交"/>
</form>