在學習了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]