Java类库BeanUtils组件使用方法及实例详解

BeanUtils

BeanUtils是Apache commens组件里面的成员,由Apache提供的一套开源api,用于简化对javaBean的操作,能够对基本类型自动转换。

JavaBean

BeanUtils组件是用于简化javaBean的操作,那么什么是javaBean呢?简单来说,javaBean实质就是java类,只不过是遵循了某种规范的java类。

javaBean的特点:

  • 必须具有一个无参的构造方法
  • 属性必须私有化
  • 私有化的属性必须通过public类型的方法来暴露,也就是说要出现setXXX()、getXXX()或者isXXX()的方法

下载BeanUtils

http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi,下载好组件,再到项目里面引入jar文件。

导入核心包

  • commons-beanutils-1.9.3.jar
  • commons-logging-1.2.jar

注意:当缺少日志jar包,会出现如下的报错情况。

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

logging组件的下载地址:http://commons.apache.org/proper/commons-logging/download_logging.cgi 

javaBean实例

public class Student {
	private String name;
	private String id;
	private int age;
	private String sex;
	private Date d;
	public Student() {
		super();
	}
	public Date getD() {
		return d;
	}
	public void setD(Date d) {
		this.d = d;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", id=" + id + ", age=" + age
				+ ", sex=" + sex + ", d=" + d + "]";
	}
}

BeanUtils用法

  • 对象的拷贝,BeanUtils.copyProperties(Object dest,Object orig)
  • 对象属性的拷贝,BeanUtils.copyProperties(Object bean,String name,Object value)或者BeanUtils.setProperty(Object bean,String name,Object value)
  • map数据封装到Javabean,populate(Object bean, Map<String,? extends Object> properties)

实例

对象的拷贝

  @Test
	public void test() throws Exception {
		//创建对象
		Student s=new Student();
		/**
		 * 组件对JavaBean的操作
		 * bean:javaBean对象
		 * name:对象的属性名称
		 * value:对象的属性值
		 */
		//1.实现对象的属性拷贝, 对于基本数据类型,会自动进行类型转换
		BeanUtils.copyProperty(s, "id","2018100712");

		//2.实现对象之间的拷贝:Object dest<---Object orig
		Student s2=new Student();
		BeanUtils.copyProperties(s2, s);
		System.out.println(s2);
  }

对象属性的拷贝

@Test
	public void test() throws Exception {
		//创建对象
		Student s=new Student();
		/*一般的操作
		s.setId("1221212");
		s.setName("老王");
		System.out.println(s);
		*/
		//1.实现对象的属性拷贝, 对于基本数据类型,会自动进行类型转换
		BeanUtils.copyProperty(s, "id","2018100712");
    System.out.println(s)
}

map数据封装到javaBean

注意:要map中的数据封装到JavaBean中去,需要map中的key与JavaBean里面的私有化的属性要相匹配

@Test
	public void test() throws Exception {
		//创建对象
		Student s2=new Student();
		//1.map的数据拷贝到对象中去
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("id","12233");
		map.put("name","老王");
		map.put("sex","男");
		BeanUtils.populate(s2, map);
		System.out.println(s2);
	}

类型转换器

当javaBean中出现非基本类型数据的私有化属性,并且需要对该数据进行封装时,就要去注册该数据类型的类型转换器了,不如就会出现错误,比如该Student对象中的日期类型。

日期类型转换出错:org.apache.commons.beanutils.converters.DateConverter toDate 警告:  DateConverter does not support default String to 'Date' conversion,可以看出工具类converters在转换的时候出现了错误,为此我们可以去查看该类,以便我们接下来去实现类型转换。

converter

在解压出来的BeanUtils文件下的apidoc目录中的index.html里面可以找到该类的说明,会发现它是一个接口,有很多的实现类,我们可以使用里面的实现类来做日期类型的转换或者说我们可以自己去注册个类型转换器。

自定义类型转换器

去复写ConvertUtils里面的register(Converter converter, Class<?> clazz)方法

