zoukankan      html  css  js  c++  java
  • 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 的字符串。

  • 相关阅读:
    vsphere平台windows虚拟机克隆的小插曲(无法登陆系统)
    mysql破解root用户密码总结
    mysql查询缓存参数
    mysql字符乱码
    做为一名dba你应该知道这些数据恢复
    mysql小技巧
    使用explain查看mysql查询执行计划
    mysql语句 索引操作
    mysqlbinglog基于即时点还原
    数据结构和算法(3)-向量,列表与序列
  • 原文地址:https://www.cnblogs.com/lyjs/p/4854725.html
Copyright © 2011-2022 走看看