美文网首页黄小超~要变的更加优秀哦☺️😊
PropertyDescriptor属性描述器简单使用

PropertyDescriptor属性描述器简单使用

作者: JS_Coder | 来源:发表于2017-08-18 05:17 被阅读0次

    这个类给我第一感觉就是,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

    相关文章

      网友评论

        本文标题:PropertyDescriptor属性描述器简单使用

        本文链接:https://www.haomeiwen.com/subject/lxsorxtx.html