在学习了request对象获取前端数据时;老师提到了通常会利用request.getParameterMap()获取map集合,在通过工具BeanUtil解析成一个值对象
在学习类反射后已经好久没练习了,今日就自制了一个简易的Beanutil工具实现前端数据解析成值对象
note:基于request.getParameterMap()获取的Map<String,String[]>模式编写,只能解析常规的基本类型及基本类型数组的值对象
前端组件:
<form action="RequestServlet" method="post">
Name:<input type="text" name="name"/><br/>
Age:<input type="text" name="age"/><br/>
爱好:
<input type="checkbox" name="hoby" value="MUSIC"/>音乐
<input type="checkbox" name="hoby" value="MTV"/>电视
<input type="checkbox" name="hoby" value="driver"/>开车<br/>
性别:
<input type="radio" name="sex" value="0" checked="checked"/>男
<input type="radio" name="sex" value="1"/>女
<input type="submit" value="提交"/>
</form>
Servelt接受:
request.setCharacterEncoding("utf-8");
Map<String, String[]> map=request.getParameterMap();
System.out.println(BeanUtil.getInstance(UserModel.class, map));
BeanUtil处理:
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
public class BeanUtil {
public static<T> T getInstance(Class<T> cls,Map<String, ?> map){
T obj=null;
try {
obj=cls.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Field[] fields=cls.getDeclaredFields();
for(Field field:fields){
String fieldName=field.getName();
Object fieldValue=map.get(fieldName);
if(fieldValue==null)
continue;
String fieldNameUp=fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
try {
Method method=cls.getMethod("set"+fieldNameUp, field.getType());
//invoke的第二参数必须是数组
method.invoke(obj, getList(fieldValue));
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return obj;
}
private static Object[] getList(Object fieldValue){
Object[] list=null;
if(fieldValue instanceof Object[]){
Object[] array=(Object[])fieldValue;
if(array.length==1)
list=array;
else if(array.length>1){
list=new Object[1];
list[0]=fieldValue;
}
}
else{
list=new Object[1];
list[0]=fieldValue;
}
return list;
}
}
前端输入数据:
输入的解析值对象:
UserModel [name=张三, age=56, hoby=[MUSIC, MTV, driver], sex=0]