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问采取反射如何获得它的值呢?
- /?
- ?实体内部类?
- /??
- class?ReflectionPoint{??
- ????private?int?x;??
- ????pirvate?int?y;??
- ????public?ReflectionPoint(int?x,int?y){??
- ????????this.x?=?x;??
- ????????this.y?=?y;??
- ????}??
- ????public?void?setX(int?x){??
- ????????this.x?=?x;??
- ????}??
- ????public?int?getX(){??
- ????????return?x;??
- ????}??
- ????public?void?setY(int?y){??
- ????????this.y?=?y;??
- ????}??
- ????public?int?getY(){??
- ????????return?y;??
- }??
- /?
- ?main办法?
- /??
- public?static?void?main(String[]?args)?throws?Exception{??
- ????ReflectionPoint?rp?=?new?ReflectionPoint(3,5);??
- ????String?propertyName?=?x;??
- ????//哄骗反射,那我们会解析一步一步获得其属性的get办法:?x?-->X?--->getX?--->MethodGetX--操纵??
- ????//可想而知如许有点太麻烦了。我们并无法断定每个属性名称定名规范,所以导致我们获取办法时会有必然艰苦??
- ????//不过JavaBean类中给我们供给了一些简便的类PropertyDescriptor??
- ????//专门用于操纵JavaBean对象的类PropertyDescriptor??
- ????PropertyDescriptor?pd?=?new?PropertyDescriptor(propertyName,?rp.getClass());//创建一个针对该JavaBean类和属性名的属性描述对象??
- ????//getReadMethod()就相当于获得get办法,而getWriteMethod()就相当于是属性的set办法了。??
- ????Method?MethodGetX?=?pd.getReadMethod();??
- ????//获得某个对象上的某个属性值??
- ????Object?retValue?=?MethodGetX.invoke(rp);??
- ????//System.out.println(retValue);??
- ??????
? - ????Method?MethodSetY?=?pd.getWriteMethod();??
- ????//设置某个对象上的某个属性值是7??
- ????MethodSetY.invoke(rp,?7);??
- ????System.out.println(rp.getX());??
- ??????
? - }??
?
4.2 对Javabean的错杂内省操纵
当然也可应用Introspector类来完成这个功能,经由过程调用Introspector类的静态办法getBeanInfo获得一个BeanInfo类的对象,这个类可以把一个通俗的类当成Javabean来对待
,经由过程这个对象来获得所有属性的获得所有属性的描述的凑集,然后采取遍历的体式格式一一进行查找该属性,经由过程反射获得该办法,具体代码如下:?
Java代码??
- BeanInfo?bi?=?Introspector.getBeanInfo(rp.getClass());??
- ????????PropertyDescriptor[]?pds?=?bi.getPropertyDescriptors();??
- ????????Object?retValue?=?null;??
- ??????????
? - ????????for(PropertyDescriptor?pd2?:?pds)?{??
- ????????????if(pd2.getName().equals(propertyName))?{??
- ????????????????Method?MethodGetX?=?pd2.getReadMethod();??
- ????????????????retValue?=?MethodGetX.invoke(rp);??
- ????????????????break;??
- ????????????}??
- ??????????????
? - ????????}??
?
应用BeanUtils对象包操纵Javabean对象:?
Java代码??
- /?
- ??????????哄骗BeanUtils对象类来调用属性?
- ?????????/??
- ????????System.out.println(BeanUtils.getProperty(stu,?propertyName));??
- ????????System.out.println(BeanUtils.getProperty(stu,?propertyName).getClass().getName());??
- ????????BeanUtils.setProperty(stu,?name,?前三);??
- ????????System.out.println(BeanUtils.getProperty(stu,?propertyName));??
- ??????????
? - ????????//设置一个对象的属性??
- ????????BeanUtils.setProperty(stu,birthday.time,111);??
- ????????System.out.println(BeanUtils.getProperty(stu,?birthday.time));??
- ????????System.out.println(retVal);??
- ??????????
? - ????????///Jdk1.7新特点,设置map对象?
- ????????Map?map?=?{name:zhansan,age:12};?
- ????????BeanUtils.setProperty(map,?name,?zhans);/??
- ??????????
? - ????????//另一种设置属性的体式格式??
- ??????????
? - ????????PropertyUtils.setProperty(stu,?propertyAge,?5);??
- ??????????
? - ????????System.out.println(PropertyUtils.getProperty(stu,?propertyAge).getClass().getName());??
?
?
?
我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
????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的存活局限。
- id? 是在所定义的局限中确认Bean的变量,使之能在后面的法度中应用此变量名来辨别不合的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参数 。
- name=beanName??? 默示已经在<jsp:useBean>中创建的Bean实例的名字(id)。
- 若是要将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的属性名。
- name=beanInstanceName?? bean的名字,由<jsp:useBean>中的id指定。?
????3.4 bean的存活局限:
????????scope属性决意了JavaBean对象存在的局限 。
????????scope的可选值包含:
- page(默认值):客户每次恳求接见JSP页面时,都邑创建一个JavaBean对象。JavaBean对象的有效局限是客户恳求接见的当前JSP网页。 JavaBean对象在以下两种景象下都邑停止生命期:
- 客户恳求接见的当前JSP网页经由过程<forward> 标识表记标帜将恳求转发到另一个文件
- 客户恳求接见的当前JSP页面履行完毕并向客户端发还响应。
- 客户恳求接见的当前JSP网页经由过程<forward> 标识表记标帜将恳求转发到另一个文件
- request:客户每次恳求接见JSP页面时,都邑创建新的 JavaBean对象。
- JavaBean对象的有效局限为:
- 客户恳求接见的当前JSP网页
- 和当前JSP网页共享同一个客户恳求的网页,即当前JSP网页中<%@ include>指令以及<forward>标识表记标帜包含的其他JSP文件
- 当所有共享同一个客户恳求的JSP页面履行完毕并向客户端发还响应时,JavaBean对象停止生命周期
- 客户恳求接见的当前JSP网页
- 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);
- 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对象作为属性保存在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问采取反射如何获得它的值呢?
- /?
- ?实体内部类?
- /??
- class?ReflectionPoint{??
- ????private?int?x;??
- ????pirvate?int?y;??
- ????public?ReflectionPoint(int?x,int?y){??
- ????????this.x?=?x;??
- ????????this.y?=?y;??
- ????}??
- ????public?void?setX(int?x){??
- ????????this.x?=?x;??
- ????}??
- ????public?int?getX(){??
- ????????return?x;??
- ????}??
- ????public?void?setY(int?y){??
- ????????this.y?=?y;??
- ????}??
- ????public?int?getY(){??
- ????????return?y;??
- }??
- /?
- ?main办法?
- /??
- public?static?void?main(String[]?args)?throws?Exception{??
- ????ReflectionPoint?rp?=?new?ReflectionPoint(3,5);??
- ????String?propertyName?=?x;??
- ????//哄骗反射,那我们会解析一步一步获得其属性的get办法:?x?-->X?--->getX?--->MethodGetX--操纵??
- ????//可想而知如许有点太麻烦了。我们并无法断定每个属性名称定名规范,所以导致我们获取办法时会有必然艰苦??
- ????//不过JavaBean类中给我们供给了一些简便的类PropertyDescriptor??
- ????//专门用于操纵JavaBean对象的类PropertyDescriptor??
- ????PropertyDescriptor?pd?=?new?PropertyDescriptor(propertyName,?rp.getClass());//创建一个针对该JavaBean类和属性名的属性描述对象??
- ????//getReadMethod()就相当于获得get办法,而getWriteMethod()就相当于是属性的set办法了。??
- ????Method?MethodGetX?=?pd.getReadMethod();??
- ????//获得某个对象上的某个属性值??
- ????Object?retValue?=?MethodGetX.invoke(rp);??
- ????//System.out.println(retValue);??
- ??????
? - ????Method?MethodSetY?=?pd.getWriteMethod();??
- ????//设置某个对象上的某个属性值是7??
- ????MethodSetY.invoke(rp,?7);??
- ????System.out.println(rp.getX());??
- ??????
? - }??
?
4.2 对Javabean的错杂内省操纵
当然也可应用Introspector类来完成这个功能,经由过程调用Introspector类的静态办法getBeanInfo获得一个BeanInfo类的对象,这个类可以把一个通俗的类当成Javabean来对待
,经由过程这个对象来获得所有属性的获得所有属性的描述的凑集,然后采取遍历的体式格式一一进行查找该属性,经由过程反射获得该办法,具体代码如下:?
Java代码??
- BeanInfo?bi?=?Introspector.getBeanInfo(rp.getClass());??
- ????????PropertyDescriptor[]?pds?=?bi.getPropertyDescriptors();??
- ????????Object?retValue?=?null;??
- ??????????
? - ????????for(PropertyDescriptor?pd2?:?pds)?{??
- ????????????if(pd2.getName().equals(propertyName))?{??
- ????????????????Method?MethodGetX?=?pd2.getReadMethod();??
- ????????????????retValue?=?MethodGetX.invoke(rp);??
- ????????????????break;??
- ????????????}??
- ??????????????
? - ????????}??
?
应用BeanUtils对象包操纵Javabean对象:?
Java代码??
- /?
- ??????????哄骗BeanUtils对象类来调用属性?
- ?????????/??
- ????????System.out.println(BeanUtils.getProperty(stu,?propertyName));??
- ????????System.out.println(BeanUtils.getProperty(stu,?propertyName).getClass().getName());??
- ????????BeanUtils.setProperty(stu,?name,?前三);??
- ????????System.out.println(BeanUtils.getProperty(stu,?propertyName));??
- ??????????
? - ????????//设置一个对象的属性??
- ????????BeanUtils.setProperty(stu,birthday.time,111);??
- ????????System.out.println(BeanUtils.getProperty(stu,?birthday.time));??
- ????????System.out.println(retVal);??
- ??????????
? - ????????///Jdk1.7新特点,设置map对象?
- ????????Map?map?=?{name:zhansan,age:12};?
- ????????BeanUtils.setProperty(map,?name,?zhans);/??
- ??????????
? - ????????//另一种设置属性的体式格式??
- ??????????
? - ????????PropertyUtils.setProperty(stu,?propertyAge,?5);??
- ??????????
? - ????????System.out.println(PropertyUtils.getProperty(stu,?propertyAge).getClass().getName());??
?
?
?