JavaBean

一、初识JavaBean

什么叫做JavaBean呢?

JavaBean是一种特殊的Java类,主要用于传递数据信息,这种Java类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。特殊之处在

  • 1、所有属性为private
  • 2、提供默认构造方法
  • 3、提供getter和setter
  • 4、实现serializable接口。

如下边的Students就是一个JavaBean类:

 

public class Students {
    private String name;
    private String sex;
    private double grades;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public double getGrades() {
        return grades;
    }
    public void setGrades(double grades) {
        this.grades = grades;
    }
    
}

 

一个类被当作javaBean使用时,JavaBean的属性是根据方法名推断出来的,它根本看不到java类内部的成员变量。

  1. setName的属性是name。
  2. setSex的属性是sex
  3. setGrades的属性是grades
  4. getClass的属性是class。

所有的类都继承与Object,Object类中有getClass方法,所有上面也有一个class属性。

 二、内省操作JavaBean的属性

什么事内省?

          内省是Java语言对Bean类属性、事件的一种缺省处理方法。例如:Students类中有属性name,那我们可以通过getName,setName来得到其值或者设置新的值。通过getName/setName来访问name属性,这就是默认的规则。Java中提供了 一套API用来访问某个属性的getter/setter方法,通过这些API可以使你不需要了解这个规则,这些API存放于包java.beans中。一般的做法是通过类Introspector来获取某个对象的BeanInfo信息,然后通过BeanInfo来获取属性的描述器 (PropertyDescriptor),通过这个属性描述器就可以获取某个属性对应的getter/setter方法,然后我们就可以通过反射机制来 调用这些方法。

PartI、某个对象的所有属性名称都打印出来

    /*某个对象的所有属性名称都打印出来
     * 
     * 1、连同父类的属性值也打印出来。(就像Students类,打印四个属性grades、name、sex、class,包括一个Object的一个class属性)
     * 
     * public static BeanInfo getBeanInfo(Class<?> beanClass) throws IntrospectionException
     * 
     * 2、只打印该类的属性,父类的属性不打印 (就像Students类,只打印三个属性grades、name、sex
     * 
     * public static BeanInfo getBeanInfo(Class<?> beanClass,Class<?> stopClass throws IntrospectionException
     * */
    public static void test1() throws IntrospectionException{
        BeanInfo info=    Introspector.getBeanInfo(Students.class,Object.class);
        PropertyDescriptor[] pds=info.getPropertyDescriptors();
        for(PropertyDescriptor pd:pds){
            System.out.println(pd.getName());
        }
    }

PartII、操作对象的某个属性:

/*
     * 1、通过PropertyDescriptor来获得一个属性的 PropertyDescriptor
     *  PropertyDescriptor(String propertyName, Class<?> beanClass) 
     *  
     *  2、通过PropertyDescriptor对象的方法
     *  getPropertyType()  获得属性的 Class 对象
     *  getReadMethod()  获得应该用于读取属性值的方法。
     *  getWriteMethod()  获得应该用于写入属性值的方法。
     */
    public static void test2() throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
        Students p=new Students();
        PropertyDescriptor pd=new PropertyDescriptor("grades",Students.class);
        System.out.println(pd.getPropertyType());
        Method method=pd.getWriteMethod();
        method.invoke(p, 60);
        System.out.println(p.getGrades());
        method=pd.getReadMethod();
        System.out.println(method.invoke(p, null));
    }

 三、使用BeanUtils工具包来操作JavaBean类。

如需下载JavaBean包,请加qq群: 45775655。

    public static  void test1() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
        /*
         * 使用BeanUtils的setProperty方法为对象的grade属性设置值   
         * 使用BeanUtils的getProperty方法为对象的grade属性设置值   
         */
            Students s=new Students();
            BeanUtils.setProperty(s, "grades", 97);
            Object grades=BeanUtils.getProperty(s, "grades");
            System.out.println(grades);
            
        }
    

Converter只支持一些基本的类型,甚至连java.util.Date类型也不支持。当我们操作Date类型时候,就需要使用ConvertUtils来实现类型转换。

ConvertUtils.register(new DateLocaleConverter(), Date.class);

