第5章JSP中使用JavaBean5.1JavaBean的基本概念5.2在JSP中使用JavaBean5.3在JavaBean中连接数据库5.4使用SQLServer数据库的通用方法5.1JavaBean的基本概念在90年代末期,基于组件的软件开发的思想开始得到了普遍的重视和应用。软件组件就是指可以进行独立分离、易于重复使用的软件部分。JavaBean就是一种基于Java平台的软件组件思想。JavaBean也是一种独立于平台和结构的应用程序编程接口(API)。JavaBean保留了其他软件组件的技术精华,并增加了被其他软件组件技术忽略的技术特性,使得它成为完整的软件组件解决方案的基础,并在可移植的Java平台上方便地用于网络世界中。其实你可以把组件理解成为童年时玩的积木,而把用组件搭起来的软件则可以理解成为你用积木搭的形状各异的作品。这种比喻也许可以让你理解为什么用组件搭建应用程序会比其他方法制作应用程序更加稳定和快速。因为软件的组件是可重用的,所以它肯定是经过了很多应用程序的测试,所以当你用它的时候出错的概率肯定比你自己重新写一个同样功能的模块的出错概率小。而用组件搭建应用程序同时也会更快速,这很容易理解,就像你用积木搭一座桥比你自己用木头做一座桥要快一样。JavaBean也是一个很成功的组件模型,JBuilder提供许多方便的控件,而这些控件几乎都是JavaBean。虽然JavaBean和Java之间已经有了明确的界限,但是在某些方面JavaBean和Java之间仍然存在很容易混淆的地方,比如说重用,Java语言也可以为用户创建可重用的对象,但它没有管理这些对象相互作用的规则或标准,用户可以使用在Java中预先建立好的对象,但这必须具有对象在代码层次上的接口的丰富知识。而对于JavaBean,用户可以在应用程序构造器工具中使用各种JavaBean组件,而不需要编写任何代码。这种同时使用多个组件而不考虑其初始化情况的功能是对当前Java模型的重要扩展,所以也可以说JavaBean是在组件技术上对Java语言的扩展。如果真的要明确的定义,那么JavaBean的定义是:JavaBean是可复用的平台独立的软件组件,开发者可以在软件构造器工具中对其直接进行可视化操作。在上面的定义中,软件构造器可以是Web页面构造器、可视化应用程序构造器、GUI设计构造器或服务器应用程序构造器。而JavaBean可以是简单的GUI要素,如按钮和滚动条;也可以是复杂的可视化软件组件,如数据库视图。有些JavaBean是没有GUI表现形式的,但这些JavaBean仍然可以使用应用程序构造器可视化地进行组合,比如JBuilder上的很多控件其实也是没有GUI形式的,但是你仍然可以拖放它们以在你的应用程序里生成相应的代码。一个JavaBean和一个JavaApplet很相似,是一个非常简单的遵循某种严格协议的Java类。JavaBean具有Java语言的所有优点,比如跨平台等等,但它又是Java在组件技术方面的扩展,所以说很多方面它和Applet很像,Applet也具有Java语言的所有优点,同时也是Java在浏览器端程序方面的扩展。其实它们都是严格遵循某种协议的Java类,它们的存在都离不开Java语言的强大支持。从基本上来说,JavaBean可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备。黑盒子只介绍和定义其外部特征和与其他部分的接口,如按钮、窗口、颜色、形状等。作为一个黑盒子的模型,以把JavaBean看成是用于接受事件和处理事件以便进行某个操作的组件建筑块。5.1.1JavaBean的属性JavaBean提供了高层次的属性概念,属性在JavaBean中不只是传统的面向对象的概念里的属性,它同时还得到了属性读取和属性写入的API的支持。属性值可以通过调用适当的bean方法进行。比如,可能bean有一个名字属性,这个属性的值可能需要调用StringgetName()方法读取,而写入属性值可能要需要调用voidsetName(Stringstr)的方法。每个JavaBean属性通常都应该遵循简单的方法命名规则,这样应用程序构造器工具和最终用户才能找到JavaBean提供的属性,然后查询或修改属性值,对bean进行操作。JavaBean还可以对属性值的改变作出及时的反应。比如一个显示当前时间的JavaBean,如果改变时钟的时区属性,则时钟会立即重画,显示当前指定时区的时间。Bean的属性描述其外观或者行为特征,如颜色、大小等。属性可以在运行时通过get/set方法取得和设置。最终用户可以通过特定属性的get/set方法对其进行改变。例如,对于Bean的颜色属性,最终用户可以通过Bean提供的属性对话框改变这个颜色属性。属性可以分为以下四类:Simple简单的Index索引的Bound绑定的Constrained约束的简单属性依赖于标准命名约定来定义getXXX()方法和setXXX()方法。索引属性则允许读取和设置整个数组,也允许使用数组索引单独地读取和设置数组元素。绑定属性则是其值发生变化时要广播给属性变化监听器的属性。约束属性则是那些值发生改变及起作用之前,必须由约束属性变化监听器生效的属性。1.简单属性简单类型属性的设计模板布尔型:设置器:publicvoidset属性名(booleanbl){}获取器:publicbooleanis属性名(){}其它类型的属性的设计模板如下:设置器:publicvoidset属性名(属性类型x){}获取器:public属性类型get属性名(){}数组属性的设计模板单个元素的设计模板:设置器:publicvoidset属性名(inti,属性元素类型x){}获取器:public属性元素类型get属性名(inti){}整个数组的设计模板:设置器:publicvoidset属性名(属性元素类型[]x){}获取器:public属性元素类型[]get属性名(){}对于简单属性,不需要另外的附加类或接口。颜色的改变实际上是通过下面的方法实现的:publicColorgetFillColor();publicvoidSetFillColor(Colorc);这种基本的get/set方法命名规则定义的属性叫做简单属性。简单属性中有一类用boolean值表示的属性叫布尔属性。教材例程5-1,SimpleBean.javapackagecom.jspdev.ch5;publicclassSimpleBean{//type为属性的名字,类型是StringprivateStringtype;//boolean的debug属性privatebooleandebug=false;//getXXX方法,返回这个属性的值publicStringgetType(){returnthis.type;}//setXXX方法,设置这个属性的值。publicvoidsetType(Stringtype){this.type=type;}//对于boolean类型的属性,可以使用isXXX方法来获得属性publicbooleanisDebug(){returnthis.debug;}//设置boolean类型的属性。publicvoidsetDebug(booleandebug){this.debug=debug;}}2.索引属性JavaBeanAPI还支持索引属性,这种属性与传统Java编程中的数组非常类似。索引属性包括几个数据类型相同的元素,这些元素可以通过一个整数索引值来访问,因此称为索引属性。属性可以索引成支持一定范围的值,这种属性属于简单属性。索引用int指定。索引属性有4种访问方式,其数值数组可以一个元素访问,也可以整个数组访问:publicvoidsetLabel(intindex,Stringlabel);publicStringgetLabel(intindex);publicvoidsetLabel(String[]labels);publicString[]getLabels();与标准的Java数组类似索引值可能会在索引属性数组的范围之外。这时,用于操作索引属性的访问者方法一般是抛出一个ArrayIndexOutOfBoundsException运行环境异常,这个异常与标准Java数组索引超出范围时执行的行为相同。教材例程5-2,IndexBean.javapackagecom.jspdev.ch5;publicclassIndexBean{//type为属性的名字,类型是StringprivateString[]type=newString[]{jsp,ejb,servlet,javamail,jca,jdbc};//getXXX方法,返回这个属性的值publicString[]getType(){returnthis.type;}//setXXX方法,设置这个属性的值。publicvoidsetType(String[]type){this.type=type;}//另外的设置属性和获得属性值的方法。publicvoidsetType(intindex,Stringvalue){type[index]=value;}publicStringgetType(intindex){returntype[index];}}3.绑定属性绑定属性是这样的一种属性,它的改变能以事件的形式通知给对它感兴趣的部分,即事件收听者或目标。很明显,这种属性的作用在于它能使收听者接到其改变事件后根据其中的信息产生一些行为,从而达到两者之间的默契。绑定属性的访问者方法遵循与简单属性相同的形式,就是说单从访问者方法是看不出其与简单属性的区别,但它要另外的附加类或接口以及事件的传播机制的支持(后面,我们会看到这同样适用于约束属性)。绑定属性提供一种机制,即通知监听器—个JavaBeans组件的属性发生了改变。监听器实现了PropertyChangeListenor接口并接收由JavaBean组件产生的PropertyChangeEvent对象,PropertyChangeEvent对象对象包括—个届性名字,旧的属性值以及每一个监听器可能要访问的新属性值。JavaBean组件可以使用PropertyChangeSupport象辅助程序类激活监听器要接收的事件。PropertyChangeSupport对象使用一个指向JavaBean组件实例的引用进行构造,并基于以下事实:JavaBean实现了addPropenyChangeListener()和removePropenyChangeListener()方法以便加入和删除属性变化监听器。PropertyChangeSupport,firePropertyChange方法可以被使用,并传递属性名、旧值以及新值等信息。如下例所示。实现一个关联属性涉及到三方,源Bean,目标Bean和协调代码:源Bean源Bean必须提供属性变化事件监听器的注册和解册入口:publicvoidaddpropertyChangeListener(propertyChangeListenerpcListener){}publicvoidremovepropertyChangeListener(propertyChangeListenerpcListener){}如只想通知目标Bean某个特定属性的变化,可用下面特定属性的注册和解册方法:publicvoidadd属性名Listener(propertyChangeListenerpcListener){}publicvoidremove属性名Listener(propertyChangeListenerpcListener){}这样,目标Bean只会接到源Bean此属性的变化的事件通知,减少了不必要的信息通信。另外,为了实现关联属性的方便,系统提供了一个帮助者类propertyChange