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

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. snappy-java两种压缩方式的区别

    1.Snappy-java项目地址 https://github.com/xerial/snappy-java 2.Snappy-java两种压缩方式 使用Snappy.compress进行压缩 St ...

  2. jQuery制作弹出窗(模态框)

    来源:(二少)在南极 ##index.html <!DOCTYPE html><html lang="zh"><head> <meta c ...

  3. 87. Scramble String (Java)

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  4. shell 里面的计算

    ---恢复内容开始--- 关于shell里面的计算其实早在接触LINUX的时候就已经接触到了.每次在运用的时候却是在网上到处找,所以觉得花点时间好好研究下. 首先了解下常用的算数运算符号: +  - ...

  5. Linux上ssh免秘钥互登

    两台机器分别为:master:192.168.1.10sever1:192.168.1.20 1.检查机器名和连通性 a.查看/etc/hostname [root@master master]# m ...

  6. 韦东山嵌入式Linux学习笔记01--转载: 板子ping不通PC怎么办

    请参考链接:https://blog.csdn.net/u013490896/article/details/71250060 我的环境: window 10 jz2440 v3 我采用的连接方式如下 ...

  7. 2019.9.25使用BP和Hydra爆破相关的服务

    使用BP和Hydra爆破相关的服务. Hydra:九头蛇,开源的功能强大的爆破工具,支持的服务有很多,使用hydra爆破c/s架构的服务.使用bp爆破web登录端口. dvwa:web应用程序漏洞演练 ...

  8. python的isocalender()

    isocalender()返回指定日期的年,第几周,周几这三个值. 例子: import date date_time = datetime.date(2019, 5, 9) ret = date_t ...

  9. java8学习之收集器枚举特性深度解析与并行流原理

    首先先来找出上一次[http://www.cnblogs.com/webor2006/p/8353314.html]在最后举的那个并行流报错的问题,如下: 在来查找出上面异常的原因之前,当然得要一点点 ...

  10. 清北学堂提高组突破营游记day3

    讲课人更换成dms. 真的今天快把我们逼疯了.. 今天主攻数据结构, 基本上看完我博客能理解个大概把, 1.LCA 安利之前个人博客链接.之前自己学过QWQ. 2.st表.同上. 3.字符串哈希.同上 ...