以一个案例介绍反射机制的一种常见的使用场景,以及具体实现。

1.本文案例
在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并封装到相应的实体中,也就是封装到一个Java对象中。

那么,能否有某种方式使程序能够自动的将表单提交的数据设置到一个相应的对象中呢?

2.创建用于提交表单的页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>利用反射自动填充数据</title>
</head>
<body>
<form action="LoginServlet" method="POST">
<span>UserName: </span><input name="userName" type="text" /><br/>
<span>Password: </span><input name="password" type="password"><br/>
<button type="submit">Login</button>
</form>
</body>
</html>

注意,此处的表单中的name属性后面会用到,这个那么属性,需要与存放这两个值的class的属性名称相同

3.创建用于存放从表单提交的数据的类

创建一个 UserBean,其实就是个普通的Java类,其中包含与表单中属性name值同名的属性,并且有相应的 getter、setter方法

public class UserBean {
 
@Override
public String toString() {
return "Username: " + this.userName
+ " Password: " + this.password;
} 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;
} private String userName;
private String password;
}

这个UserBean中的 toString() 方法是为了测试的时候便于打印输出而添加的,不是必须的

4.创建实现自动填充功能的工具类
接下来这步是关键部分了,能够实现将表单数据自动填充到一个类中就主要是在这里实现了。

import java.lang.reflect.Field;
import java.lang.reflect.Method;
 
import javax.servlet.http.HttpServletRequest;
 
public class AutoFillBeanUtil {
 
public static <T> T fillBean(HttpServletRequest request, Class<T> cls) { T bean = null; try {
bean = cls.newInstance(); Field[] fields = cls.getDeclaredFields(); for(Field field : fields) {
String fieldName = field.getName(); Method method = cls.getDeclaredMethod("set"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1), String.class);
String value = request.getParameter(fieldName);
method.invoke(bean, value);
}
} catch(Exception e) {
e.printStackTrace();
} return bean;
 
} }

这里利用反射机制,首先获取需要被填充的JavaBean(也就是这里的cls参数)的所有属性,然后逐一尝试从请求中获取相应的参数,然后调用这个JavaBean的setter方法,将从请求中获取的值设置到这个JavaBean中,最后返回这个JavaBean。

5.创建接受表单请求的Servlet进行测试

接下来创建用于接受表单请求的Servlet,然后在Servlet中调用这个实现,测试效果

import java.io.IOException;
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 com.oolong.javawebreflect.bean.UserBean;
import com.oolong.javawebreflect.util.AutoFillBeanUtil;
 
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L; public LoginServlet() {
super();
}
 
protected void doGet(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().append("Served at: ")
.append(request.getContextPath());
}
 
protected void doPost(HttpServletRequest request
, HttpServletResponse response)
throws ServletException, IOException { UserBean bean =
AutoFillBeanUtil.fillBean(request, UserBean.class);
System.out.println(bean.toString());
doGet(request, response);
}
  }

这里可以看到,调用了

UserBean bean = AutoFillBeanUtil.fillBean(request, UserBean.class);

然后会从请求中将表单中的数据解析出来,填充到一个UserBean中,之后会打印这个UserBean中的内容,查看是否获取成功。

结果:

控制台打印:

测试成功!

Java——利用反射机制将表单数据自动填充到JavaBean中的更多相关文章

  1. Reflection应用场景-利用反射机制将表单数据自动填充到JavaBean中

  2. 不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean

    在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-lo ...

  3. 【转】Java利用反射机制访问私有化构造器

    Java利用反射机制访问私有化构造器 博客分类: java   我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...

  4. java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值

    1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...

  5. java 利用反射机制,获取实体所有属性和方法,并对属性赋值

    一个普通的实体Person: private int id; private String name; private Date createdTime;...//其它字段// get set方法 . ...

  6. java利用反射机制获取list中的某个字段并以list形式返回

    public static<T> List<Object> listToList(Collection<T> list,String fieldName) thro ...

  7. java利用反射调用类的某个方法

    java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...

  8. JAVA中利用反射机制进行对象和Map相互转换的方法

    JAVA的反射机制主要作用是用来访问对象的属性.方法等等.所以,JAVA中对象和Map相互转换可以利用JAVA的反射机制来实现.例子如下: 一.对象转Map的方法 public static Map& ...

  9. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

随机推荐

  1. 丑陋的 shell 来一遍

    学习使人进步,好记性不如烂笔头 在线正则 在线正则 ^(.)(.).*?\2\1$ 正式开始总结 cat 反过来读取文件 tac file.txt nl --> number line 如 ca ...

  2. liboqs-量子安全密码算法开源C库

    liboqs是一个用于量子安全密码算法的开源C库. 一,概述 liboqs提供: 量子安全 密钥封装机制(KEM)和数字签名算法的开源实现的集合: 这些算法的通用API: 测试工具和基准测试例程. l ...

  3. 利用selenium 爬取豆瓣 武林外传数据并且完成 数据可视化 情绪分析

    全文的步骤可以大概分为几步: 一:数据获取,利用selenium+多进程(linux上selenium 多进程可能会有问题)+kafka写数据(linux首选必选耦合)windows直接采用的是写my ...

  4. v-bind:value="diy" 添加到 <input type="button" /> 中可以,添加到<button />中不可以,diy是data中的数据

    v-bind:value="diy" 添加到 <input type="button" /> 中可以, 添加到<button />中不可 ...

  5. JRebel最新破解激活版(IDEA自动部署插件)

    参考: https://www.52pojie.cn/thread-906163-1-1.html https://blog.csdn.net/xingbaozhen1210/article/deta ...

  6. 孕期出血是否先兆流产——B超看婴儿是否在子宫内+hcg值是否过低孕激素不足

    转自:http://blog.sina.com.cn/s/blog_4a869c130102e7nu.html 很多人都经历过孕早期阴道出血,但结局大不一样. 人类受孕后,从一个单细胞逐渐发育成为一个 ...

  7. Django学习系列15:把POST请求中的数据存入数据库

    要修改针对首页中的POST请求的测试.希望视图把新添加的待办事项存入数据库,而不是直接传给响应. 为了测试这个操作,要在现有的测试方法test_can_save_a_post_request中添加3行 ...

  8. 使用rpm安装mysql5.6(简单安装 实验使用)

    [root@localhost mysql]# cd /usr [root@localhost mysql]# mkdir mysql [root@localhost mysql]# cd mysql ...

  9. java web课堂测试

    下面是web界面 <%@ page language="java" import="java.util.*" pageEncoding="UTF ...

  10. 赋值语句C++(面宝P29)

    ; void main(){ int i=i; } 解析:main里面的i从声明的那一刻就是可见的了,所以main里的i不是1,而是一个未定义的值. 这段代码ctrl+F7编译能通过(有警告如下) c ...