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

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. Spring的AOP,Struts2的拦截器(Interceptor),以及springMVC的(interceptor)

    参考外链:http://www.ibm.com/developerworks/cn/java/j-lo-springaopfilter/ 1.首先,spring的AOP作用范围很广,可以使用Aspec ...

  2. javascript--获取一个页面各个标签的数量

    获取一个页面各个标签的数量 document.getElementsByTagName('*')--获取所有的标签. var obj = document.getElementsByTagName(' ...

  3. Django框架——基础之视图系统(View.py)

    Django框架之View.py(视图文件) 1. 视图简介 视图层是Django处理请求的核心代码层,我们大多数Python代码都集中在这一层面. 它对外接收用户请求,对内调度模型层和模版层,统合数 ...

  4. 转载Google TPU论文

    选自 Google Drive 作者:Norman P. Jouppi 等 痴笑@矽说 编译 该论文将正式发表于 ISCA 2017 从去年七月起,Google就号称了其面向深度学习的专用集成电路(A ...

  5. Delphi 数组与记录类型

  6. SecureCRT 连接 Centos7.0 (NAT模式),且能连接公网。

    1.打开物理主机运行-输入cmd,输入ipconfig,获取物理主机ip地址. ip:192.168.11.138 2.点击网络适配器,选择NAT模式. 3.点击Centos界面左上角-编辑-虚拟网络 ...

  7. Linux部署java和tomcat的运行环境

    Linux部署java和tomcat的运行环境 1.上传下载的jdk的rpm包和tomcat的tar包,我是放到/opt目录了,文件直接去官网下载即可. 2.如果之前安装过其他版本的jdk,最好先现在 ...

  8. Get To Know Linux: The /etc/init.d Directory

    If you use Linux you most likely have heard of the init.d directory. But what exactly does this dire ...

  9. Cocos Creator 热更新文件MD5计算和需要注意的问题

    Creator的热更新使用jsb.热更新基本按照 http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html?h=% ...

  10. 详解thinkphp+redis+队列的实现代码

    1,安装Redis,根据自己的PHP版本安装对应的redis扩展(此步骤简单的描述一下) 1.1,安装 php_igbinary.dll,php_redis.dll扩展此处需要注意你的php版本如图: ...