📄 populationutils.java
字号:
package eols.tools.binder;
/**
* 根据HttpServletRequest中的参数值初始化指定的JavaBean对象, 并执行相应的类型转换工作.
* 比如, 将字符串转换为int, double, boolean等.
*
* 本工具类主要用于减少各控制器类中取得各request参数的值的代码量, 特别是对于具有大量输入
* 参数的表单而言, 这项工作更为必要. 另外, 虽然spring框架提供了有关的JavaBean初始化机制,
* 但是, 该机制太复杂, 工作量依然很大. 因此, 编写了该工具类.
*
*/
import java.util.Map;
import java.util.List;
import java.util.ArrayList;
import javax.servlet.ServletRequest;
import javax.servlet.ServletException;
import org.springframework.web.bind.BindInitializer;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.MutablePropertyValues;
import eols.tools.binder.BindException;
import eols.tools.*;
public final class PopulationUtils {
/**
* 根据request参数的值, 设置提供的JavaBean类的属性值, 并提供相应的类型转换功能.
* 另外, 如果类型转换失败, 则将失败信息包装在提供的JavaBean中. 同时, 为了处理中
* 文字符, 本方法还提供编码转换工作.
*
* 本方法返回一个bean实例.
*
* @param bean 需要设置属性值的JavaBean对象
* @param request 包装了参数的ServletRequest对象
* @param error 类型转换错误信息包装对象
*/
public static BindException bind(ServletRequest request, Object bean, boolean isResultNeedTranslate) {
CustomServletRequestDataBinder binder = new
CustomServletRequestDataBinder(bean, bean.getClass().getName());
binder.bind(request, isResultNeedTranslate);
return binder.getErrors();
}
/**
* 根据request参数的值, 设置提供的JavaBean类的属性值, 并提供相应的类型转换功能.
*
* @param bean 需要设置属性值的JavaBean对象
* @param request 包装了参数的ServletRequest对象
* @param beanName 需要设置属性值的JavaBean对象的名称
* @return 初始化异常
*/
private static BindException bind(ServletRequest request, Object bean,
String beanName, boolean isResultNeedTranslate) {
CustomServletRequestDataBinder binder = new
CustomServletRequestDataBinder(bean, beanName);
binder.bind(request, isResultNeedTranslate);
return binder.getErrors();
}
/**
* 根据request参数的值, 设置提供的JavaBean类的属性值, 并提供相应的类型转换功能.
* 另外, 如果类型转换失败, 则将失败信息包装在提供的JavaBean中. 同时, 为了处理中
* 文字符, 本方法还提供编码转换工作.
*
* 本方法返回一个包装了bean实例数组的BindException对象. 本方法的工作流程是:
* (1) 取得给定属性名称数组的所有属性值(为一String数组)
* (2) 用这个属性值数组初始化给定bean实例对象状态
* (3) 返回包含了所有request属性值的bean实例对象数组
*
* @param beanClassName 需要设置属性值的JavaBean对象的类名称
* @param parameterNames 需要设置属性值的属性名称数组
* @param extraPropertyAndItsValue 需要额外设置的属性及其属性值
* @param request 包装了参数的ServletRequest对象
* @param ArrayListWrapper 结果包装类对象
*/
public static ArrayListWrapper bind(ServletRequest request, String beanClassName, String[] parameterNames,
PropertyValue extraPropertyAndItsValue) throws Exception {
// 结果包装对象
ArrayListWrapper resultWrapper = new ArrayListWrapper();
// 结果List
List result = new ArrayList();
// 绑定异常对象
FastStringBuffer errors = new FastStringBuffer();
// 给定属性名的属性值
Map valuesMap = WebUtils.getSpecifiedParameterValues(request, parameterNames);
if (valuesMap != null && valuesMap.size() > 0) {
// 取得用户输入数据的行数
int rowCount = 0;
if (valuesMap.get("rowCount")instanceof Integer) {
rowCount = ( (Integer) valuesMap.get("rowCount")).intValue();
int len = parameterNames.length;
String value = null;
PropertyValue propertyValue = null;
MutablePropertyValues propertyValues = null;
CustomServletRequestDataBinder binder = null;
for (int i = 0; i < rowCount; i++) {
propertyValues = new MutablePropertyValues();
/** 设置用户提供的属性及其值 */
if (extraPropertyAndItsValue != null) {
propertyValues.addPropertyValue(extraPropertyAndItsValue);
}
/** 构造绑定对象 */
binder = new
CustomServletRequestDataBinder(Class.forName(beanClassName).newInstance(), beanClassName);
/** 根据每一行的值绑定每一个实例对象 */
for (int j = 0; j < len; j++) {
try {
value = ( (String[]) valuesMap.get(parameterNames[j]))[i];
}
catch (Exception e) {
/**忽略此异常*/
value = null;
}
propertyValue = new PropertyValue(parameterNames[j], value);
propertyValues.addPropertyValue(propertyValue);
}
/** bean 对象绑定 */
binder.bind(propertyValues);
/** 如果出现了绑定异常, 则纪录该异常, 否则, 将帮定好的bean实例对象加入到列表中 */
if (binder.getErrors().getAllErrors().size() > 0) {
errors.append(binder.getErrors().getMessage());
}
else {
result.add(binder.getTarget());
}
}
}
}
resultWrapper.setErrors(errors.toString());
resultWrapper.setWrapperedList(result);
return resultWrapper;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -