最近在学JavaWeb,JSP提交Form表单数据通常封装至实体Bean中,再提交给Servlet,由于在Servlet中可以使用HttpServletRequest#getParameterMap() 得到Request中请求参数的Map集合,所以想通过Map中的值得到一个实体对象。
注意:定义实体的属性名要和Form表单标签的name属性值相同,同时Form表单传递来的数据都是String类型,可以不使用类型匹配条件。
格式:实体对象 toBean(map,实体对象.class)
1. 实体类:
package test;
import java.util.Date;
public class Person {
private String name;
private int age;
private float salary;
private double score;
private Date date;
private boolean flag;
private Integer in;
public Person(String name, int age, float salary, double score, Date date,
boolean flag, Integer in) {
super();
this.name = name;
this.age = age;
this.salary = salary;
this.score = score;
this.date = date;
this.flag = flag;
this.in = in;
}
public Person() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public float getSalary() {
return salary;
}
public void setSalary(float salary) {
this.salary = salary;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public Integer getIn() {
return in;
}
public void setIn(Integer in) {
this.in = in;
}
@Override
public String toString() {
return "Person [age=" + age + ", date=" + date + ", flag=" + flag
+ ", in=" + in + ", name=" + name + ", salary=" + salary
+ ", score=" + score + "]";
}
}
2. 工具类,通过Java反射机制实现
package test;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
public class CommonUtil {
public static <T> T toBean(Map<String, Object> map, Class<T> clazz) {
if (map == null || map.size() <= 0) {
return null;
}
T t = null;
Set<Entry<String, Object>> entrySet = map.entrySet();
try {
t = clazz.newInstance();
Field[] fields = clazz.getDeclaredFields();
for (Entry<String, Object> entry : entrySet) {
for (Field field : fields) {
field.setAccessible(true);
// 属性名
String fieldName = field.getName();
// 属性类型
String fieldType = field.getGenericType().toString();
System.out.println("属性名:" + fieldName + ", 属性类型:"
+ fieldType);
if (fieldType.contains("String")
&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
} else if (fieldType.contains("int")
&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
} else if (fieldType.contains("float")&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
} else if (fieldType.contains("double")&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
} else if (fieldType.contains("long")&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
} else if (fieldType.contains("byte")&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
} else if (fieldType.contains("Integer")&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
} else if (fieldType.contains("boolean")&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
}else if (fieldType.contains("Date")&& fieldName.equalsIgnoreCase(entry.getKey())) {
field.set(t, entry.getValue());
}
}
}
System.out.println("t= " + t);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return t;
}
}
3 测试
package test;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
public class TestUtil {
@Test
public void test() {
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "小黑");
map.put("age", 11);
map.put("date", new Date());
map.put("flag",true);
CommonUtil.toBean(map, Person.class);
}
}
输出结果:
属性名:name, 属性类型:class java.lang.String
属性名:age, 属性类型:int
属性名:salary, 属性类型:float
属性名:score, 属性类型:double
属性名:date, 属性类型:class java.util.Date
属性名:flag, 属性类型:boolean
属性名:in, 属性类型:class java.lang.Integer
t= Person [age=11, date=Wed Nov 02 11:39:35 CST 2016, flag=true, in=null, name=小黑, salary=0.0, score=0.0]