@Test
	public void test2() throws Exception {
		//假设网页表单提交过来的数据
		String name="老王";
		String id="121212";
		String date="2018-10-11";
		Student s=new Student();
		//1.自定义:注册日期类型转换器去复写ConvertUtils里面的register(Converter converter, Class<?> clazz)方法
		ConvertUtils.register(new Converter() {
			//修改第三方jar引入方法的参数时候,可以关联源码,ctrl选择该类,点进去,选择Attach source--->external file
			@Override
			public Object convert(Class type, Object value) {
				//判断
				if (value ==null ||"".equals(value.toString().trim())){
					return null;
				}
				if (type !=Date.class){
					return null;
				}
				try {
					//字符串转换为日期
					SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
					return sdf.parse(value.toString());
				} catch (Exception e) {
					throw new RuntimeException(e);
				}
			}
		},Date.class);
		//把表单的数据封装到对象中去
		BeanUtils.copyProperty(s, "name",name);
		BeanUtils.copyProperty(s, "id",id);
		BeanUtils.copyProperty(s, "d",date);
		System.out.println(s);
	}

使用工具类提供的类型转换器

@Test
	public void test3() throws Exception {
		//利用组件提供的日期类型转换器,提供一个实现类
		//假设表单的数据
		String name="老王";
		String id="121212";
		//当日期字符串出现空字符串或者出现空格的情况,会报错org.apache.commons.beanutils.ConversionException
		String date="2018-09-12";
		Student s=new Student();
		ConvertUtils.register(new DateLocaleConverter(), Date.class);
		//把表单的数据封装到对象中去
		BeanUtils.copyProperty(s, "name",name);
		BeanUtils.copyProperty(s, "id",id);
		BeanUtils.copyProperty(s, "d",date);
		System.out.println(s);
	}

注意:当日期字符串是空字符串或者存在空格的时候,会报错!

BeanUtils在servlet的使用

获取表单提交的数据并封装到javabean中去,request.getParameterMap()获取所有的参数并存储到Map中去,并利用BeanUtils里面的populate(Object bean, Map<String,? extends Object> properties),封装到对象中去,简化了很多的操作!

1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <title>注册</title>
 </head>
 <body>
 	<form action="registe.do" method="post">
 		用户名称:<input type="text" name="name"><br>
 		密  码:<input type="password" name="password"><br>
 		联系方式:<input type="text" name="phone"><br>
 		<input type="submit" value="提交">
 	</form>
 </body>
</html>

jsp显示的结果:

 

2.servlet

package cn.tan.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import cn.tan.entry.Student;

public class GetDataServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		//获取所有参数
		Map<String, String[]> map = request.getParameterMap();
		Student s=new Student();
		try {
			BeanUtils.populate(s, map);
			//测试,输出封装的结果
			System.out.println(s);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

}

输出结果:Student [name=老王, age=0, password=11111, phone=13232174361]

更多关于Java类库BeanUtils组件使用方法级实例请查看下面的相关链接

(0)

