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

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. Redis分布式之前篇

    第一篇:初识Redis 一.Redis是什么? Redis 是一个开源(BSD许可)的,使用ANSI C语言编写的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据 ...

  2. Three.js类似于波浪的效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 移动端 app

    上传到蒲公英

  4. 渗透神器CobaltStrike 3.1.2 去后门破解版 & Windows版TeamServer【转】

    转自我八师傅博客 CS简介 Cobalt Strike(简称CS)是全球黑客公认一款非常优秀的渗透测试神器,以metasploit为基础的GUI的框架式渗透工具,集成了传统远控功能(远程桌面VNC.键 ...

  5. logging:不喜欢写日志可不好哦

    logging模块简介 logging模块是python内置的标准模块,主要用于输出程序的运行日志. 可以设置输出日志的等级,日志保存路径,日志文件回滚等等. logging模块的基本使用 impor ...

  6. iptables 设置特定IP访问指定端口

    一.添加规则:设置禁止所有IP访问指定端口8075 [root@zabbix_server ~]# iptables -I INPUT -p tcp --dport -j DROP 二.测试telne ...

  7. 【AGC005 F】Many Easy Problems

    神他吗一天考一道码农题两道 FFT(其实还是我推式子一窍不通) 题意 给你一棵 \(n\) 个点的树,再给你一个常数 \(k\). 设 \(S\) 为树上某些点的集合,定义 \(f(S)\) 为最小的 ...

  8. POJ1185炮兵阵地(DP状态压缩)

    问题描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P&quo ...

  9. Kendo UI for jQuery使用教程:操作系统/jQuery支持等

    [Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...

  10. 【LuoguP4081】[USACO17DEC]Standing Out from the Herd

    题目链接 题意 给定多个字符串,每个串中仅在该串中出现的本质不同的子串个数. Sol 多串匹配想到用广义SAM. 之后从串的匹配角度不是很好做.发现一个本质不同的串最多只会贡献到一个串的答案里. 那么 ...