引入
1 之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap
2 提交表单到action,但是action没有request对象,不能直接使用request对象
一 在action获取表单提交数据
1 使用ActionContext类获取
Map
返回一个包含所有HttpServletRequest参数
(1)因为方法不是静态的方法,需要创建ActionContext类对象
(2)这个ActionContext类对象不是new出来的
static ActionContext getContext()
获取当前线程的ActionContext对象
(3)演示
- 创建表单,提交表单到action里面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
- 写action方法
package Form;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
public class Form1DemoAction extends ActionSupport {
@Override
public String execute() throws Exception {
//第一种方式
//1 使用ActionContext类对象
ActionContext context = ActionContext.getContext();
//2 调用方法得到表单数据
// key 是表单输入项name属性值,value是输入的值
Map map= context.getParameters();
Set keys = map.keySet();
for (String key : keys){
//根据key得到value
//数组形式:因为输入项里面可能有复选框
Object[
] objects= (Object[]) map.get(key);
System.out.println(Arrays.toString(objects));
}
return NONE;
}
}
- 配置核心文件
2 使用ServletActionContext类获取
(1)static HttpServletRequest getRequest()
获取Web应用的HttpServletRequest对象
(2)static HttpServletResponse getResponse()
获取Web应用的HttpServletResponse对象
(3)static ServletContext getServletContext()
获取Web应用的ServletContext对象
(4)static PageContext getPageContext()
获取Web应用的PageContext对象
(5)演示
- 创建表单,提交表单到action里面
<%--
Created by IntelliJ IDEA.
User: pc
Date: 2017/10/9
Time: 21:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Title
- 写action方法
package Form;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
public class Form2DemoAction extends ActionSupport {
@Override
public String execute() throws Exception {
//第二种方式 使用ServletAction类获取
//1 使用ServletActionContext获取request对象
HttpServletRequest request= ServletActionContext.getRequest();
//2 调用request里面的方法得到结果
String username = request.getParameter("username");
String password = request.getParameter("password");
String address= request.getParameter("address");
System.out.println(username+" "+password+" "+address);
return NONE;
}
}
- 配置核心文件
3 使用接口注入方式获取(了解)
package Form;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
import javax.servlet.http.HttpServletRequest;
public class Form3DemoAction extends ActionSupport implements ServletRequestAware {
private HttpServletRequest request =null;
public void setServletRequest(HttpServletRequest httpServletRequest) {
this.request = request;
}
@Override
public String execute() throws Exception {
String username= request.getParameter("username");
System.out.println(username);
return NONE;
}
}
4 操作action域对象
(1)request
//1 request域
HttpServletRequest request1 = ServletActionContext.getRequest();
request1.setAttribute("req","reqValue");
(2)session
//2 session域
HttpSession session= request1.getSession();
session.setAttribute("sess","sessValue");
(3)ServletContext
//3 ServletContext域
ServletContext context = ServletActionContext.getServletContext();
context.setAttribute("contextname","contextValue");
二 Struts2提供获取表单数据方式
1 原始方式获取表单封装到实体类对象
package Form;
import com.opensymphony.xwork2.ActionSupport;
import entity.User;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
public class Form4DemoAction extends ActionSupport {
@Override
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();
user.setUsername(username);
user.setPassword(password);
user.setAddress(address);
System.out.println(user);
return NONE;
}
}
2 属性封装
- 特点:直接把表单提交属性封装到action的属性里面
- 实现步骤
(1)在action成员变量位置定义变量
- 变量名称和表单输入项的name属性值一样
(2)生成变量的set方法(set和get方法都写出来)
- 不足:使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象类里面
3 模型驱动封装(重点)
- 使用模型驱动方式,可以直接把表单数据封装到实体类对象里面
- 实现步骤
(1)action实现接口 ModelDriver
(2)实现接口里面的方法 getModel方法 - 把创建对象返回
(3)在action里面创建实体类对象
package Date;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import entity.User;
//使用模型驱动获取表单数据
public class DateDemo2Action extends ActionSupport implements ModelDriven{
//创建对象
//前提要求:表单输入项name属性值和实体类属性名称一样
private User user = new User();
public User getModel() {
//返回创建user对象
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user.toString());
return NONE;
}
}
- 前提要求:表单输入项name属性值和实体类属性名称一样
4 使用模型驱动和属性封装注意问题
- 在一个action中,获取表单数据可以使用属性封装,或者模型驱动封装,但是不能同时使用属性封装和模型驱动封装同时获取一个表单。如果同时使用,只会执行模型驱动。
5 表达式封装(会用)
- 使用表达式封装可以把表单数据封装到实体类对象里面
- 实现过程
(1)在action里面声明实体类
(2)生成实体类变量的set和get方法
(3)在表单输入项的name属性值里面写表达式形式
三 比较表达式封装和模型驱动封装
1 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面
2 不同点
(1)使用模型驱动只能把数据封装到一个实体类对象里面
- 在一个action里面不能使用模型驱动把数据封装到不同的实体类对象里面
(2)使用表达式封装可以把数据封装到不同的实体类对象里面
package Date;
import com.opensymphony.xwork2.ActionSupport;
import entity.Book;
import entity.User;
//使用表达式形式获取表单数据
public class DateDemo3Action extends ActionSupport{
//1 声明实体类
private User user;
private Book book;
//2 生成实体类变量的set和get方法
public Book getBook() {
return book;
}
public void setBook(Book book) {
this.book = book;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
System.out.println(user.toString());
System.out.println(book.getBname());
return NONE;
}
}
四 Struts2获取数据封装到集合中(会用)
1 封装到list集合
第一步 在action声明List
第二步 生成list变量的set和get方法
第三步 在表单输入项里面写表达式
2 封装到map集合
第一步 声明map集合
第二步 生成get和set方法
第三步 在表单输入项的name属性值里面写表达式