BeanUtils
- 是 Apache 组织提供的一套工具类,可以简化参数的封装。简单来说,将前端提交的数据,直接封装到想要的 JavaBean 中。
1. 导入 jar 包
- web 项目 jar 包一定要添加到 WEB-INF 下面的 lib 目录,在其他位置 Tomcat 一概不认。
2. 使用 BeanUtils 的注意事项
- 提交的参数名字必须和实体类的名称一致(本质是要与实体类的 Setter 方法返回的名字一致)。
- BeanUtils 的底层依赖的是 setter 方法,如果的实体类的成员变量没有 setter 方法将无法封装参数
3. 使用工具类封装数据
a. 测试网页 demo.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>form</title>
</head>
<body>
<h3>BeanUtils测试:</h3>
<form action="/webappPractice2/requestDemo" method="post">
用户:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
爱好:
<input type="checkbox" name="hobby" value="somke"/>抽烟
<input type="checkbox" name="hobby" value="drink"/>喝酒
<input type="checkbox" name="hobby" value="perm"/>烫头
<input type="submit" value="post提交...">
</form>
</body>
</html>
b. 实体类 User.java
import java.util.Arrays;
public class User {
private String username;
private String password;
private String[] hobby;
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[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", hobby=" + Arrays.toString(hobby) +
'}';
}
}
c. Servlet:RequestDemo.java
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Map;
@WebServlet("/requestDemo")
public class RequestDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
// 使用BeanUtils快速封装数据到 User对象中
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");// 指定解码方式
// 1.获取所有参数的数据,map集合
Map<String, String[]> parameterMap = request.getParameterMap();
// 2.创建user对象
User user = new User();
// 3.调用工具类,实现快速封装
try {
BeanUtils.populate(user, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
System.out.println(user.getUsername() + user.getPassword() + Arrays.toString(user.getHobby()));
}
}
d. 测试效果
- 访问 http://localhost:8080/webappPractice2/static/demo.html 并填表后,控制台输出:
4. BeanUtils 注册自定义数据类型
- BeanUtils 只能处理 8 种基本数据类型的数据,并且会自动进行类型转换;但是如果的实体类出现了 Date 类型的时候,那么就需要注册类型转换器。
a. BeanUtils 类型转换器注册方法
- BeanUtils 类型转换器注册方法:
register(Converter,Class)
Converter
: 类型转换器的接口;class
: 该类型转换器用于指定的类型;- 因为只用注册一次,所以可以放到 Servlet 的 init 方法里。
- 注意:因为 init 方法只会在创建 Servlet 的时候调用一次,所以复用方法不能放在里面。
b. 测试网页 demo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/webappPractice2/demoServlet" method="post">
用户名:<input type="text" name="userName"/><br/>
年龄:<input type="text" name="age"/><br/>
生日(1999-9-9):<input type="text" name="birthday"/><br/>
<input type="submit" value="注册"/>
</form>
</body>
</html>
c. 实体类 User.java
import java.util.Date;
public class User {
private String userName;
private int age;
private Date birthday;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", age=" + age +
", birthday=" + birthday +
'}';
}
}
c. Servlet:DemoServlet.java
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@WebServlet("/demoServlet")
public class DemoServlet extends HttpServlet {
@Override
public void init() throws ServletException {
//Beanutils类型转换器注册
ConvertUtils.register(new Converter() {
@Override
//Object 参数代表了用户输入的内容 2020-03-30
public Object convert(Class aClass, Object o) {
try {
//1. 先把用户输入的数据转换为String
String inputInfo = (String) o; //2020-03-30
//2. 把用户输入的数据转换为Date类型
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = dateFormat.parse(inputInfo);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}, Date.class);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//解决post请求方式获取请求参数的中文乱码问题
request.setCharacterEncoding("utf-8");
//解决向浏览器输出中文数据的乱码问题
response.setContentType("text/html;charset=utf-8");
//1. 接收请求参数,把请求参数封装map集合中
Map<String, String[]> map = request.getParameterMap();
//2. 使用BeanUtils把Map中的参数封装到User对象中
User user = new User();
BeanUtils.populate(user,map);
//3. 向浏览器输出数据,
response.getWriter().write("用户的信息:"+ user);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
d. 测试效果
- 访问 http://localhost:8080/webappPractice2/static/index.html 并填表后,页面输出:
原文链接:https://qwert.blog.csdn.net/article/details/105560591
转载:https://blog.csdn.net/Regino/article/details/105560591
查看评论