学习使用CORBA编写访问服务器对象的分布式Java小应用
摘要:若想实现Web上分布式客户机/服务器模式的应用程序,可以选择多种不同的技术。但是,对于必须服务于大量用户的应用,我们认为应该首选CORBA,因为它具有可扩展性和业界广泛的支持。由于CORBA的强健性可以提高Java编程语言的性能,利用已有的基于标准的技术,Java开发者可以编写出功能强大的Web应用程序
。在这篇文章里,我们首先简单介绍一下CORBA,然后作为该技
术的实例,我们将着手编写一个N层客户机/服务器应用程序。另外,在附文中,我们对几种分布式对象技术作了一个比较,它们分别是CORBA
、RMI和DCOM。
利用HTML表和通用网关接口(CommonGatewayInterface),用户可以对
Web网点上的服务器脚本进行交互式的访问。许多网点上使用这种技术提示用户输入用户名和密码。这些东西传入服务器脚本之后,用于
验证该用户是否可以访问网点中的某一部分内容。这一过程用到了HTTP,而它是一种无状态(stateless)的协议。每次下载一个页面,客户机就与服务器完全脱离,服务器方无从得知客户机的信息,更无法知道脱离后的客户机正在进行的动作。这样,哪怕是在成功的登录到某一网点之后,客户程序每查询一个页面,仍需
将用户名和密码传向服务器方进行重复的认证。换句话说,在你的客户应用程序(Web浏览器)和服务器应用程序之间,不存在局部变量、
方法调用或是对象。
经过数十年的努力,软件开发者们几乎可以成功地将代码以
对象的形式加以封装。但是,上面提到的现象,无疑表明了我
们正在倒退,因为那是无状态的、批处理的计算模式。
当然,CGI技术并非一无是处。Web给我们带来了革命性的优势,那就是基于标准的开放协议和与平台无关的独立性。尽管成千上万的Web网点使用HTTP和CGI来获得用户信息、在服务器上运
行一段脚本、甚至还可能向用户返回信息,但是从传统的的观点看来,这些网点并不能算是真正的“应用程序”。除此之外,由于新技术的应用(HTTP和CGI),所有这些网点的代码必须要全部重写。想要对已有的Web软件资源加以利用,或是编写真正功能强大的应用程序,使
Internet/Intranet成为通信主干,所使用的技术必须具有以下特性:
现有的C、C++和COBOL代码Java,以建立具有可移值性、平台独立性的面向对象的应用程序
中立性,只有这样,应用程序才易于维护,且不会被时间淘汰。
扩充性,能够支持大{"C++,Java","Java,Smalltalk,Ada95,
C++","Java,C++",
"Java,C++","Java,C++"},
{"http://www.expersoft.com","http://www.iona.com",
"http://www.visigenic.com",
"http://www.software.ibm.com/ad/cb",
"http://www.sun.com/solaris/neo/solaris_neo/index.html"}};
ORBQuery(Stringname){
super(name);
}
publicjava.lang.StringGetName(intindex)
{
StringName;
Name=ORBVendors[index][0];
returnName;
}
publicjava.lang.StringGetVendor(intindex)
{
StringVendor;
Vendor=ORBVendors[index][1];
returnVendor;
}
publicjava.lang.StringGetOS(intindex)
{
StringOS;
OS=ORBVendors[index][2];
returnOS;
}
publicjava.lang.StringGetLanguages(intindex)
{
StringLanguages;
Languages=ORBVendors[index][3];
returnLanguages;
}
publicjava.lang.StringGetURL(intindex)
{
StringURL;
URL=ORBVendors[index][4];
returnURL;
}
}
至此,我们已经写好了所有服务器方必需的代码,下一步的工作是创建客户小应用,初始化客户ORB,进而击活并调用刚刚生成的服务器对象。
创建CORBA小应用
正如服务器对象要向服务器ORB登记一样,客户端小应用或应用程序需要向客户机ORB登记。当要获得远程CORBA对象时,客户机采用了一种间接的方法,它通知客户机ORB其意图,由ORB负责ORB到ORB的通讯。这种请求方式由下面两行代码实现(在VisiBrokerforJava中):
//初始化ORB(使用applet)
org.omg.CORBA.ORBorb=org.omg.CORBA.ORB.init(this);
//检索applet要调用的ORBInfo接口对象
ORBInfoQuery=ORBQuery.ORBInfoHelper.bind(orb,"ORBInfo");
执行了bind()方法调用之后,我们的ORBInfoQuery本地变量与服务器的ORBInfo对象绑在一起。这一操作完成之后,我们就可以调用帮助方法来实现客户端小应用。记住,尽管示例中我们完全
使用了Java语言,但实际上,服务器对象也可以用其他语言来实现,如:COBOL、C++、Ada和Smalltalk。
结论
与单纯的Java小应用相比,创建CORBAJava应用稍显复杂。事实上
,这同样比用RMI创建纯粹的Java分布式对象应用要难一些。但是,CORBA和Java的联合,所创建的应用程序功能更为强大,更具可扩充性,这是单纯用JDK开发所无法比拟的。另外,现实是企业界很少使用Java应用程序。CORBA是两全其美的选择,一方面它允许开发者利用已有的代码保护投资,另一方面又可以充分发挥Java编程
语言的优势。
分布式对象另外两种选择:DCOM和RMI
大多数Java开发者可能更熟悉DCOM和RMI,这是CORBA两个主要的竞争对手。现在让我们对三者做一下比较。
CORBA重述
CORBA有几个基本的优点:与开发语言无关的独立性,与开发者
无关的独立性和与操作系统无关的独立性。CORBA的ORB在当前
每一种主流操作系统上均有实现(仅就Microsoft的各种操作系
统来说,CORBA获
得的支持甚至超越了DCOM)。除此之外,CORBAORB可以访问多种语
言实现的对象(包括C++、COBOL、Smalltalk和Java)。借助于IIOP,某
一开发者(比如说Visigenic)开发的CORBAORB能够获取,操作远程
的由其他的开
发者(比如说IONA)开发的对象。JavaORB允许客户端在没有安装
任何特别软件的情况下实现Java客户端应用程序。(JavaORB的类
可与小应用一起动态下载,也可能与浏览器捆绑在一起。)
DCOM:Microsoft的法宝
目前,Microsoft的分布式组件对象模型(DistributedComponontObject
Model)仅运行于两种操作系统之上:Windows95和WindowsNT4。
Microsoft正在与第三方开发商协作,以将DCOM移到其它的操作系统上(包括MVS和几
种UNIX操作系统)。象CORBA一样,DCOM是独立于语言的,它用
Microsoft的对象描述语言(ODL)通过接口对对象加以描述。
与CORBA相比,DCOM有三个重大缺点。首先,它由单一开发者(微软)定义并控制,这大大限制了DCOM使用者的选择范围(比方说开发工具和风格)。其次,DCOM缺乏众多的平台支持,这极大程度地制约了代码的可重用性和DCOM应用的可扩展性。最后,与CORBA相比,DCOM是一种非常不成熟的技术。尽管微软目前正为DCOM加入消息和事
务支持,但这些功能在1994年的CORBA2.0就已经实现了,并且正由几家不同的CORBA软件开发商所发行。
为了使一个Java的小应用/应用程序得以访问服务端的DCOM对象,开发者不得不使用InternetExplorer浏览器和Windows95/NT平台,只有这样才能支持
