这个类给我第一感觉就是,OC里的RunTime里的动态添加属性,详细就不说了,简单介绍一下使用方法吧.
首先,我使用的是IDEA(Mac)版本的,这里我通过本地服务器(Tomcat) 来做这个演示.
- 先创建一个html,这里就以最普通的登录界面来做吧
<form action="/request" method="get">
用户名 <input type="text" name="userName">
<br/>
爱好:
<input type="checkbox" value="篮球" name="favorite">篮球
<input type="checkbox" value="足球" name="favorite">足球
<input type="checkbox" value="网球" name="favorite">网球
<br/>
<select name="city">
<option value="">-----请选择-----</option>
<option value="浙江">浙江</option>
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="广州">广州</option>
</select>
<br/>
<input type="submit">注册
<form/>
显示效果
验证码我删掉了(直接用的ValidateCode)
image.png
- 然后创建一个类,用来保存这些属性,名字随便取,我就取个User吧
public class User {
private String userName;
private String[] favorite;
private String city;
/*
这里实现setter,getter方法(有点长就不贴了)
*/
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", favorite=" + Arrays.toString(favorite) +
", city='" + city + '\'' +
'}';
}
}
- 最后就是创建一个servlet,在doGet方法里,做我们要做的事情
try {
User user = new User();
System.out.println("之前属性"+user);
//1.获取所有name 和 value
Map<String, String[]> parameterMap = request.getParameterMap();
// 获取每一个字典对象
for (Map.Entry<String,String[]> m:parameterMap.entrySet()) {
String name = m.getKey();
String[] value = m.getValue();
//创建一个属性描述器
PropertyDescriptor pd = new PropertyDescriptor(name,User.class);
Method setter = pd.getWriteMethod();
if (value.length == 1){
setter.invoke(user,value[0]);//给单个值的变量赋值
}else{
setter.invoke(user,(Object)value);//给复选框赋值
}
};
System.out.println("之后属性"+user);}catch (Exception e){
e.printStackTrace();
}
这里创建属性描述器,内部会再调用👇这个方法
public PropertyDescriptor(String propertyName, Class<?> beanClass,
String readMethodName, String writeMethodName)
里面会将User类里面跟我们给的name相同的所有的setter方法赋值给writeMethodName, get方法赋值给readMethodName.
这里贴几条内部实现方法
Introspector.SET_PREFIX + NameGenerator.capitalize(propertyName));
// 这个SET_PREFIX == static final String SET_PREFIX = "set";
// capitalize这个方法,是来操作我们传进去的 name 的通过下面的方法,将头字母转为大写,以后大家如果需要转头字母,可以直接复制这个哈哈,毕竟是java自己的(原装总是好的)
public static String capitalize(String name) {
if (name == null || name.length() == 0) {
return name;
}
return name.substring(0, 1).toUpperCase(ENGLISH) + name.substring(1);
}
所以当我们遍历的时候, Method setter = pd.getWriteMethod(); 这个就是获得setter方法,当遍历结束的时候,我们所有的值就都已经赋好值了
(注意的一点是,属性名最好跟html里的name一样,这样快捷生存setter,getter方法的时候,就不需要再改了,不易报错)#。
好了,大家可以试试,这是这个小demo
网友评论