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 的字符串。

  • 相关阅读:
    Leetcode 16.25 LRU缓存 哈希表与双向链表的组合
    Leetcode437 路径总和 III 双递归与前缀和
    leetcode 0404 二叉树检查平衡性 DFS
    Leetcode 1219 黄金矿工 暴力回溯
    Leetcode1218 最长定差子序列 哈希表优化DP
    Leetcode 91 解码方法
    Leetcode 129 求根到叶子节点数字之和 DFS优化
    Leetcode 125 验证回文串 双指针
    Docker安装Mysql记录
    vmware虚拟机---Liunx配置静态IP
  • 原文地址:https://www.cnblogs.com/lyjs/p/4854725.html
Copyright © 2011-2022 走看看