不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean
在百度搜“java反射 将表单数据自动封装到javabean ”,第一页显示的都是一样的代码,都是利用导入第三方jar包<commons-beanutils>和<commons-logging>去实现。
最近自己也研究的一下,不使用这两个第三方jar包,可不可以实现呢?--------------可以
说明:以下代码是我自己写的,为了不占用太多篇幅,一些自动生成的代码我没有贴上
开发环境:MyEclipse 10.7(亲测在MyEclipse 2014 上正常运行 )
web project 版本:Java EE 6.0
JDK:1.7
Tomcat服务器版本:apache-tomcat-7.0.53
JSP页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html>
<head>
<script type="text/javascript">
function submitForm(){
document.myForm.submit();
}
</script> </head> <body>
<form name="myForm" action="${pageContext.request.contextPath }/regServlet" method="post">
<center>
用户名:<input type="text" name="userName" value=""><br>
密码:<input type="password" name="password" value=""><br>
年龄:<input type="text" name="age" value=""><br>
工资:<input type="text" name="salary" value=""><br>
<input type="button" value="注册" onclick="submitForm()" >
</center>
</form>
</body>
</html>
JAVABean:
package com.it.beans;
public class Users {
private String userName;
private String password;
private int age;
private float salary;
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
}
Servlet:
package com.it.servlet; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.it.beans.Users; public class RegServlet extends HttpServlet { //这里只写了doGet()和doPost()方法,其他自动生成代码没有粘贴,请注意!
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
Users user=(Users)Utils.getBean(request,"com.it.beans.Users"); //这里只做后台打印演示,其他转发跳转可自行补充
System.out.println(user.getUserName());
System.out.println(user.getPassword());
System.out.println(user.getAge());
System.out.println(user.getSalary());
} }
Utils工具类:
package com.it.servlet; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration; import javax.servlet.http.HttpServletRequest; public class Utils {
//传入className字符串作为参数,只是想利用反射来实现这个功能
//也可以传入Object obj一个对象,就看自己的设计了
public static Object getBean(HttpServletRequest request, String className) {
try {
//className为JavaBean路径,获取Class
Class c=Class.forName(className);
//利用反射读取构造,创建bean对象
Object obj=c.getConstructor().newInstance();
//利用request获取所有表单项name,同时规范要求bean的属性名和表单项名必须一致。
Enumeration<String> enu=request.getParameterNames();
while(enu.hasMoreElements()){
String fieldName=enu.nextElement();
//利用属性名获取set/get方法名
String setMethodName="set"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
String getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
//获取无参的get方法
Method getMethod=c.getMethod(getMethodName, null);
//利用无参有返回值的get方法获得对应的set方法(get方法返回类型与set方法参数录入类型一致)
Method setMethod=c.getMethod(setMethodName, getMethod.getReturnType());
//调用录入具体的参数值,保存到bean对象中。
String value=request.getParameter(fieldName); //因为set方法中的参数类型不一样,因此要做相应的转换
32 switch (getMethod.getReturnType().getName()) {
case "int":
setMethod.invoke(obj, Integer.parseInt(value));
break;
case "float":
setMethod.invoke(obj, Float.parseFloat(value));
break;
case "double":
setMethod.invoke(obj, Double.parseDouble(value));
break;
case "long":
setMethod.invoke(obj, Long.parseLong(value));
break;
default:
setMethod.invoke(obj, value);
}
}
return obj;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} }
运行结果:


不使用BeanUtils,利用Java反射机制:表单数据自动封装到JavaBean的更多相关文章
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
作者:54dabang 在spring的学习过程之中,我们能够看出通过配置文件来动态管理bean对象的优点(松耦合 能够让零散部分组成一个总体,而这些总体并不在意之间彼此的细节,从而达到了真正的物理上 ...
- 利用JAVA反射机制设计通用的DAO
利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...
- 利用Java反射机制对实体类的常用操作工具类ObjectUtil
代码: ObjectUtil类: import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.Simpl ...
- 利用Java反射机制将Bean转成Map
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- Java——利用反射机制将表单数据自动填充到JavaBean中
以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...
- 利用java反射机制实现读取excel表格中的数据
如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来. 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List<User>.Lis ...
- 利用JAVA反射机制将JSON数据转换成JAVA对象
net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大, 这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用, 有些数据类型需要进行转 ...
- 利用java反射机制编写solr通用的java客户端
一.前言 通过上一篇的讲解,我们知道了dynamicFiled字段,它是动态的,不需要显示的声明.而且一些常用的基本类型solr已经默认给我们创建好了. 例如:*_i,*_is,等. 如果我们要使用动 ...
- 利用Java反射机制优化简单工厂设计模式
之前项目有个需求,审批流程的时候要根据配置发送信息:发送短信.发送邮件.当时看到这个就想到要用工厂模式,为什么要用工厂模式呢?用工厂模式进行大型项目的开发,可以很好的进行项目并行开发.就是一个程序员和 ...
随机推荐
- javascript 引擎Rhino源代码分析 浅析 实例函数对象及this
http://blog.csdn.net/liantian_wu/article/details/49797481
- 移动平台的meta标签-----神奇的功效
对于桌面平台web布局中大家对meta标签再熟悉不过了,它永远位于 head 元素内部,对做SEO的朋友一定对meta有种特殊的感情吧,今天我们就来说说移动平台的meta标签,在移动平台meta标签究 ...
- CreateToolhelp32Snapshot
CreateToolhelp32Snapshot CreateToolhelp32Snapshot函数为指定的进程.进程使用的堆[HEAP].模块[MODULE].线程[THREAD])建立一个快照[ ...
- C# 之 Excel 导入一列中既有汉字又有数字:数字可以正常导入,汉字导入为空
今天在做一个Excel导入功能,一切开发就绪,数据可以成功导入.导入后检查数据库发现有一列既有汉字又有数字,数字正常导入,汉字为空.但是前面同样既有汉字又有数字的列可以导入成功. 查看excel 源文 ...
- Android(java)学习笔记128:使用proguard混淆android代码
1.当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的.为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等.我们需要对代码进行混淆,an ...
- ios webview 图片自适应屏幕宽度
//这个知识点主要是自己最近在尝试写后台接口 在移动端展示的时候需要用到这个知识点,在webViewDidFinishLoad方法里面执行一段js代码 拿到各个图片 判断其宽度是否大于当前手机屏幕尺寸 ...
- 基于ARM的RealView MDK开发环境
RealView MDK可以对各种嵌入式处理器的软件开发工具.这么高端,着实很吸引我,ADS12还不知道怎么搞,居然还有这么高端的,但是还是得了解一下唉.洗这个自动配 置启动代码,集成Flash烧写模 ...
- 基于嵌入式的c语言连接器
一个C程序可能是由多个分别编译的部分组成,这些不同部分通过一个通常叫做链接器(或连接器,载入器)的程序合并成一个整体.因为编译器一般每次只处理一个文件,所以它不能检测出那些需要一次了解多个源程序文 ...
- Linux安装后的系统配置
第一步: Linux系统安装之后,可以设置系统的日期和时间.给系统添加用户.安装软件.在Red Hat网络中注册机器以及完成其他任务.设置代理将允许用户从一开始就配置环境,从 而使用户能够快速地开始使 ...
- (转)STL
C++容器类 C++中的容器类包括“顺序存储结构”和“关联存储结构”,前者包括vector,list,deque等:后者包括set,map,multiset,multimap等. 若需要存储的元素数在 ...