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




