【Java复习】第九讲 JavaBean和RMI
软件组件就是指可以进行独立分离、易于重复使用的软件部分。JavaBean就是一种基于Java平台的软件组件思想。JavaBean也是一种独立于平台和结构的应用程序编程接口(API)。JavaBean保留了其他软件组件的技术精华,并增加了被其他软件组件技术忽略的技术特性,使得它成为完整的软件组件解决方案的基础,并在可移植的Java平台上方便地用于网络世界中。
虽然JavaBean和Java之间已经有了明确的界限,但是在某些方面JavaBean和Java之间仍然存在很容易混淆的地方,比如说重用,Java语言也可以为用户创建可重用的对象,但它没有管理这些对象相互作用的规则或标准,用户可以使用在Java中预先建立好的对象,但这必须具有对象在代码层次上的接口的丰富知识。而对于JavaBean,用户可以在应用程序构造器工具中使用各种JavaBean组件,而不需要编写任何代码。这种同时使用多个组件而不考虑其初始化情况的功能是对当前Java模型的重要扩展,所以也可以说JavaBean是在组件技术上对Java语言的扩展。
如果真的要明确的定义,那么JavaBean的定义是:JavaBean是可复用的平台独立的软件组件,开发者可以在软件构造器工具中对其直接进行可视化操作。在上面的定义中,软件构造器可以是Web页面构造器、可视化应用程序构造器、GUI设计构造器或服务器应用程序构造器。而JavaBean可以是简单的GUI要素,如按钮和滚动条;也可以是复杂的可视化软件组件,如数据库视图。有些JavaBean是没有GUI表现形式的,但这些JavaBean仍然可以使用应用程序构造器可视化地进行组合,比如JBuilder上的很多控件其实也是没有GUI形式的,但是你仍然可以拖放它们以在你的应用程序里生成相应的代码。一个JavaBean和一个Java Applet很相似,是一个非常简单的遵循某种严格协议的Java类。
JavaBean具有Java语言的所有优点,比如跨平台等等,但它又是Java在组件技术方面的扩展,所以说很多方面它和Applet很像,Applet也具有Java语言的所有优点,同时也是Java在浏览器端程序方面的扩展。其实它们都是严格遵循某种协议的Java类,它们的存在都离不开Java语言的强大支持。
从基本上来说,JavaBean可以看成是一个黑盒子,即只需要知道其功能而不必管其内部结构的软件设备。黑盒子只介绍和定义其外部特征和与其他部分的接口,如按钮、窗口、颜色、形状等。作为一个黑盒子的模型,以把JavaBean看成是用于接受事件和处理事件以便进行某个操作的组件建筑块。
一个JavaBean由3部分组成:
(1) 属性(properties)
JavaBean提供了高层次的属性概念,属性在JavaBean中不只是传统的面向对象的概念里的属性,它同时还得到了属性读取和属性写入的API的支持。属性值可以通过调用适当的bean方法进行。比如,可能bean有一个名字属性,这个属性的值可能需要调用String getName()方法读取,而写入属性值可能要需要调用void setName(String str)的方法。
每个JavaBean属性通常都应该遵循简单的方法命名规则,这样应用程序构造器工具和最终用户才能找到JavaBean提供的属性,然后查询或修改属性值,对bean进行操作。JavaBean还可以对属性值的改变作出及时的反应。比如一个显示当前时间的JavaBean,如果改变时钟的时区属性,则时钟会立即重画,显示当前指定时区的时间。
(2) 方法(method)
JavaBean中的方法就是通常的Java方法,它可以从其他组件或在脚本环境中调用。默认情况下,所有bean的公有方法都可以被外部调用,但bean一般只会引出其公有方法的一个子集。
由于JavaBean本身是Java对象,调用这个对象的方法是与其交互作用的唯一途径。JavaBean严格遵守面向对象的类设计逻辑,不让外部世界访问其任何字段(没有public字段)。这样,方法调用是接触Bean的唯一途径。
但是和普通类不同的是,对有些Bean来说,采用调用实例方法的低级机制并不是操作和使用Bean的主要途径。公开Bean方法在Bean操作中降为辅助地位,因为两个高级Bean特性--属性和事件是与Bean交互作用的更好方式。
因此Bean可以提供要让客户使用的public方法,但应当认识到,Bean设计人员希望看到绝大部分Bean的功能反映在属性和事件中,而不是在人工调用和各个方法中。
(3) 事件(event)
Bean与其他软件组件交流信息的主要方式是发送和接受事件。我们可以将bean的事件支持功能看作是集成电路中的输入输出引脚:工程师将引脚连接在一起组成系统,让组件进行通讯。有些引脚用于输入,有些引脚用于输出,相当于事件模型中的发送事件和接收事件。
事件为JavaBean组件提供了一种发送通知给其他组件的方法。在AWT事件模型中,一个事件源可以注册事件监听器对象。当事件源检测到发生了某种事件时,它将调用事件监听器对象中的一个适当的事件处理方法来处理这个事件。
JavaBean1.0指定的组件模型规定了Bean的如下特征:
(1)内省:使组件可以发表其支持的操作和属性的机制,也是支持在其他组件中(如Bean的开发工具)发现这种机制的机制。
(2)属性:在设计Bean时可以改变的外观和行为特征。开发工具通过对Bean进行内省来获知其属性,进而发布其属性。
(3)定制:Bean通过发布其属性使其可以在设计时被定制。有两种方法支持定制:通过使用Beans的属性编辑器,或者是使用更复杂Bean定制器。
(4)通信:Bean之间通过事件互相通信。开发工具可以检测一个Bean可以接收和引发的事件。
(5)持续:使Bean可以存储和恢复其状态。一个Bean的属性被修改以后,可以通过对象的持续化机制保存下来,并可以在需要的时候恢复。
9.3 RMI的基本概念和编程简介
package hello;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject implements Hello
//实现Hello接口
{
private String name;
public HelloImpl (String s ) throws java.rmi.RemoteException{
super(); //调用父类的构造函数
name = s;
}
public String sayHello() throws RemoteException {
return "Hello world!"; //实现Hello接口定义的方法
}
public static void main ( String args [])
{
System.setSecurityManager ( new RMISecurityManager() );
//设置RMI程序需要的安全策略
try
{
HelloImpl obj = new HelloImpl("HelloServer");
//生成一个HelloImpl的实例
Naming.rebind("HelloServer", obj);
//将这个实例绑定到一个名字上
System.out.println("HelloImpl created and bound in the registry to the name HelloServer");
} catch (Exception e)
{
System.out.println("HelloImpl.main: an exception occured:");
e.printStackTrace(); //产生异常的话,打印出出错信息
}
}
}
server方生成一个远程对象并和一个可和客户对话的名称"HelloServer"绑定。Client端可以根据该名称寻找相应的远程对象,进而调用其远程方法。
1. Set CLASSPATH = %CLASSPATH%;d:/
2. 在d:/hello下编译源代码:
javac -d .. *.java
3. 在生成端头和框架模块,首先把目录切换回d:/
rmic -d . hello.HelloImpl
4. 在d:/下运行RMI远程对象注册程序
start rmiregistry
5. 在d:/下运行服务器程序
java -Djava.security.policy=my.policy hello.HelloImpl
6. 在d:/下运行客户端程序
java -Djava.security.policy=my.policy hello.HelloClient
其中上面的步骤中5和6出现的my.policy是一个文件,这个文件和Java的安全机制有关,在这个程序中我们不需要安全限制,所以我们把权限设为都可以访问。my.policy如下:
grant {
permission java.security.AllPermission;
};
你一定要记得设置这个文件,否则RMI将出"拒绝访问"的错误。如果你想了解Java其他的安全机制,那么可以参考Java里有关security的资料。
传统的分布式应用程序都是基于Client/Server结构的,而近年来人们发现基于Client/Server结构的应用程序有很多缺点,比如:如果客户端的代码需要改变,那么所有机器上的客户端程序都要重新安装;如果某台机器有了不可修复的损坏,那么得去别的机器上重新安装客户端软件才能够使用。而基于Browser/Server结构的应用程序就没有以上的缺点了,我们可以使用任何一台有浏览器的机器来工作,而因为所有的程序逻辑都在服务器端,所以服务器端的代码变动不需要作为客户端的浏览器再做任何工作。
由于Browser/Server结构的这些优势,近年来关于Browser/Server的程序开发模式有了很多的研究和实践。而因为Browser没有办法表示复杂的程序逻辑,所以在表示界面的Browser和存储介质数据库之间必须还有一层结构,这层结构负责表示复杂的程序逻辑。这就是我们所说的服务器端构件,在Brower/Server结构中,我们的工作就是开发服务器端构件,但是开发服务器端构件是很麻烦的工作。因为服务器端构件必须接受很多客户端的请求,因此它必须具有多线程和事务处理等能力,而这些也成为服务器端构件开发的难点所在。
Sun公司发布的文档中对EJB的定义是:EJB是用于开发和部署多层结构的、分布式的、面向对象的Java应用系统的跨平台的构件体系结构。采用EJB可以使得开发商业应用系统变得容易,应用系统可以在一个支持EJB的环境中开发,开发完之后部署在其他的EJB环境中,随着需求的改变,应用系统可以不加修改地迁移到其他功能更强、更复杂的服务器上。
EJB简化了多层体系结构应用系统的开发过程。在分布式应用系统的开发中,采用多层体系结构的方法有很多优点,如增加了应用系统的可伸缩性、可靠性、灵活性等。因为服务器端构件可以根据应用需求加以修改,且构件在网络中的位置和应用无关,因此系统管理员可以很容易重新配置系统的负载。多层体系结构非常适合于大数据量的商业事务系统,特别是在基于Web的应用中,需要多层体系结构支持瘦客户机及浏览器的快速Applet下载,目前越来越多的系统开始采用多层体系结构的方法,所谓的多层结构,可以用下图来帮助理解:
在多层结构中,数据库算是一层,客户端算一层,而客户端和数据库之间统称为N-2层,N-2层主要是表示程序的逻辑。EJB的作用就是在这N-2层里面负责表示程序的逻辑和提供访问数据库的接口。EJB分为两类,一类是实体Bean(Entity Bean),这种EJB和数据库中的表有一一对应的关系,可以在数据改变的时候自动更新表里的内容。还有一类是对话Bean(Session Bean),这种EJB用于和客户端交互,代表了程序的逻辑,我们可以用这两种EJB来方便的构建自己的多层系统。
EJB把Java的"write once, run anywhere"思想提到了一个新的高度,服务器端构件在构件执行系统内执行,规范说明定义了构件执行系统所需要的服务,遵从EJB规范说明开发的构件可以在任何一个支持EJB的系统中执行。EJB其实是在容器里执行的,Sun公司也发布了EJB容器的规范,EJB可以在任何符合规范的容器中运行,容器其实就是给EJB提供服务的,比如说EJB需要的事务处理,多线程和安全机制等服务。
软构件模型的思想是创建可重用的构件并将其组合到容器中以得到新的应用系统,构件模型定义了构件的基本体系结构、构件界面的结构、和其他构件及容器相互作用的机制等。利用构件模型的规范说明,构件开发人员开发那些实现了应用程序逻辑的构件,而应用系统开发人员把这些预先开发好的构件组合成应用系统,这些应用系统也可以作为新的构件。软构建模型思想已经在软件开发界迅速流行,因为它可以达到以下这些目的:重用、高层开发、通过工具进行自动化开发、简化开发过程等。JavaBeans、EJB、COM/DCOM等都是软构件模型的例子。
有两种类型的软构件模型--客户端构件模型和服务器端构件模型。客户端构件模型如JavaBeans是专门用于处理程序的表示(presentation)及用户界面问题的;服务器端构件模型如EJB则向面向事务的中间件提供基础设施。
服务器端构件模型把构件模型的开发和中间件联系在一起。企业级应用的中间件以其复杂性著称,它不仅涉及到应用逻辑、并发性和伸缩性问题,也涉及到如何把不兼容的系统组合在一起的问题。服务器端构件模型解决了中间件开发的复杂性问题,它使得中间件开发人员集中于应用系统的逻辑部分,而不用处理同步、可伸缩性、事务集成、网络、分布式对象框架等一些分布式应用系统中存在的复杂问题。EJB构件模型如下图所示:
?
EJB构件模型给开发者提供了一下的支持:
1. 构件包含应用程序逻辑
2. 可重用的构件
3. 可伸缩性
4. 资源管理
5. 事务支持
6. 并发性管理
1.EJB和JavaBean的关系
很多人往往把JavaBean和EJB混淆起来,JavaBean提供了基于构件的开发机制,一般JavaBeans是可视化的构件,也有一些JavaBeans是非可视化的,JavaBeans可以在多个应用系统中重用,一个标准的JavaBeans是一个客户端构件,在运行时不能被其他客户机程序存取或操作,但客户端的JavaBeans容器可以根据JavaBeans的属性、方法、事件的定义在设计或运行时对JavaBeans进行操作,JavaBeans不一定要用于Client/Server结构的系统。
EJB没有用户界面,完全位于服务器端,EJB可以多个JavaBean组成,规范说明详细说明了EJB容器需要满足的需求以及如何和EJB构件相互协作。EJB可以和远程客户端程序通信,并提供一定的功能,根据规范说明,EJB是Client/Server系统的一部分,如果不和客户端程序交互,EJB一般不执行具体的功能。EJB和JavaBean的一个重要区别是EJB提供了网路功能。
2.EJB和RMI的关系
EJB是分布式的组件,它支持远程调用。而EJB的这些网络特性是建立在RMI之上的,可以说,RMI是EJB网络特性的基石。
因为EJB是分布式的,所以如何定位一个EJB也是需要解决的问题,而这个问题和RMI里如何定位一个对象是一样的,EJB也用了RMI registry的思想,EJB里的JNDI(Java Naming and Directory Interface)也提供了注册一个对象的服务,已经注册了的对象可以很容易的被找到。这和RMI的registry的想法和功能上是一样的。
3. EJB和网络计算的关系
由Beans构造的应用程序可以根据用户的需求分解成不同的构件,根据用户当前所需要的功能提供相关的构件,并随着用户新的需求随时下载新的构件,而用户没有用到其功能的构件可以驻留在服务器上,这就是网络计算所倡导的概念。
很多人并没有完全理解Java的概念,他们认为为了在一个客户端上运行Java程序,需要把一个庞大的、可能达几兆字节的Java应用程序一次性通过网络传输到客户端,事实上,这也是一些开发人员计划用Java改写旧的应用系统时易犯的错误。
在网络计算环境中利用Java的最好途径是由EJB提供服务端的构件,而由JavaBeans提供客户端的构件,两者结合在一起,将会使应用系统的搭建更为简单和快速。
只有把Java应用于服务器端的应用系统才能真正体现Java的威力,EJB是Java的服务器端构件模型,该模型保证开发出来的构件可以被部署在任何支持EJB规范说明的系统中,既使该系统是由不同的开发商提供的。采用EJB可以提高开发人员的生产率,构件开发人员和应用开发人员不需要实现系统中的一些复杂的逻辑结构,因为构件的容器已提供对这些服务的自动管理和控制,采用EJB开发的应用系统不用修改就可以从一个服务器迁移到另一个功能更强的服务器上。
总之,EJB技术将使得Java在企业计算中的地位得到加强,为基于Java的应用系统提供了一个框架,和目前的许多系统和模型相比,EJB具有许多优越性,种种迹象表明,EJB有可能成为分布式应用系统的服务器端构件模型的首要选择。