Action封装获取表单数据
原始方法:实体类对象封装
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;
}
属性封装
直接把表单提交属性封装到action的属性里面,不能把数据直接封装到实体类对象里面
- 第一步:在action成员变量位置定义变量(变量名称和表单输入项的name属性值一样)
- 第二步:生成变量的set方法(把set和get方法都写出来)
public class LoginAction extends ActionSupport {
// 1 定义变量,变量的名称和表单输入项name属性值一样
private String username;
private String password;
private String address;
// 2 生成变量的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;
}
}
模型驱动封装(重点)
使用模型驱动方式,可以直接把表单数据封装到实体类对象里面
- 第一步:action实现接口ModelDriven
- 第二步:实现接口里面的方法getModel方法,把创建对象返回
- 第三步:在action里面创建实体类对象
public class LoginAction extends ActionSupport implements ModelDriven<User> {
// 创建对象
// 前提要求:表单输入项name属性值和实体类属性名称一样
private User user = new User();
@Override
public User getModel() {
// 返回创建user对象
return user;
}
@Override
public String execute() throws Exception {
System.out.println(user);
return NONE;
}
}
注意
在一个action中,获取表单数据可以属性封装,使用模型驱动封装,不能同时使用属性封装和模型驱动封装获取同一个表单数据,如果同时使用,只执行模型驱动,属性封装为null。
表达式封装
使用表达式封装可以把表单数据封装到实体类对象里面
- 第一步:在action里面声明实体类
- 第二步:生成实体类变量的set和get方法
public class LoginAction extends ActionSupport {
// 1 声明实体类
private User user;
// 2 生成实体类变量的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属性值里面写表达式形式
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/form.action" method="post">
username:<input type="text" name="user.username"/>
<br/>
password:<input type="text" name="user.password"/>
<br/>
address:<input type="text" name="user.address"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
比较表达式封装和模型驱动封装
相同点:
- 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面
不同点:
- 使用模型驱动只能把数据封装到一个实体类对象里面(在一个action里面不能使用模型驱动把数据封装到不同的实体类对象里面)
- 使用表达式封装可以把数据封装到不同的实体类对象里面
封装数据到List集合
- 第一步:在action声明list
- 第二步:生成list变量的set和get方法
public class LoginAction extends ActionSupport {
// 1 声明List变量
private List<User> list;
// 2 生成get和set方法
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;
}
}
- 第三步:在表单输入项里面写表达式
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/form.action" method="post">
username:<input type="text" name="list[0].username"/>
<br/>
password:<input type="text" name="list[0].password"/>
<br/>
address:<input type="text" name="list[0].address"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
封装数据到Map集合
- 第一步:声明map集合
- 第二步:生成get和set方法
public class LoginAction extends ActionSupport {
// 1 声明map集合
private Map<String, User> map;
// 2 生成get和set方法
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;
}
}
- 第三步:在表单输入项的name属性值里面写表达式
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/form.action" method="post">
<!-- 设置key值:map['key值']
设置value值:map['key值'],实体类属性 -->
username:<input type="text" name="map['a'].username"/>
<br/>
password:<input type="text" name="map['a'].password"/>
<br/>
address:<input type="text" name="map['a'].address"/>
<br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>