在做j2ee开发和android客户端开发过程中,经常遇到将表单数据提交,然后拷贝到javabean,继而添加在数据库的问题,这个问题有时候考虑不全面会出现转型失败等等各种问题。下面是一个通用的将表单数据拷贝到javabean的方法,用到了反射。
package com.Util;
import java.lang.reflect.Method;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.lang3.time.DateUtils;
public class Request2BeanUtil {
/**自动匹配参数赋值到实体bean中
* @param bean
* @param request
*/
public static void populate(Object bean, HttpServletRequest request){
Class<? extends Object> clazz = bean.getClass();
Method ms[] = clazz.getDeclaredMethods();
String mname;
String field;
String fieldType;
String value;
Object obj = null;
for(Method m : ms){
mname = m.getName();
if(!mname.startsWith("set")
|| ArrayUtils.isEmpty(m.getParameterTypes())){
continue;
}
try{
field = mname.toLowerCase().charAt(3) + mname.substring(4, mname.length());
value = request.getParameter(field);//注意此处要求form表单中的属性名字要求与javabean的字段名字相同
if(StringUtils.isEmpty(value)||value==null){
continue;
}
fieldType = m.getParameterTypes()[0].getName();
//以下可以确认value为String类型
if(String.class.getName().equals(fieldType))
{
m.invoke(bean, (String)value);
}
else if(Integer.class.getName().equals(fieldType) && NumberUtils.isDigits((String)value))
{
m.invoke(bean, Integer.valueOf((String)value));
}
else if(Long.class.getName().equals(fieldType) && NumberUtils.isDigits((String)value))
{
m.invoke(bean, Long.valueOf((String)value));
}
else if(Date.class.getName().equals(fieldType)){
m.invoke(bean, DateUtils.parseDate((String)value, "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss"));
}
else
{
m.invoke(bean, value);
}
}catch(Exception e){
e.printStackTrace();
continue;
}
}
}
}
内容部分引用自http://www.2cto.com/kf/201402/278960.html