zoukankan      html  css  js  c++  java
  • JavaBean定义、JSP中使用以及内省操作

        Apache commons 一系列的开源工具室非常值得学习的实现。

    一 JavaBean定义    

    JavaBean是一种可重复使用、且跨平台的软件组件。JavaBean可分为两种:一种是有用户界面(UI,User Interface)的 JavaBean;还有一种是没有用户界面,主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。

    二 JavaBean特点

    一个标准的JavaBean有以下几个特性:

    •  JavaBean是一个公共的(public)类
    • JavaBean有一个不带参数的构造方法
    • JavaBean通过setXXX方法设置属性,通过 getXXX方法获取属性

    三 JSP中访问JavaBean    

     

    3.1 导入JavaBean类

    • 通过<%@ page import> 指令导入JavaBean类,例如: <%@ page import="mypack.CounterBean" %>

        3.2 声明JavaBean的对象

    • 声明JavaBean 对象使用<jsp:useBean>标签,例如: <jsp:useBean id="myBean"  class="mypack.CounterBean" scope="session" />
    • <jsp:useBean>标签中各属性含义:
      • id  是在所定义的范围中确认Bean的变量,使之能在后面的程序中使用此变量名来分辨不同的Bean,这个变量名对大小写敏感,必须符合所使用的脚本语言的规定。
      • class  指定bean由哪个类创建。
      • scope  指定bean的存活范围。

        3.3 访问JavaBean属性

    • 如果要给JavaBean 的某个属性赋值,可以用 <jsp:setProperty>标签,例如:<jsp:setProperty name="myBean" property="count" value="0" />     将id为myBean(name的值)的Bean的count的值设置为"0"(value的值)。
      • JSP 语法格式: <jsp:setProperty name="beanInstanceName" {property= "*" | property="propertyName" [ param="parameterName" ] | property="propertyName" value="{string | <%= expression %>}"}  />   
        • name="beanName"    表示已经在"<jsp:useBean>"中创建的Bean实例的名字(id)。
        • property="*"      储存用户在jsp输入的所有值,用于匹配Bean中的属性(这时jsp中的参数名必须与bean中的属性名一致)。
        • property="propertyName" [ param="parameterName" ]      用一个参数值来指定Bean中的一个属性值, 一般情况下是从request对象中获得的。其中property指定Bean的属性名,param指定 request中的参数名。
        • property="propertyName" value="{string | <%= expression %>}"      使用指定的值来设定Bean属性。这个值可以是字符串,也可以是表达式。如果是字符串,那么它就会被转换成Bean属性的类型。如果是一个表达式,那么它的类型就必须和将要设定的属性值的类型一致。不能在同一个<jsp:setProperty>中同时使用 param和value参数 。
    • 如果要将JavaBean的某个属性输出到网页上,可以用 <jsp:getProperty>标签,例如:<jsp:getProperty name="myBean" property="count" />      获得id为myBean(name的值)的bean的count属性的值。
      • JSP 语法格式: <jsp:getProperty name="beanInstanceName" property="propertyName" />  
        • name="beanInstanceName"   bean的名字,由<jsp:useBean>中的id指定。 
        • property="propertyName"   所指定的Bean的属性名。

        3.4 bean的存活范围:

            scope属性决定了JavaBean对象存在的范围 。

            scope的可选值包括:

    • page(默认值):客户每次请求访问JSP页面时,都会创建一个JavaBean对象。JavaBean对象的有效范围是客户请求访问的当前JSP网页。 JavaBean对象在以下两种情况下都会结束生命期:
      • 客户请求访问的当前JSP网页通过<forward> 标记将请求转发到另一个文件
      • 客户请求访问的当前JSP页面执行完毕并向客户端发回响应。
    • request:客户每次请求访问JSP页面时,都会创建新的 JavaBean对象。
      • JavaBean对象的有效范围为:
        • 客户请求访问的当前JSP网页
        • 和当前JSP网页共享同一个客户请求的网页,即当前JSP网页中<%@ include>指令以及<forward>标记包含的其他JSP文件
        • 当所有共享同一个客户请求的JSP页面执行完毕并向客户端发回响应时,JavaBean对象结束生命周期
      • JavaBean对象作为属性保存在HttpRequest 对象中,属性名为JavaBean的id,属性值为JavaBean对象,因此也可以通过HttpRequest.getAttribute()方法取得JavaBean对象,例如:CounterBean obj=(CounterBean)request.getAttribute("myBean");
    • session:JavaBean对象被创建后,它存在于整个Session的生存周期内,同一个Session中的JSP文件共享这个JavaBean对象。
      • JavaBean对象作为属性保存在HttpSession 对象中,属性名为JavaBean的id,属性值为 JavaBean对象。除了可以通过JavaBean的 id直接引用JavaBean对象外,也可以通过 HttpSession.getAttribute() 方法取得 JavaBean对象,例如:CounterBean obj=(CounterBean)session.getAttribute("myBean");
    • application:JavaBean对象被创建后,它存在于整个 Web应用的生命周期内,Web应用中的所有 JSP文件都能共享同一个JavaBean对象。
      • JavaBean对象作为属性保存在application对 象中,属性名为JavaBean的id,属性值为JavaBean对象,除了可以通过JavaBean的id直接引用JavaBean对象外,也可以通过application.getAttribute()方法取得JavaBean对象,例如:CounterBean obj=(CounterBean)application.getAttribute("myBean");

     

    四 Javabean的内省操作

        

        在java的反射中,所有的类被抽象出一个类,即Class类,这样我们就可以在程序运行的过程中通过配置文件,动态的加载类。但是在用反射的时候有些前提,就是:当我们调用有参的constructor的时候必须先知道构造函数传入的参数是什么类型;调用Method的时候必须先知道成员函数传入的参数是什么类型;调用field的时候必须先知道成员变量的类型。但是在某些情况下,一个类中的成员属性的名字对外是不可见的,这时候我们只可以得出他的成员类型的数组field[],在不知道确切变量名的情况下不可以定位到确切的变量上。而他提供了对这个属性公开的读(get)、写(set)方法, 虽然方法名和方法操作的对象有时候有很大的关系,但是我们不能保证这个关系一定成立。而且这种只提供get、set方法,不提供变量名的情况还很常见,因此java就将这种抽象为javabean类,对javabean类的操作,通过get、set函数后面的名字就"拟"得出变量的名字。通过这个名字,我们可以确切的求出某个变量的值。而对javabean的操作是通过内省(introspector)来完成的。

     

        4.1 对Javabean的简单的内省操作

            问题 已知一个ReflectionPoint对象中有个私有变量的名字叫做'x'问采用反射如何得到它的值呢?

    1. /** 
    2. 实体内部类 
    3. */  
    4. class ReflectionPoint{  
    5.     private int x;  
    6.     pirvate int y;  
    7.     public ReflectionPoint(int x,int y){  
    8.         this.x = x;  
    9.         this.y = y;  
    10.     }  
    11.     public void setX(int x){  
    12.         this.x = x;  
    13.     }  
    14.     public int getX(){  
    15.         return x;  
    16.     }  
    17.     public void setY(int y){  
    18.         this.y = y;  
    19.     }  
    20.     public int getY(){  
    21.         return y;  
    22. }  
    23. /** 
    24. * main方法 
    25. */  
    26. public static void main(String[] args) throws Exception{  
    27.     ReflectionPoint rp = new ReflectionPoint(3,5);  
    28.     String propertyName = "x";  
    29.     //利用反射,那我们会分析一步一步得到其属性的get方法: x -->X --->getX --->MethodGetX--操作  
    30.     //可想而知这样有点太麻烦了。我们并无法确定每个属性名称命名规范,所以导致我们获取方法时会有一定困难  
    31.     //不过JavaBean类中给我们提供了一些简便的类PropertyDescriptor  
    32.     //专门用于操作JavaBean对象的类PropertyDescriptor  
    33.     PropertyDescriptor pd = new PropertyDescriptor(propertyName, rp.getClass());//创建一个针对该JavaBean类和属性名的属性描述对象  
    34.     //getReadMethod()就相当于得到get方法,而getWriteMethod()就相当于是属性的set方法了。  
    35.     Method MethodGetX = pd.getReadMethod();  
    36.     //得到某个对象上的某个属性值  
    37.     Object retValue = MethodGetX.invoke(rp);  
    38.     //System.out.println(retValue);  
    39.         
    40.     Method MethodSetY = pd.getWriteMethod();  
    41.     //设置某个对象上的某个属性值是7  
    42.     MethodSetY.invoke(rp, 7);  
    43.     System.out.println(rp.getX());  
    44.         
    45. }  

     

    4.2 对Javabean的复杂内省操作

    当然也可使用Introspector类来完成这个功能,通过调用Introspector类的静态方法getBeanInfo得到一个BeanInfo类的对象,这个类可以把一个普通的类当成Javabean来看待 ,通过这个对象来得到所有属性的得到所有属性的描述的集合,然后采用遍历的方式逐一进行查找该属性,通过反射得到该方法,具体代码如下: 

    Java代码  

    1. BeanInfo bi = Introspector.getBeanInfo(rp.getClass());  
    2.         PropertyDescriptor[] pds = bi.getPropertyDescriptors();  
    3.         Object retValue = null;  
    4.             
    5.         for(PropertyDescriptor pd2 : pds) {  
    6.             if(pd2.getName().equals(propertyName)) {  
    7.                 Method MethodGetX = pd2.getReadMethod();  
    8.                 retValue = MethodGetX.invoke(rp);  
    9.                 break;  
    10.             }  
    11.                 
    12.         }  

     

    使用BeanUtils工具包操作Javabean对象: 

    Java代码  

    1. /** 
    2.          * 利用BeanUtils工具类来调用属性 
    3.          */  
    4.         System.out.println(BeanUtils.getProperty(stu, propertyName));  
    5.         System.out.println(BeanUtils.getProperty(stu, propertyName).getClass().getName());  
    6.         BeanUtils.setProperty(stu, "name""前三");  
    7.         System.out.println(BeanUtils.getProperty(stu, propertyName));  
    8.             
    9.         //设置一个对象的属性  
    10.         BeanUtils.setProperty(stu,"birthday.time","111");  
    11.         System.out.println(BeanUtils.getProperty(stu, "birthday.time"));  
    12.         System.out.println(retVal);  
    13.             
    14.         /*//Jdk1.7新特性,设置map对象 
    15.         Map map = {name:"zhansan",age:12}; 
    16.         BeanUtils.setProperty(map, name, "zhans");*/  
    17.             
    18.         //另一种设置属性的方式  
    19.             
    20.         PropertyUtils.setProperty(stu, propertyAge, 5);  
    21.             
    22.         System.out.println(PropertyUtils.getProperty(stu, propertyAge).getClass().getName());  

     

     

     

  • 相关阅读:
    Serialize and Deserialize Binary Tree
    sliding window substring problem汇总贴
    10. Regular Expression Matching
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接
    程序员如何写一份合格的简历?(附简历模版)
    9个提高代码运行效率的小技巧你知道几个?
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第六章 存储器层次结构
    24张图7000字详解计算机中的高速缓存
    《深入理解计算机系统》(CSAPP)实验四 —— Attack Lab
    《深入理解计算机系统》(CSAPP)读书笔记 —— 第五章 优化程序性能
  • 原文地址:https://www.cnblogs.com/allenzhaox/p/3223946.html
Copyright © 2011-2022 走看看