对于BeanUtils这个工具,我也用的不是很多,但是还是有点心得和大家分享下,呵呵~~用过spring的都知道spring的MVC框架中有一个BaseCommandController对象,利用这个对象我们就可以很方便的将从客户端传递过来的参数封装到一个JavaBean对象中去,而不需要我们request.getParameter("name");bean.setName(name);了,从而也简化了不少的工作。其实在structs中也有这样的功能的,不过它用的BeanUtils这个工具类,也就是我今天要给大家说的这个类。
commons-beanutils组件是Jakarta Commons项目组中的一个,可以到Jakarta官网上去下载。我们今天讨论的主要就是commons-beanutils中的BeanUtils这个类,这个类都是静态方法,可以很方便的操纵各个JavaBean对象,包括获取属性、设置属性等,我们以例子来进行说明。
假设有如下一个JavaBean对象:
public TestBean
{
private String stringValue;
private int intValue;
public void setStringValue(String value)
{
this.stringValue = value;
}
public String getStringValue()
{
return this.stringValue;
}
public void setIntValue(int value)
{
this.intValue = value;
}
public int getIntValue()
{
return this.intValue;
}
}
那么我们就可以使用BeanUtils来对其进行设置值和获取值了。如下:
TestBean tb = new TestBean();
BeanUtils.setProperty(tb, "stringValue", "hello world!");
BeanUtils.setProperty(tb, "intValue", 123);
通过上述的语句我们就可以给新new的对象设置两个属性了,注意其中第一个参数就是我们的属性名称,这里也是我们在使用这个工具的时候最需要注意的地方。这个属性名称就是我们的TestBean中的getXXX方法中的XXX,比如getStringValue中其属性名称就是stringValue,在使用属性名称的时候,除了XXX中的第一个字母不需要大小写之外,其他的部分是需要严格区分大小写的,这也是JavaBean的规范。这里有一点需要特别注意的就是,如果属性名称中第一个单词(我们界定的)只有一个字母的话,那么其属性名称必须大写!我们可以看这样一个例子:
我们给TestBean加如下一个属性:
……
public void setTName(String name)
{
this.name = name;
}
public void getTName()
{
return this.name;
}
……
那么在使用BeanUtils进行属性赋值的时候,如果你这样写:
BeanUtils.setProperty(tb, "tName", "hello");
那么就会被抛出一个异常,表示这个属性找不到,因为按照JavaBean的规范,属性名称中如果有多个单词,则每一个单词的首字母要大写!这里BeanUtils就会认为属性TName是两个单词,分别是T和Name,所以取属性的时候第一个字母必须要大写,所以其属性就应该是;TName,那么我们就应该如下写操作语句:
BeanUtils.setProperty(tb, "TName", "hello");
这样写才是正确的。那么我们来看在B/S结构的程序中,如何将表单域的参数(不一定是表单域,是参数都可以)转换成一个JavaBean对象,我们以上面的Bean为例子,我们在页面上进行编写如下:
……
<form name="form1" action="/getbean.jsp">
字符串值:<input type="text" name="stringValue" /><br/>
数字值:<input type="text" name="intValue" /><br/>
</form>
……
然后我们在服务器端进行编写如下代码来获取参数,并组装成一个TestBean对象,代码如下:
……
TestBean tb = new TestBean();
BeanUtils.populate(tb, request.getParameterMap());
// 使用BeanUtils工具类来获取对象的属性
System.out.println(BeanUtils.getProperty("stringValue"));
System.out.print(BeanUtils.getProperty("intValue"));
// 直接获取对象的属性
System.out.println(tb.getStringValue());
System.out.println(tb.getIntValue());
……
我们注意到,在表单区域中编写的几个输入框的名称(红色标识的部分)就是我们的TestBean对象的属性名称,然后服务器端的代码中,我们首先使用request.getParameterMap()来获取提交的参数,并转换成一个map对象存储(键是参数名称,值是提交的值),然后我们使用BeanUtils的populate方法来进行赋值。通过打印后,我们可以看到我们输入的值被成功的设置到对象中去了,可以看到简单的两行代码就可以搞定参数到对象的数据绑定工作,如果一个对象有十几个甚至几十个参数属性的话,那么这样的方式将是非常简便的,至少可以少写十几行甚至几十行的代码。
可以看到利用BeanUtils这个工具类可以很方便的进行JavaBean的属性操作和request的参数到JavaBean的属性绑定操作。其他的功能大家就可以参看它的API文档了~~~~
分享到:
相关推荐
在Java开发中,Apache Commons BeanUtils是一个非常实用的工具库,它提供了许多便捷的方法来操作JavaBeans,使得在处理对象属性时变得更加简单。本篇文章将深入探讨如何使用BeanUtils库,特别是通过它将Map对象转换...
在Java开发中,Apache Commons BeanUtils库是一个非常实用的工具,它提供了许多便捷的方法来处理JavaBean对象,包括属性的复制、设置和获取等。然而,就像标题所指出的,“使用BeanUtils操作属性的一个小坑”,在...
例如,我们可以用`BeanUtils.copyProperties()`来拷贝一个对象的属性到另一个对象,这在用户注册时非常有用,可以将表单数据转换为User对象。此外,`BeanUtils.setProperty()`和`BeanUtils.getProperty()`用于设置和...
- **对象复制**:在业务逻辑中,需要创建与原有对象属性相同的实例时,可以使用BeanUtils的复制功能。 - **属性操作**:当需要动态设置或获取JavaBean的属性时,BeanUtils可以大大减少代码量。 3. **集成与应用**...
BeanUtils的核心功能在于提供了一种便捷的方式来复制一个对象的属性到另一个对象,即使这两个对象的属性名称不同,只要类型匹配,BeanUtils就能自动进行转换。此外,它还支持属性的批量设置和获取,以及基于表达式的...
本文将深入探讨如何使用`BeanUtils.copyProperties`进行对象间的属性赋值,并通过示例代码进行详细解释。 `BeanUtils.copyProperties`是Spring框架中的一个静态方法,位于`org.springframework.beans.BeanUtils`类...
BeanUtils是Apache Commons项目中的一个核心工具类库,...通过理解和熟练使用BeanUtils,开发者可以更加高效地进行对象之间的数据交换和处理。而提供的源码则可以帮助我们深入理解其内部机制,更好地定制和扩展功能。
在BeanUtils中,使用Commons Logging进行日志记录,使得库的使用者可以根据自己的需求自由选择合适的日志系统,增加了项目的可配置性。 然而,`commons-beanutils-1.8.0`版本可能存在一些已知的安全问题,如CVE-...
- **通用工具**:BeanUtils作为一个通用的工具包,其很多功能在框架的其他部分也能发挥作用,比如在视图渲染阶段,可以使用BeanUtils获取对象的属性值,以便在模板引擎中展示。 总结来说,Apache Commons BeanUtils...
- 为了提高性能,BeanUtils使用了缓存机制,比如`PropertyDescriptor`的缓存,避免了每次调用时都进行反射查找,显著提升了处理速度。 6. **模块化设计** - BeanUtils库的设计遵循了模块化原则,各个功能组件相对...
BeanUtils库提供了一系列便捷的方法,使得开发者可以更轻松地进行对象属性的设置、获取以及复制,极大地简化了JavaBean的操作流程。下面将详细介绍BeanUtils工具类的核心功能和使用方法。 1. **属性设置与获取** ...
2. **安全问题:** BeanUtils使用反射机制,如果属性是私有的,需要谨慎使用,因为这可能会暴露对象的内部状态。 3. **性能考虑:** 尽管BeanUtils提供了很多便利,但频繁使用反射可能会带来性能损失,对于性能敏感...
3. **类型转换**:BeanUtils内部使用了`PropertyUtils`类来处理属性的类型转换,当源对象和目标对象的属性类型不一致时,它会尝试进行自动类型转换。然而,这种转换并不总是成功,对于一些复杂类型的转换,可能需要...
例如,当需要将数据库查询结果映射到Java Bean对象时,使用BeanUtils的`populate()`方法可以快速完成这一任务。同时,由于BeanUtils库是Apache Commons的一部分,它经过了广泛测试和社区的验证,可靠性较高。 总结...
然而,需要注意的是,BeanUtils使用反射进行操作,可能会带来安全风险,因为它不进行任何类型检查。如果属性类型不匹配,可能会抛出`InvocationTargetException`。因此,使用时应确保属性类型的一致性,并对可能出现...
- 在使用BeanUtils时,确保源对象和目标对象的属性名一致,否则复制失败。 - BeanUtils默认处理的是public属性,非public属性需要自定义转换规则。 - 如果属性值是集合或自定义对象,需要递归调用`copyProperties...
在描述中提到的“json转化JavaBean对象封装键值对参数”,意味着我们将讨论如何使用BeanUtils来处理JSON数据与JavaBean之间的相互转换。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于Web...
3. **避免空指针异常**:在处理可能为空的对象或属性时,BeanUtils工具包会进行检查,如果源对象或属性为null,它不会抛出NullPointerException,而是安全地跳过,这在处理不确定的数据源时非常有用。 4. **处理...
Apache BeanUtils库是Java开发中的...不过,由于BeanUtils使用反射,可能存在一定的性能损耗,因此在性能敏感的应用中需要谨慎使用。同时,由于其依赖于JavaBeans规范,对于非JavaBeans对象的操作可能需要额外的适配。