Fork me on GitHub

JavaBean 介绍

// Person.java
    public class Person{
        private String name;
        private int age;

        // 无参构造函数
        public Person(){
            super();
        }

        // 有参构造函数
        public Person(String name, int age){
            super();
            this.name = name;
            this.age = age;
        }

        public String getName(){
            return name;
        }

        public void setName(String name){
            this.name = name;
        }

        public int getAge(){
            return age;
        }

        public void setAge(int age){
            this.age = age;
        }

        public int getId(){
            return "dfkdklfjk";
        }

        public String toString(){
            return "Person [name="+name+",age="+age+"]";
        }
    }
  1. JavaBean 是特殊的 Java 类, 位于 JavaSE 中的 java.beans 包中;

  2. JavaBean 规范:

    • 必须要有一个默认的无参构造函数;
    • 提供 get/set 方法, 如果只有 get 方法, 那么这个属性是只读属性;
    • 需要被序列化并且实现了 Serializable 接口;
    • 一般对于具有 get/set 方法的成员变量称之为属性. 其实就算一个属性没有对应的成员变量,
      只有 get/set 方法也是可以的. 该属性的名称就是 get/set 方法去除 get/set 后,再把首字母小写.
      例如, 上面代码中的 "id" 属性.
    • boolean 类型的属性, 它的读方法可以是 "is" 开头, 也可以是 "get" 开头;
  3. 内省

    • 内省的目标是得到 JavaBean 属性的读, 写方法的反射对象, 通过反射对 JavaBean 属性进行操作的一组 API.
      例如 Person 类有名为 name 的 JavaBean 属性, 通过两个 Method 对象(一个是 getName(), 一个是 setName()),
      来操作 Person 对象.
// 得到 BeanInfo, BeanInfo 是一个 JavaBean 类型的信息类
    BeanInfo info = Introspector.getBeanInfo(Person.class);

// 得到属性描述符对象
    PropertyDiscriptor[] discriptors = info.getPropertyDiscriptor();

// 通过 getReadMethod() 或 getWriteMethod() 得到一个属性的读或写方法

// 通过 读/写 方法来操作 JavaBean 属性

  1. commons-beanutils 工具类是依赖内省完成的!
  • 导包:
    • commons-beanutils.jar
    • commons-logging.jar
// 示例
    // 第一种方式:
    public void fun1(){
        String className = "cn.itcast.domain.Person";
        Class clazz = Class.forName(className);
        Object bean = clazz.newInstance();

        // 使用 BeanUtils 给 bean 的各个属性赋值
        BeanUtils.setProperty(bean,"name","张三");
        BeanUtils.setProperty(bean,"age","25");

        // 获取 bean 中属性的值, 返回 String 类型的值
        String age = BeanUtils.getProperty(bean,"age");

        System.out.println(bean);
    }

    // 第二种方式: 把 map 中的属性直接封装到一个 bean 中
    // Map: {"name":"张三", "age":"25"}
    // 要求: map 中的 key 与 bean 的属性名相同!!
    // 如果 Map:{"name":"李四"},  Person 的值为 Person [name=李四,age=null];

    public void fun2(){

        Map<String,String> map = new HashMap<String,String>();
        map.put("name","张三");
        map.put("age","25");

        Person person = new Person();
        BeanUtils.populate(person,map);  // 此时, person 对象就是 (张三,25);
    }

2. jsp 中与 javabean 相关标签

// 示例:
    <jsp:useBean> : 创建或查询 bean
    // 在 session 域中查找名为 user2 的 bean, 如果不存在, 就创建
    <jsp:useBean id="user2" class="cn.itcast.domain.User" scope="session" />

// 语法格式:
    <jsp:useBean id="自定义id" class="bean 编译的类" scope="bean 作用域">
        <jsp:setProperty name="bean 的 id" property="属性名" value="值"/>

        <jsp:getProperty name="bean 的 id" property="属性名"/>
        ......
    </jsp:useBean>


// 示例: a.jsp
    <body>
        <jsp:useBean id="person" class="cn.itcast.domain.Person">
            <jsp:setProperty name="person" property="name" value="张三"/>
            <jsp:setProperty name="person" property="age" value="25"/>

        </jsp:useBean>

        <p>姓名:
            <jsp:getProperty name="person" property="name"/>
        </p>
        <p>年龄:
            <jsp:getProperty name="person" property="age"/>
        </p>
    </body>

// 访问 a.jsp, 运行结果:
    姓名:张三
    年龄:25

参考资料:

posted @ 2017-09-26 13:15  小a的软件思考  阅读(274)  评论(0编辑  收藏  举报