结果页面配置
一、全局结果页面
1.result配置action方法的返回值到不同路径
2.创建两个action,执行默认的execute方法,让两个action的方法都返回success,配置到同一个页面
(1)如果多个action,且方法里面返回值和跳转页面都是相同的,可以使用全局结果页面配置
(2)在package标签中配置
<global-results>
<result name="success">/index.jsp</result>
</global-results>
二、局部结果页面
1.action标签内部的result标签为局部
2.同时有全局、局部时,局部生效
<action name="book" class="com.bpf.action.BookAction">
<result name="success" type="redirectAction">orders</result>
</action>
三、result标签中的type属性
1.result标签中除了name属性外还有type属性
(1)type:如何到路径里(转发还是重定向)
2.type属性值
(1)默认值,做转发操作 值是dispatcher 地址栏地址 不变
(2)重定向: redirect地址栏地址改变
3.以上两个type属性值一般用于到页面。也可以到别的action
(1)chain:转发到action 有缓存问题,一般不用
(2)redirectAction:重定向到action
action获取表单
action获取request对象
一、在JSP/Servlet阶段,提交表单到servlet中,使用request对象的方法获取表单信息
二、现在提交表单到action中,不能直接使用request对象
三、action中获取request对象主要有三种方式
(1)使用ActionContext类(直接获取数据)
(2)使用ServletActionContext类
(3)使用接口注入的方式
使用ActionContext类(直接获取数据)
Map<String,Object> getParameters()方法
(1)使用该方法需要创建ActionContext对象
(2)通过静态方法 getContext()来创建
过程:
(1)创建表单,提交到action
(2)在action使用ActionContext获取数据
//1.获取ActionContext对象
ActionContext context = ActionContext.getContext();
//2.调用方法得到表单数据
//map中的key是表单里的name值, value是输入的值
Map<String,Object> map = context.getParameters();
//获得所有key
Set<String> keys = map.keySet();
for (String key : keys) {
//遍历每个key的value 数组形式 因为可能存在复选框
Object[] obj = (Object[]) map.get(key);
}
使用ServletActionContext类
有四种主要的静态方法: getRequest、getResponse、getServletContext、getPageContext
(1)调用类中的静态方法得到request对象
(2)和以前学的一样 用request对象的各种方法
//1.获取request
HttpServletRequest request = ServletActionContext.getRequest();
//2.调用request里面的方法
String username = request.getParameter("username");
String password = request.getParameter("password");
使用接口注入的方式(了解)
(1)让action实现接口 为了得到request对象
public class Form3DemoAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request;
@Override
public String execute() throws Exception {
//第三种方式 使用接口注入类
return NONE;
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
// TODO Auto-generated method stub
this.request = arg0;
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+" "+password);
}
}
在action操作域对象
(1)servlet中的域对象:request sessionservletContext
(2)使用ServletActionContext类进行操作
//操作三个域对象
//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("cont", "contValue");
原始方式可以获取表单信息封装到实体类对象,但是代码比较繁多
struts2中提供了两种获取表单的方式
1.属性封装(会用)
a.直接把表单提交数据封装到action的属性中
b.步骤:(1)在action设置一些成员变量,这些变量名称与表单输入项的name属性值相同
(2)生成set get方法
// 定义变量 变量名称和表单输入项name属性值一致
private String username;
private String password;
// 生成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;
}
c.使用属性封装能够获取表单数据到属性中,但是无法直接封装到实体类里所以提供了模型驱动方式
2.模型驱动封装(重点)
a.使用模型驱动可以直接把表单数据封装到实体类里
b.步骤:(1)action实现接口ModelDriven
(2)实现接口里的方法getModel返回创建对象
(3)在action里创建实体类对象
public class DataDemo2Action extends ActionSupport implements ModelDriven<User> {
// 创建实体类对象
// 要求表单输入项name属性值和实体类内的成员变量名称一样
private User user = new User();
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(user);
return NONE;
}
}
c.使用模型驱动和属性封装的时候注意问题:
在一个action中,获取表单数据可以属性封装,也可以模型驱动封装,但不可以同时使用这两种方式获取同一个表单的数据,
如果同时使用,只会执行模型驱动
3.表达式封装(可以归类到属性封装中 会用)
a.使用表达式封装可以吧表单数据封装到实体类中去
b.步骤:(1)在action里声明实体类
(2)生成实体类的get set方法
(3)在表单输入项的name属性值里面写表达式
// 1.声明实体类
private User user;
// 2.声明实体类的set get方法
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
<input type="text" name="user.username">
<input type="text" name="user.password">
比较表达式封装和模型驱动封装
1.相同点:
都可以把数据封装到实体类中
2.不同点:
a.使用模型驱动只能把数据封装到一个实体类对象中
b.使用表达式封装可以把数据封装到多个实体类对象中
struts2获取数据封装到集合中(会用)
1.封装数据到list
步骤:a.在action中声明一个List
b.生成list对象的set get方法
c.在表单输入项中用表达式写法
// 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;
}
<input type="text" name="list[0].username">
<input type="text" name="list[0].password">
2.封装数据到map
步骤:a.声明一个Map集合
b.生成get set方法
c.在表单输入项中用表达式写法
// 1.声明一个Map集合
private Map<String, User> map;
// 2.生成map的get set方法
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
<input type="text" name="map['one'].username">
<input type="text" name="map['one'].password">