开源组件:(2)BeanUtils

1、简介

程序中对javabean的操作很频繁,所以apache提供了一套开源的api,方便对javabean的操作!即BeanUtils组件。

BeanUtils组件,作用是简化javabean的操作!

http://commons.apache.org/proper/commons-beanutils/

http://commons.apache.org/proper/commons-logging/download_logging.cgi

使用BenUtils组件:

1. 引入commons-beanutils-1.9.2.jar核心包

2. 引入日志支持包: commons-logging-1.1.1.jar

3. 引入集合支持包: commons-collections-3.2.1.jar

可以在http://mvnrepository.com/查询各jar包版本的兼容性

如果缺少日志jar文件,报错:

java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

如果缺少集合jar文件,报错:

java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap

org.apache.commons.beanutils.BeanUtils

(1)将JavaBean的properties进行赋值,本质上是通过反射

Utility methods for populating JavaBeans properties via reflection.

org.apache.commons.beanutils.ConvertUtils

(1)将String scalar values转换成objects of the specified Class

Utility methods for converting String scalar values to objects of the specified Class, String arrays to arrays of the specified Class.

public static void register(Converter converter, Class<?> clazz)

Register a custom Converter for the specified destination Class, replacing any previously registered Converter.

org.apache.commons.beanutils.Converter

(1)类型转换的接口。

General purpose data type converter. It can be registered and used within the BeanUtils package to manage the conversion of objects from one type to another.

准备工作:DogInfo.java

