PropertyDescriptor属性描述器简单使用

这个类给我第一感觉就是,OC里的RunTime里的动态添加属性,详细就不说了,简单介绍一下使用方法吧.

首先,我使用的是IDEA(Mac)版本的,这里我通过本地服务器(Tomcat) 来做这个演示.

  1. 先创建一个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
  1. 然后创建一个类,用来保存这些属性,名字随便取,我就取个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 + '\'' +
                '}';
    }
}
  1. 最后就是创建一个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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,609评论 18 399
  • 如今我已不是那个二十出头的我,却总是会忘记我已经快要三十,尤其是在25岁以后,我常常还是以为我才二十五岁。二十出头...
    夜小小邹阅读 2,707评论 0 0
  • 微亮的曙光,就靠近我枕边 昨夜未说完的风声,会落在哪里? 没有梦的人,竟然念着一个名字 眼神忧郁,仿佛失去了所有的...
    煮熊阅读 1,643评论 6 2
  • 我见过天堂和地狱 我见过高山和海洋 我见过貌美如花的姑娘 也见过彬彬有礼的绅士 我见过乡间朴实的农民 也见过背井离...
    妄独阅读 3,723评论 0 2

友情链接更多精彩内容