JavaBean

JavaBean是一种JAVA语言写成的可重用组件,对数据和功能进行封装,做到“一次编写,到处运行”。

一、JavaBean的规范:

1、必须要有默认构造器(即无参构造方法)。

2、提供get/set方法,如果只有get方法,那这个属性是只读属性。

3、属性:有get/set方法的成员,还可以没有成员,只有get/set方法,属性名get/set方法来决定,而不是成员名称。

4、方法名称满足一定的规范,那么它就是属性。boolean类型的属性,它的读方法可以是is开头,也可以是get开头。

示例:

1 public class Book {
2     private double price;
3 
4     public double getPrice() { return price; }
5 
6     public void setPrice(double price) { this.price = price; }
7 }

 二、内省

为了更好的操作JavaBean的属性,JDK中提供了一套API用来访问某个属性的getter和setter方法,这就是内省(Introspector)。

通过内省操作JavaBean图示

    内省类-->Bean信息-->属性描述符-->属性的get/set对应的Method-->反射

示例:

JavaBean类

 1 public class Person {
 2     private String name;
 3     private int age;
 4 
 5     public String getName() { return name; }
 6     public void setName(String name) { this.name = name; }
 7     public int getAge() { return age; }
 8     public void setAge(int age) { this.age = age; }
 9 
10     @Override
11     public String toString() {
12         return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
13     }
14 }

内省类:

 1 import org.junit.Test;
 2 
 3 import java.beans.PropertyDescriptor;
 4 import java.lang.reflect.Method;
 5 
 6 public class IntrospectorDemo {
 7     @Test
 8     //修改JavaBean的属性
 9     public void fun1() throws Exception {
10         //创建Person对象
11         Person p = new Person ();
12         //使用属性描述器获取Person类name属性的描述信息
13         PropertyDescriptor pd = new PropertyDescriptor ("name",p.getClass ());
14         //获取name属性对应的setter方法
15         Method method = pd.getWriteMethod ();
16         //调用setter方法,并设置(修改)name属性值
17         method.invoke (p,"张三");
18         //String类型的数据,表示年龄
19         String val= "20";
20         //使用属性描述其获取Person类age属性的描述信息
21         pd = new PropertyDescriptor ("age",p.getClass ());
22         //获取age属性对应的setter方法
23         Method methodAge = pd.getWriteMethod ();
24         //获取属性的Java数据类型
25         Class clazz = pd.getPropertyType ();
26         //根据类型来判断需要为setter方法传入什么类型的实参
27         if (clazz.equals (int.class)) {
28             //调用setter方法,并设置(修改)age属性值
29             methodAge.invoke (p,Integer.valueOf (val));
30         }else {
31             methodAge.invoke (p,val);
32         }
33         System.out.println (p);
34     }
35     @Test
36     //读取JavaBean的属性
37     public void fun2() throws Exception{
38         //创建Person对象
39         Person p = new Person ();
40         p.setName ("李四");
41         p.setAge (25);
42         //使用属性描述器获取Person类name属性的描述信息
43         PropertyDescriptor pd = new PropertyDescriptor ("name",p.getClass ());
44         //获取name属性对应的getter方法
45         Method method = pd.getReadMethod ();
46         //调用getter方法,并获取name属性值
47         Object o = method.invoke (p);
48         System.out.println ("姓名:"+ o);
49     }
50 }

三、BeanUtils工具

由Apache提供,主要包有commons-beanutils,它是依赖内省完成,依赖包有commons-logging.jar

常用方法:

  • BeanUtile.getProperty(Object bean,String propertyName);
  • BeanUtile.setProperty(Object bean,String propertyName,String propertyValue);
  • BeanUtile.populate(Map map,Object bean);

二示例中内省类可简化为以下代码:

 1 public class BeanUtilsDemo1 {
 2     @Test
 3     public void fun1() throws Exception{
 4         Person p = new Person ();
 5         //使用BeanUtils为属性赋值
 6         BeanUtils.setProperty (p,"name","Jack");
 7         BeanUtils.setProperty (p,"age","20");
 8         //使用BeanUtils获取属性值
 9         String name = BeanUtils.getProperty (p,"name");
10         String age = BeanUtils.getProperty (p,"age");
11         System.out.println (name+"  "+age);
12     }
13 }

JavaBean封装工具类

 1 package commonuntils;
 2 
 3 import org.apache.commons.beanutils.BeanUtils;
 4 import java.util.Map;
 5 import java.util.UUID;
 6 
 7 public class CommonUtils {
 8     /**
 9      * 生成不重复的32位长的大写字符串
10      * @return
11      */
12     public static String uuid() {
13         return UUID.randomUUID().toString().replace("-","");
14     }
15     /**
16      *  把map转换成指定类型的JavaBean对象
17      *  @param map
18      *  @param clazz
19      *  @return
20      */
21     public static <T> T toBean(Map map,Class<T> clazz) {
22         try {
23             /**
24              * 1、创建指定类型的JavaBean对象
25              */
26             T bean = clazz.newInstance();
27             /**
28              * 2、把数据封装到JavaBean中
29              */
30             BeanUtils.populate(bean,map);
31             /**
32              * 返回JavaBean对象
33              */
34             return bean;
35         } catch (Exception e) {
36             throw new RuntimeException(e);
37         }
38     }
39 }

三、jsp中与JavaBean相关的标签

  • <jsp:useBean> -->创建或查询bean
    • <jsp:useBean id="user1" class="domain.User" scope="session"/>在session域中查找名为user1的bean,如果不存在,创建之
    • <jsp:useBean id="user1" class="domain.User" scope="session"/>
  • <jsp:setProperty>
    • <jsp:setProperty property="username" name="user1" value="admin"/>设置名为user1的这个JavaBean的username属性值为admin
  • <jsp:getProperty>
    • <jsp:getProperty property="username" name="user1" />获取名为user1的JavaBean的名为username属性值

 

posted @ 2017-10-06 13:44  gdwkong  阅读(389)  评论(0编辑  收藏  举报