package com.rk.entity;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DogInfo
{
	private int id;
	private String name;
	private int age;
	private Date birthDay;
	public int getId()
	{
		return id;
	}
	public void setId(int id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	public Date getBirthDay()
	{
		return birthDay;
	}
	public void setBirthDay(Date birthDay)
	{
		this.birthDay = birthDay;
	}
	private String format(Date date)
	{
		if(date == null) return "null";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
	}

	@Override
	public String toString()
	{

		return "[Id="+this.id+",Name="+this.name+",Age="+this.age+",BirthDay="+format(this.birthDay)+"]";
	}
}

2、实例:基本用法

方法1: 对象属性的拷贝

BeanUtils.copyProperty(dog, "name", "小汪");

BeanUtils.setProperty(dog, "age", 2);

方法2: 对象的拷贝

BeanUtils.copyProperties(dest, origin);

方法3: map数据拷贝到javabean中

BeanUtils.populate(bean, map);【注意:map中的key要与javabean的属性名称一致】

package com.rk.demo;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;

import com.rk.entity.DogInfo;

public class Demo01
{
	//1. 对javabean的基本操作
	public static void main(String[] args) throws IllegalAccessException, InvocationTargetException
	{
		DogInfo dog = new DogInfo();
		// a. 基本操作
//		dog.setId(1);
//		dog.setName("汪汪");
//		dog.setAge(2);

		// b. BeanUtils组件实现对象属性的拷贝
		BeanUtils.copyProperty(dog, "name", "小汪");//Copy the specified property value to the specified destination bean, performing any type conversion that is required.
		BeanUtils.setProperty(dog, "age", 2);//Set the specified property value, performing type conversions as required to conform to the type of the destination property.
		// 总结1: 对于基本数据类型,会自动进行类型转换!

		// c. 对象的拷贝
		DogInfo dog2 = new DogInfo();
		BeanUtils.copyProperties(dog2, dog);//Copy property values from the origin bean to the destination bean for all cases where the property names are the same.

		// d. map数据,拷贝到对象中
		Map<String, Object> map = new HashMap<String,Object>();
		map.put("name", "小黑");
		map.put("age", 3);
		// 注意:map中的key要与javabean的属性名称一致
		BeanUtils.populate(dog, map);//Populate the JavaBeans properties of the specified bean, based on the specified name/value pairs.
		System.out.println(dog);
	}
}

3、实例:日期类型的拷贝

1.自定义日期类型转换器

package com.rk.demo;

import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

import com.rk.entity.DogInfo;

public class Demo02
{
	public static void main(String[] args) throws IllegalAccessException, InvocationTargetException
	{
		String strId = "20";
		String name = "汪旺";
		String birth = "2015-09-19";

		// 注册日期类型转换器:1, 自定义的方式
		ConvertUtils.register(new Converter()
		{
			@Override
			// 转换的内部实现方法,需要重写
			public Object convert(Class type, Object value)
			{
				// 判断
				if(type != Date.class)
				{
					return null;
				}
				if(value == null || ("".equals(value.toString().trim())))
				{
					return null;
				}
				try {
					// 字符串转换为日期
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
					return sdf.parse(value.toString().trim());
				} catch (ParseException e) {
					throw new RuntimeException(e);
				}
			}
		}, Date.class);

		// 对象
		DogInfo dog = new DogInfo();
		// 把数据封装到对象中
		BeanUtils.copyProperty(dog, "id", strId);
		BeanUtils.copyProperty(dog, "name", name);
		BeanUtils.copyProperty(dog, "birthDay", birth);

		System.out.println(dog);
	}
}

2.(推荐)使用提供的日期类型转换器工具类

package com.rk.demo;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;

import com.rk.entity.DogInfo;

public class Demo03
{
	//2. 使用提供的日期类型转换器工具类
	public static void main(String[] args) throws IllegalAccessException, InvocationTargetException
	{
		String strId = "20";
		String name = "汪旺";
		String birth = "2015-09-19";

		// 注册日期类型转换器:2, 使用组件提供的转换器工具类
		ConvertUtils.register(new DateLocaleConverter(), Date.class);

		// 对象
		DogInfo dog = new DogInfo();
		// 把数据封装到对象中
		BeanUtils.copyProperty(dog, "id", strId);
		BeanUtils.copyProperty(dog, "name", name);
		BeanUtils.copyProperty(dog, "birthDay", birth);

		System.out.println(dog);
	}
}

4、应用

在使用Servlet接受浏览器参数的时候,可以使用BeanUtils组件,可以将浏览器传来的参数直接转换成JavaBean对象

使用的方法:

Map javax.servlet.ServletRequest.getParameterMap()

void org.apache.commons.beanutils.BeanUtils.populate(Object bean, Mapproperties),>

WebUtil.java

package com.rk.utils;

import java.util.Date;
import java.util.Enumeration;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;

public class WebUtil
{
	@Deprecated
	public static <T> T copyToBean_old(HttpServletRequest request, Class<T> clazz) {
		try {
			// 创建对象
			T t = clazz.newInstance();

			// 获取所有的表单元素的名称
			Enumeration<String> enums = request.getParameterNames();
			// 遍历
			while (enums.hasMoreElements()) {
				// 获取表单元素的名称:<input type="password" name="pwd"/>
				String name = enums.nextElement();  // pwd
				// 获取名称对应的值
				String value = request.getParameter(name);
				// 把指定属性名称对应的值进行拷贝
				BeanUtils.copyProperty(t, name, value);
			}

			return t;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 处理请求数据的封装
	 */
	public static <T> T copyToBean(HttpServletRequest request, Class<T> clazz) {
		try {
			// 创建对象
			T t = clazz.newInstance();
			ConvertUtils.register(new DateLocaleConverter(), Date.class);
			// 注册日期类型转换器
			ConvertUtils.register(new DateLocaleConverter(), Date.class);
			//将数据填充到实体对象中
			BeanUtils.populate(t, request.getParameterMap());
			return t;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public static <T> T copyToBean(Map map, Class<T> clazz) {
		try {
			// 创建对象
			T t = clazz.newInstance();
			// 注册日期类型转换器
			ConvertUtils.register(new DateLocaleConverter(), Date.class);
			//将数据填充到实体对象中
			BeanUtils.populate(t, map);
			return t;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

DogServlet.java

package com.rk.servlet;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.rk.entity.DogInfo;
import com.rk.utils.WebUtil;

public class DogServlet extends HttpServlet
{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		Map map = request.getParameterMap();
		DogInfo dog = WebUtil.copyToBean(map, DogInfo.class);
		response.getWriter().println(dog);
	}

}

浏览器访问地址:

http://localhost:8080/myweb/dog?id=1&name=xiaogou&age=8&birthDay=1980-09-08

时间: 2024-08-27 05:41:53

开源组件:(2)BeanUtils的相关文章

开源组件:(4)用元数据和BeanUtils写一个简单的ORM映射BaseDAO.java

1.JDBC元数据 在jdbc中可以使用: 数据库元数据.参数元数据.结果集元数据 (1)数据库元数据 通过Connection对象的getMetaData() 方法可以得到DatabaseMetaData对象.DatabaseMetaData对象包含了数据库的元信息. DatabaseMetaData java.sql.Connection.getMetaData() Retrieves a DatabaseMetaData object that contains metadata abou

大量的文档,大量的示例代码,大量的开源组件,大量的社区,大量的码农

移动用各个平台的原生工具和代码,当年被Delphi忽悠,入了贼船,这次搞移动,坚定了跟着厂家走的策略.每次更新不用傻等Delphi跟进,大量的文档可以参考,大量的示例代码可以直接copy,大量的开源组件可以拿来就用,大量的社区可以做到有问必答. 如果有一天真的做大了,还有大量的iOS/Java码农可以招聘,组队团PK. 总之是选路要选对啊.这两年如果不是EMB出现救市,Delphi差点成了绝唱.想想都后怕.移动开发不敢在冒险了. 参考:http://bbs.2ccc.com/topic.asp?

开源组件整理

ZedGraph  一个图表组件,可定制绘图控件,饼图.柱图.曲线图.多边形图,图示,图例,自定义配置坐标系属性 log4Net基于.net开发的一款非常著名的记录日志开源组件. ajax.dllweb开发中常用的一个dll,使用比较便捷 ObjectListView是一个C# 对.NET中的ListView 组件进行改进和增强的新组件,支持自动排序.分组显示.单元格编辑.数据绑定和列大小调整等功能,提供也提供了一个基于 wxPython 的Python版本. 件很多如 ComponentOne

分享几个.NET WinForm开源组件,纪念逐渐远去的WinForm。。。

http://www.cnblogs.com/asxinyu/p/dotnet_opensource_project_WinForm.html 分享几个.NET WinForm开源组件,纪念逐渐远去的WinForm... 前面3个月的时间内,这些.NET开源项目你知道吗?系列文章已经发表了3篇,共计45个平时接触比较少,曾经默默无闻的.NET开源项目,展示给大家,当然不是每个人都能用得上,但也的确是有些人用了,反响还不错,所以非常感谢大家的支持.由于收藏夹的项目越来越少,越整理到最后,越发现一些

25-网易新闻iOS版使用的开源组件

网易新闻iOS版使用的开源组件 2015-05-20 ios博文精选 网易新闻iOS版在开发过程中曾经使用过的第三方开源类库.组件 1.AFNetworkingAFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功能强大, 现在许多人都用它取代 ASIHTTPRequest 2.Apple Reachability网络监测,可以参考下这篇文章iOS网络监测如何区分2.3.4G? 3.DOUAudioS

Infer.net 开源组件: 1, 机器学习入门,要从贝叶斯说起

我的入门方式,先从应用现象中,总结规律反推本质.一头扎进理论书籍是不对的. 老外的先进,还是体现在传承方面.没办法,我们竞争压力大,有好东西藏着掖着.大家都苦逼 我最开始是从介绍,有了基本概念,见xxx.知道十大算法,可以开工了. 开源组件入手的,infer.net 例子很经典,讲解细,这也是老外程序员成才快的原因.之前看libusb也是如此,程序员英语不好路是走不远的,我深有体会. 下面简介下基本概念,我是喜欢预测方面所以对机器分类学习感兴趣. 因为人不必要求计算机像人一样.视觉,听觉不是最终

使用Jayrock开源组件创建参数可为空的接口

经过上一篇文章对Jayrock开源组件的分析,我发现了一个问题,就是在写接口的时候,可以设置某个参数为空,可以不需要进行参数的传递,具体写法如下: 图上的test参数就是可空类型,只需标识为int?类型即可.测试结果如下: 使用非常的简单,也验证了我上一篇文章的错误观点,在此说明一下.

Android自定义控件——开源组件SlidingMenu的项目集成

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39611355  在实际项目开发中,定制一个菜单,能让用户得到更好的用户体验,诚然菜单的样式各种各样,但是有一种菜单--滑动菜单,是被众多应用广泛使用的.关于这种滑动菜单的实现,我在前面的博文中也介绍了如何自定义去实现,请参考Android自定义控件--侧滑菜单,这篇博文描述的是如何从无到有创建一个侧滑菜单的控件,里面的代码不多,但是处理的逻辑和各种效果比较复杂,如果稍有不慎,这种

【高德LBS开源组件大赛】公众号地图工具

应用的名称 公众号地图工具 应用说明及使用场景 现在越来越多的商户都有自己的实体店,比如连锁超市(家乐福,沃尔玛),连锁餐饮(KFC,麦当劳),连锁酒店(7天,汉庭,全季,如家),菜鸟物流(原天猫服务站),银行等.而开发一张连锁店地图,对于毫不懂技术的人们来说,是十分困难的事情.本工具就提供了一个,即使不懂代码,也能制作出一张有趣可爱又实用的连锁店地图.并且,可以自动定位并检索周边的POI点.本工具非常适用于,微博.微信.支付宝服务窗等手机上的地图显示. 应用所使用的技术及软件 HTML CSS