一. 作用
将请求中的数据,自动获取,并封装到给出的,javabean类中,返回存储着数据的对象:
如下所示:
//request : ?title=aaaa&summary=xxxx&content=sfsfdsfsdf
// 请求的参数自动封装到实体类中
News news = new News();
String title = req.getParameter("title");
String content = req.getParameter("content");
news.setTitle(title);
news.setContent(content);
return news;
二. 实现
- 获取 key-value的键值对,集合
- 得到key对应的方法
- 将value 转化为对应方法的参数属性
- 将参数放入对象中
public class MyBeanUtils {
public static <T> T requestToBean(Class<T> cls,HttpServletRequest request) {
try {
T obj = cls.getDeclaredConstructor().newInstance();
//获取参数 ?title=aaaa&content=xxxxxx&xx=yyyy
Map<String, String[]> paramMap = request.getParameterMap();
//遍历Map
Set<Entry<String, String[]>> set = paramMap.entrySet();
for (Entry<String, String[]> entry : set) {
String name = entry.getKey(); //属性名
String[] value = entry.getValue();
try {
//根据属性名获取setter方法 title----setTitle()
String setName = "set"+name.substring(0,1).toUpperCase()+name.substring(1); //setName = "setTitle";
Class<?> type = cls.getDeclaredField(name).getType(); //获取对应的属性的类型
// 方法名 参数类型
Method method = cls.getDeclaredMethod(setName, type);
// obj.setTitle(value);
Object val = value[0];
// 转型问题:
if(type==int.class || type==Integer.class) {
val = Integer.parseInt(val.toString());
}else if(type==float.class || type==Float.class) {
val = Float.parseFloat(val.toString());
}
//obj.setTitle(value);
method.invoke(obj, val);
}catch (Exception e) {
}
}
return obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}