也可以自己实现类型转换的方法,如下:

    public static  void test1() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException{
        /*
         * 自己实现DateConverter() 方法。
         * */
        ConvertUtils.register(new  DateConverter(),Date.class);
        
            Students s=new Students();
            BeanUtils.setProperty(s, "birthday", "1992-08-08");
            System.out.println(s.getBirthday().toLocaleString());
            System.out.println();
        }


class DateConverter implements Converter {        
    private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
    /** 
     *  要将字符串的value转换为java.util.Date类型的值 
     *  targetClass 第一个参数 是你的目标类型 
     *   value   要转换的值, 
     *   Object   把要转回的值,返回出去就ok了 
     */  
    public Object convert(Class targetClass, Object value) {  
        if (targetClass != Date.class) {  
            return null;  
        }  
        try {  
            if (value instanceof String) {  
                String v = (String) value;  
                return format.parse(v);  
            }  
        } catch (ParseException e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  

 四、JSP操作javaBean

在JSP中,我们可通过JSP中的<jsp:useBean>、<jsp:setProperty>及<jsp:getProperty>这三个标准操作元素来使用JavaBean。这三个标准元素分别是用来使用JavaBean、设置以及取得JavaBean的属性。

1、<jsp:useBean>标签

该标签用于在某个指定的域范围(application、session、request、pageContext等)中查找一个指定名称的 JavaBean对象,如果存在则直接返回该JavaBean对象的引用。如果不存在则实例化一个新的JavaBean对象,并将它按指定的名称存储在指 定的域范围中。常见语法如下:

<jsp:useBean id="beanInstanceName" class="package.class" scope="page|request|session|application" />
  1. class属性用于指定JavaBean的完整类名,JSP引擎将使用这个类名来创建JavaBean的实例对象或作为查找到JavaBean对象的类 型;
  2. id属性用于指定JavaBean实例对象的引用名称和其存储在域范围的名称;
  3. scope属性用于指定JavaBean实例对象所存储的域范围,其默 认值是page。

<jsp:useBean>标签除了可以按照空元素的方式进行使用外,还可以按容器元素的格式进行使用,如:

<jsp:useBean...>
    Body
</jsp:useBean...>

Body部分只在标签创建JavaBean的实例对象时才执行,也就是说,如果scope属性指定的域范围存在id属性指定的JavaBean对象,那Body内容将被忽略。

 

2、<jsp:setProperty>标签

该标签用于设置JavaBean对象的属性,也就是调用JavaBean对象的setter方法,其语法如下:

 

<jsp:setProperty name="beanInstanceName" property="propertyName" 
    [ value="{string | <%= expression %>}" | param="parameterName" ] | 
    property="*"    
/>

 

  • name属性是必不可少的,用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性相同。

  • property属性是必不可少的,用于指定JavaBean实例对象的属性名。

  • value属性是可选的,它用于指定JavaBean实例对象的某个属性的值,value属性的设置值可以是一个字符串,也可以是一个表达式。如果是value属性的设置值是字符串,那么它将自动转换成所要设置的JavaBean属性的类型;如果是表达式,则表达式的结果类型与所要设置的JavaBean属性的类型一致(不一致则报错)。

  • param属性是可选的,它用于将请求参数的值赋给JavaBean实例对象的某个属性。如果当前请求消息中没有param属性所指定的请求参数,该标签不会将null赋给JavaBean属性,所设置的JavaBean属性仍将等于其原来的初始值,value和param属性不能同时使用。

  • property="*",这种形式用于对JavaBean实例对象多个属性进行赋值,它表示将请求消息中的参数逐一与JavaBean实例对象中的属性进行比较,如果找到同名的属性,则将该参数赋给该属性,不存在则不会被赋值。

注意:如果param属性和value属性都没有设置,且property="prppertyName",它等效于param属性的设置值与property属性值相同的情况

 

3、<jsp:getProperty>标签

该标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中,其使用语法如下:

 

<jsp:getProperty name="beanInstanceName" property="PropertyName" />

 

其中,name属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同,property属 性用于指定JavaBean实例对象的属性名,如果一个JavaBean实例对象的某个属性的值为null,则该标签输出该属性的结果将是内容为null 的字符串。

 

posted @ 2015-10-04 19:00  好人难寻  阅读(1078)  评论(0编辑  收藏  举报