相关推荐

  • Java工具类BeanUtils库介绍及实例详解

    BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把对象的属性数据封装到对象中. 在整个J2EE的编程过程中,我们经常会从各种配置文件中读取相应的数据,需要明白的一点是从配置文件中读取到的数据都是String,但是很显然我们的应用程序中不仅仅有String一种数据类型,比如:基本数据类型(int.double.char.float等),还有自定义数据类型(引用数据类型), 那么我们必须面临的一个问题就是讲字符串类型转换为各种具体的数据类型,该怎么办呢? 有两

  • Commons beanutils组件简介

    Commons Beanutils是Apache开源组织提供的用于操作JAVA BEAN的工具包.使用commons beanutils,我们可以很方便的对bean对象的属性进行操作.今天为大家介绍一下该包的常用方法. 1.什么是BeanUtils 程序中对javabean的操作很频繁, 所以apache提供了一套开源的api,方便对javabean的操作,即BeanUtils组件. 2.BeanUtils的作用 简化javabean的操作. 在一般的写bean组件的时候,都必须要写setter

  • JSP 开发之Spring BeanUtils组件使用

    JSP 开发之Spring BeanUtils组件使用 用于演示的javabean import java.util.Date; public class People { private String name; private int age; private Date birth; public People(String name, int age, Date birth) { super(); this.name = name; this.age = age; this.birth =

  • Java类库BeanUtils组件使用方法及实例详解

    BeanUtils BeanUtils是Apache commens组件里面的成员,由Apache提供的一套开源api,用于简化对javaBean的操作,能够对基本类型自动转换. JavaBean BeanUtils组件是用于简化javaBean的操作,那么什么是javaBean呢?简单来说,javaBean实质就是java类,只不过是遵循了某种规范的java类. javaBean的特点: 必须具有一个无参的构造方法 属性必须私有化 私有化的属性必须通过public类型的方法来暴露,也就是说要出

  • java 中序列化与readResolve()方法的实例详解

    java 中序列化与readResolve()方法的实例详解 readResolve方法是作用是什么?这个方法跟对象的序列化相关(这样倒是解释了为什么 readResolve方法是private修饰的). 怎么跟对象的序列化相关了? 下面我们先简要地回顾下对象的序列化.一般来说,一个类实现了 Serializable接口,我们就可以把它往内存地写再从内存里读出而"组装"成一个跟原来一模一样的对象.不过当序列化遇到单例时,里边就有了个问题:从内存读出而组装的对象破坏了单例的规则.单例是要

  • Java时间类库Timer的使用方法与实例详解

    使用 Java 来调度定时任务时,我们经常会使用 Timer 类搞定.Timer 简单易用,在一些业务场景下用来实现简单定时调度. Jave时间类库Timer简单使用 创建Timer对象 编写 自己的 task 类,该类集成 TimerTask,重写 run 方法,把要定时执行的逻辑写在里面 使用 Timer 执行 TimerTask // 5秒后开始执行,每秒执行一次 Timer timer = new Timer(); timer.schedule(new TimerTask() { pub

  • java 中createStatement()方法的实例详解

    java 中createStatement()方法的实例详解 用缺省设置创建时,ResultSet 是一种只能访问一次(one-time-through).只能向前访问(forward-only)和只读的对象.您只能访问数据一次,如果再次需要该 数据,必须重新查询数据库. 然而,并不只有这一种方式.通过设置 Statement 对象上的参数,您可以控制它产生的 ResultSet.例如: ... Class.forName(driverName); db = DriverManager.getC

  • java导出Excel通用方法的实例详解

    java导出Excel通用方法的实例详解 Java导出Excel通用方法,只需要一个list 集合.通用方法改进之处踊跃提出 package oa.common.utils; import java.io.OutputStream; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import java.lan

  • Java静态工厂方法的实例详解

     Java静态工厂方法的实例详解 什么是静态工厂方法 对于类而言,为了让使用者获取它自身的一个实例,最常用的方法就是提供一个公有的构造器. 当然,这里要介绍的是另一种方法--静态工厂方法,一个返回类的实例的静态方法. 举个例子,Boolean的一个将基本类型boolean转为封装类的方法,valueOf: public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); } 为什么要使用静态工厂方法 那么,我们为什么要使用

  • Java 重载、重写、构造函数的实例详解

    Java 重载.重写.构造函数的实例详解 方法重写 1.重写只能出现在继承关系之中.当一个类继承它的父类方法时,都有机会重写该父类的方法.一个特例是父类的方法被标识为final.重写的主要优点是能够定义某个子类型特有的行为. class Animal { public void eat(){ System.out.println ("Animal is eating."); } } class Horse extends Animal{ public void eat(){ Syste

  • FasfDFS整合Java实现文件上传下载功能实例详解

    在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java代码实现文件的上传和下载.对此作者提供了Java API支持,下载fastdfs-client-java将源码添加到项目中.或者在Maven项目pom.xml文件中添加依赖 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs-client-java</arti

  • java 数据结构中栈和队列的实例详解

    java 数据结构中栈和队列的实例详解 栈和队列是两种重要的线性数据结构,都是在一个特定的范围的存储单元中的存储数据.与线性表相比,它们的插入和删除操作收到更多的约束和限定,又被称为限定性的线性表结构.栈是先进后出FILO,队列是先进先出FIFO,但是有的数据结构按照一定的条件排队数据的队列,这时候的队列属于特殊队列,不一定按照上面的原则. 实现栈:采用数组和链表两种方法来实现栈 链表方法: package com.cl.content01; /* * 使用链表来实现栈 */ public cl

  • Java使用AES加密和解密的实例详解

    Java使用AES加密和解密的实例详解 前言: AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128.192.256,分组长度128位,算法应易于各种硬件和软件实现.1998年NIST开始AES第一轮分析.测试和征集,共产生了15个候选算法.1999年3月完成了第二轮AES2的分析.测试.2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为 AES. 在应用方面,尽管DES在安全上

随机推荐