java web 之 BeanUtils.populate的作用

BeanUtils.populate方法是Apache Commons Beanutils 中提供的一种快速绑定JavaBean属性值的方法。它可以把一个Map中的属性值直接赋值给一个JavaBean对象的对应属性,同时支持级联属性的设置。

在JavaWeb开发中,经常会遇到从表单提交的数据需要绑定到对应的JavaBean中的场景。比如从前端页面提交的用户注册信息需要存储到后端数据库中,或者在修改页面中展示原有数据并允许修改后保存,这个时候就可以使用BeanUtils.populate方法来自动完成JavaBean属性值的设置,从而在后续的操作中使用JavaBean对象来存取数据。

使用BeanUtils.populate方法需要导入Apache Commons Beanutils相关的jar包,具体方式根据使用的开发工具和项目架构不同而异,一般可以通过Maven/Gradle等自动化构建工具添加依赖。下面是BeanUtils.populate方法的通用使用方法:

```

import org.apache.commons.beanutils.BeanUtils;

//...

try {

// 创建一个空的JavaBean对象

MyBean myBean = new MyBean();

// 获取从前端页面提交的请求参数Map

Map parametersMap = request.getParameterMap();

// 将表单参数绑定到JavaBean对象

BeanUtils.populate(myBean, parametersMap);

// 获取JavaBean对象的属性值并进行后续操作

String name = myBean.getName();

int age = myBean.getAge();

// ...

} catch (Exception e) {

// 异常处理

}

```

上面的代码中,我们首先创建了一个空的MyBean对象,然后获取了从前端页面提交的请求参数Map。最后,调用BeanUtils.populate方法将请求参数绑定到MyBean对象上。在绑定过程中,BeanUtils.populate会根据请求参数的key值自动查找并匹配MyBean对象的属性,并将请求参数对应的value值赋值给MyBean对象的属性。

除了上面的基本使用方法之外,BeanUtils.populate还提供了一些高级用法,比如级联属性设置、日期类型转换等等。下面我们分别来介绍这些用法。

**1. 级联属性设置**

有些JavaBean对象中的属性是另一个JavaBean对象,我们可以通过级联属性来实现对其属性的设置。比如下面的User类中就包含另一个Address对象作为属性:

```

public class User {

private String username;

private String password;

private int age;

private Address address;

// ...

}

public class Address {

private String province;

private String city;

private String district;

private String street;

// ...

}

```

如果我们要将从前端提交的请求参数绑定到User对象中,同时需要设置User对象中的Address属性,则可以采用以下方式:

```

MyBean myBean = new MyBean();

Map parametersMap = request.getParameterMap();

// 创建Address对象,因为Address是User的属性,因此我们需要先将Address对象实例化并设置到User中

Address address = new Address();

myBean.setAddress(address);

// 将表单参数绑定到JavaBean对象

BeanUtils.populate(myBean, parametersMap);

// 获取JavaBean对象的属性值并进行后续操作

String username = myBean.getUsername();

String city = myBean.getAddress().getCity();

// ...

```

从上面的代码可以看出,我们在设置JavaBean对象时,需要将级联属性的值提前设置好,BeanUtils.populate会通过反射查找JavaBean对象中的属性,并自动将参数的值转换为对应的类型并赋值给JavaBean对象的属性。

**2. 日期类型转换**

当需要绑定一个日期类型属性时,BeanUtils.populate方法默认只支持java.util.Date和java.sql.Date两种类型,如果需要绑定其他类型的日期,比如java.time.LocalDate等,则需要自定义类型转换器(Converter)。

使用自定义类型转换器需要手动实现Converter接口,并将其注册到ConvertUtilsBean实例上。下面是一个自定义类型转换器的实现示例:

```

public class LocalDateConverter implements Converter {

@Override

public Object convert(Class type, Object value) {

if (value == null) {

return null;

}

if (value instanceof LocalDate) {

return value;

}

String strVal = value.toString().trim();

if (strVal.length() == 0) {

return null;

}

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

return LocalDate.parse(strVal, formatter);

}

}

```

上面的代码实现了将String类型的日期值转换为LocalDate类型的转换器。我们可以将其注册到ConvertUtilsBean实例上,以便在BeanUtils.populate绑定JavaBean属性时使用。下面是实现自定义类型转换器的完整代码:

```

import org.apache.commons.beanutils.BeanUtilsBean;

import org.apache.commons.beanutils.ConvertUtilsBean;

import org.apache.commons.beanutils.Converter;

//...

try {

// 创建一个空的JavaBean对象

MyBean myBean = new MyBean();

// 获取从前端页面提交的请求参数Map

Map parametersMap = request.getParameterMap();

// 注册LocalDate类型转换器

ConvertUtilsBean convertUtils = new ConvertUtilsBean();

convertUtils.register(new LocalDateConverter(), LocalDate.class);

// 设置类型转换器

BeanUtilsBean beanUtils = new BeanUtilsBean(convertUtils);

// 将表单参数绑定到JavaBean对象

beanUtils.populate(myBean, parametersMap);

// 获取JavaBean对象的属性值并进行后续操作

String name = myBean.getName();

LocalDate birth = myBean.getBirth();

// ...

} catch (Exception e) {

// 异常处理

}

```

**3. 案例说明**

下面我们来看一个从前端传来JSON字符串,并将其绑定到JavaBean对象上的例子。

首先我们需要准备一个简单的JavaBean类:

```

public class User {

private String name;

private int age;

private LocalDate birth;

private String address;

//...

}

```

接下来,我们需要通过Ajax方式从前端页面传来一个JSON字符串:

```

$.ajax({

url: "/api/user",

data: JSON.stringify({

"name": "张三",

"age": 20,

"birth": "2000-01-01",

"address": "北京市海淀区中关村"

}),

type: "POST",

contentType: "application/json; charset=utf-8",

success: function(data) {

console.log("User saved successfully: " + data);

},

error: function(error) {

console.log("Failed to save user: " + error);

}

});

```

接着,我们在后端的Controller类中处理请求,在处理请求中我们将从前端transmit的JSON字符串转化为HashMap类型:

```

@RestController

public class UserController {

@PostMapping("/api/user")

public ResponseEntity saveUser(HttpServletRequest request) throws Exception {

// 将请求参数的JSON字符转换为HashMap类型

ObjectMapper mapper = new ObjectMapper();

Map parametersMap = mapper.readValue(request.getInputStream(), HashMap.class);

// 将Map类型的参数绑定到JavaBean对象

User user = new User();

BeanUtils.populate(user, parametersMap);

// 在这里可将 user 保存到数据库中

return ResponseEntity.ok(user);

}

}

```

从上面的代码我们可以看到,我们利用了 BeanUtils.populate 方法将对象和前台传来的 HashMap 进行了绑定。

以上就是BeanUtils.populate方法的详细介绍及使用方法,适用于JavaWeb项目中表单数据绑定JavaBean对象的场景。BeanUtils.populate方法支持基本类型、String类型、日期类型、级联属性等复杂场景,可以大大简化前后端数据交互时的代码量。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(27) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部