转自: http://www.2cto.com/kf/201402/278960.html
本文前提:参数名称与实体属性一致!
Java的Web项目中,经常有servlet中接收参数赋值给实体,参数如果多了就很麻烦,这里提供两个简单通用的方法:
比如实体为Student
1.使用org.apache.commons.beanutils.BeanUtils:
Student stu = new Student(); BeanUtils.populate(stu, request.getParameterMap());
当然实际工作中,有些参数值为空或者参数类型与实体属性类型不匹配,这就会报异常,因此这个不太可靠,这时可以用方法3
2.利用反射:
获得所有set方法,排除掉Object基类本身的set方法,从get方法中可以得到属性名,而属性名即是request的参数名
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; /**Servlet业务中实体工具 * @author LiuDing * 2014-2-16-下午08:10:06 */ public class ServletBeanTools { /**自动匹配参数赋值到实体bean中 * @author LiuDing * 2014-2-16 下午10:23:37 * @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; 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); if(StringUtils.isEmpty(value)){ 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(Short.class.getName().equals(fieldType) && NumberUtils.isDigits((String)value)){ m.invoke(bean, Short.valueOf((String)value)); }else if(Float.class.getName().equals(fieldType) && NumberUtils.isNumber((String)value)){ m.invoke(bean, Float.valueOf((String)value)); }else if(Double.class.getName().equals(fieldType) && NumberUtils.isNumber((String)value)){ m.invoke(bean, Double.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; } } } }