第6章JavaBean组件程序设计内容提要简要介绍组件的基本概念JavaBean的编写以及调用方法JavaBean的属性本章主要介绍组件开发技术组件技术概述现在软件开发都已经转向了基于组件的开发,目前具备代表性的组件技术:微软的COM、COM+Sun的JavaBean和EJB(EnterpriseJavaBean)CORBA(CommonObjectRequestBrokerArchitecture,公共对象请求代理结构)本节主要介绍:组件和容器Bean开发工具JavaBean简介组件和容器容器是包含其它组件的组件。它们被用作组件的框架。例如,可视化的开发工具使你能拖放组件到容器中,这些容器能调整大小和位置。软件组件模型描述了如何开发和使用组件。软件组件模型包括以下元素:创造和使用组件的规范;软件实现规范,为建造和使用组件提供一种具体的机制。JavaBean规范将“软件组件”的概念引入到Java编程的领域。组件是自包含的、可重用的软件单元;JavaBean规范为Java开发人员提供了一种“组件化”其Java类的方法。Bean开发工具JavaSoft,开发Java系列开发工具的公司,开发了BDK(Bean开发工具)。BDK可供开发者自由地使用,适用于Windows2000、XP、2003、以及Solaris2.4和2.5。其它用于Bean开发的各种工具,常用的有7个。SunMicroSystems公司的JavaPlan;SunMicroSystems公司的JavaStudio;SunMicroSystems公司的JavaWorkshop;IBM的VisualAgeforJava;Symantec的VisualCaféforJava;微软公司的VisualJ++;Boland公司的Jbuilder。JavaBean简介JavaBean是一种软件组件模型。它与其它软件对象相互作用,决定如何建立和重用软件组件。这些可重用软件组件被称之为Bean。在Sun公司的JavaBean规范的定义中,Bean的正式说法是:“Bean是一个基于Sun公司的JavaBean规范的、可在编程工具中被可视化处理的可复用的软件组件”。因此JavaBean具有4个基本特性:(1)独立性(2)可重用性(3)在可视化开发工具中使用(4)状态可以保存JavaBean简介JSP较其他同类语言最强有力的方面就是能够使用JavaBean组件,JavaBean组件就是利用Java语言编写的组件,它好比一个封装好的容器,使用者并不知道其内部是如何构造的,但它却具有适应用户要求的功能。每个JavaBean都实现了一个特定的功能,通过合理地组织不同功能的JavaBean,可以快速生成一个全新的应用程序。如果将一个应用程序比做一间空房间,那么这些JavaBean就好比房间中的家具。使用JavaBean的最大优点就在于它可以提高代码的重用性,例如正在开发一个商品信息显示界面,由于商品信息存放在数据库指定表中,此时需要执行连接数据库、查询数据库、显示数据操作,如果将这些数据库操作代码都放入JSP页面中,代码复杂度可以想象,非编程人员根本无法接收这样的代码,这将为开发带来极大的不便。编写一个成功的JavaBean,宗旨是“一次性编写,任何地方执行,任何地方重用”,这正迎合了当今软件开发的潮流,“简单复杂化”,将复杂需求分解成简单的功能模块,这些模块是相对独立的,可以继承、重用,这样为软件开发提供了一个简单、紧凑、优秀的解决方案。JavaBean编程JavaBean分成可视组件和非可视组件。在JSP中主要使用非可视组件,它又分为值JavaBean和工具JavaBean。对于非可视组件,不必去设计它的外观,主要关心它的属性和方法。无论哪一种JavaBean,当它们被编译成Class文件后,需要放在项目中的WEB-INF\classes目录下,才可以在JSP页面中被调用。本节内容JavaBean的特点JavaBean页面指令JavaBean编写及使用JavaBean的属性JavaBean编程JavaBean分成可视组件和非可视组件。在JSP中主要使用非可视组件,对于非可视组件,不必去设计它的外观,主要关心它的属性和方法。无论哪一种JavaBean,当它们被编译成Class文件后,需要放在项目中的WEB-INF\classes目录下,才可以在JSP页面中被调用。本节内容JavaBean的特点JavaBean页面指令JavaBean编写及使用JavaBean的属性JavaBean的特点JavaBean是符合特殊规范Java类,所以只要会写类就能编写Bean。一个完整JavaBean在类的命名上需要遵守4点:1、如果类的成员变量的名字是xxx,那么为了更改或获取成员变量的值,在类中使用两个方法:getXxx(),用来获取属性xxx。setXxx(),用来修改属性xxx。2、对于boolean类型的成员变量,允许使用is代替get。3、类中方法的访问属性必须是public的。4、类中如果有构造方法,那么这个构造方法也是public的,并且是无参数的。编写JavaBean案例名称:简单的JavaBean程序名称:j6_01.javapackageBean;importjava.io.*;publicclassj6_01{intradius;publicj6_01(){//构造方法radius=1;}publicintgetRadius(){//获取成员变量的值returnradius;}publicvoidsetRadius(intnewRadius){//更改成员变量的值radius=newRadius;}publicdoublecircleArea(){returnMath.PI*radius*radius;}publicdoublecirclLength(){return2.0*Math.PI*radius;}}JavaBean页面指令在JSP中专门提供三个页面指令来和JavaBean交互,分别是:jsp:useBean指令:指定JSP页面中包括的JavaBeanjsp:setProperty指令:设置JavaBean的属性jsp:getProperty指令:得到某个JavaBean的属性值JavaBean页面指令id是当前页面中引用JavaBean的名字,JSP页面中的Java代码将使用这个名字来访问JavaBean。scope:指定JavaBean的作用范围,可以取4个值。page:JavaBean只能在当前页面中使用。在JSP页面执行完毕后,该JavaBean将会被进行垃圾回收。request:JavaBean在相临的两个页面中有效。session:JavaBean在整个用户会话过程中都有效。application:JavaBean在当前整个Web应用的范围内有效。jsp:useBeanid=beanidscope=page|request|session|applicationclass=package.class/jsp:useBean指令指定JSP页面中包括的JavaBean,具体的语法格式为:JavaBean的作用域applicationsessionpagerequestpage作用域page作用域在这4种类型中范围是最小的,客户端每次请求访问时都会创建一个JavaBean对象。JavaBean对象的有效范围是客户请求访问的当前页面文件,当客户执行当前的页面文件完毕后JavaBean对象结束生命。在page范围内,每次访问页面文件时都会生成新的JavaBean对象,原有的JavaBean对象已经结束生命期。返回request作用域当scope为request时,JavaBean对象被创建后,它将存在于整个request的生命周期内,request对象是一个内建对象,使用它的getParameter方法可以获取表单中的数据信息。Request范围的JavaBean与request对象有着很大的关系,它的存取范围除了page外,还包括使用动作元素jsp:include和jsp:forward包含的网页,所有通过这两个操作指令连接在一起的JSP程序都可以共享同一个JavaBean对象。返回session作用域当scope为session时,JavaBean对象被创建后,它将存在于整个session的生命周期内,session对象是一个内建对象,当用户使用浏览器访问某个网页时,就创建了一个代表该链接的session对象,同一个session中的文件共享这个JavaBean对象。客户对应的session生命期结束时JavaBean对象的生命也结束了。在同一个浏览器内,JavaBean对象就存在于一个session中。当重新打开新的浏览器时,就会开始一个新的session。每个session中拥有各自的JavaBean对象。返回application作用域当scope为application时,JavaBean对象被创建后,它将存在于整个主机或虚拟主机的生命周期内,application范围是JavaBean的生命周期最长的。同一个主机或虚拟主机中的所有文件共享这个JavaBean对象。如果服务器不重新启动,scope为application的JavaBean对象会一直存放在内存中,随时处理客户的请求,直到服务器关闭,它在内存中占用的资源才会被释放。在此期间,服务器并不会创建新的JavaBean组件,而是创建源对象的一个同步拷贝,任何拷贝对象发生改变都会使源对象随之改变,不过这个改变不会影响其它已经存在的拷贝对象。返回JavaBean的作用域示例(1)通过下面的实例说明4个作用域:首先,创建一个JavaBean:“Scope.java”。packagescope;publicclassScope{publicScope(){}//无参的构造函数privateintnumber=0;//初始化变量number的值为0publicintgetNmuber(){//增加并返回变量number的值number++;returnnumber;}publicvoidsetNumber(intnewNumber){this.number=newNumber;//给变量number赋新值}}JavaBean的作用域示例(2)然后,创建名称为“scope.jsp”的页面文件,用来显示JavaBean存在的范围的具体区别。主要代码:bodyjsp:useBeanid=pageScopescope=pageclass=scope.Scope/%out.println(使用page获取的数据为:+pageScope.getNmuber());%jsp:useBeanid=requestScopescope=requestclass=scope.Scope/%out.println(使用request获取的数据为:+requestScope.getNmuber());%jsp:useBeanid=sessionScopescope=sessionclass=scope.Scope/%out.println(使用session获取的数据为:+sessionScope.getNmuber());%jsp:useBeanid=applicationScopescope=applicationclass=scope.Scope/%out.println(“使用application获取的数据为:”+applicationScope.getNmuber());%/bodyJavaBean的作用域示例(3)程序运行结果如图1所示:关闭该浏览器,重新打开新的浏览器后的结果如图2所示:图1图2返回调用JavaBean案例名称:调用J