JavaBean定义、JSP中应用以及内省操纵

    添加时间:2013-7-30 点击量:

    ????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(35);??
    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.time111);??
    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());??


    ?


    ?


    ?

    我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
    分享到: