飞道的博客

BeanUtils 简化参数的封装

331人阅读  评论(0)


BeanUtils

  • 是 Apache 组织提供的一套工具类,可以简化参数的封装。简单来说,将前端提交的数据,直接封装到想要的 JavaBean 中。

1. 导入 jar 包

  • web 项目 jar 包一定要添加到 WEB-INF 下面的 lib 目录,在其他位置 Tomcat 一概不认。

2. 使用 BeanUtils 的注意事项

  1. 提交的参数名字必须和实体类的名称一致(本质是要与实体类的 Setter 方法返回的名字一致)。
  2. 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. 测试效果

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. 测试效果


原文链接:https://qwert.blog.csdn.net/article/details/105560591


转载:https://blog.csdn.net/Regino/article/details/105560591
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场