结合J2EE和CORBA可以充分利用两者的优点建立性能更好功能更强的应用系统,例如可以使用C++实现的CORBA对象作为业务处理构件,形成高性能业务逻辑层,在JSP中访问CORBA构件建立展现层。 下面我们就一起来看一个在JSP中访问CORBA服务对象的例子。 软件选择: CORBA服务方,我们选择中创软件商用中间件有限公司(http://www.inforbus.com)的InforBus(一个遵循CORBA规范的分布对象中间件),基于C++进行开发。操作系统选择IBM AIX(当然,你也可以选择HP UNIX、Linux或者Windows之类的)。 CORBA客户方,为了展现CORBA的互操作能力,这里使用了JDK中包含的ORB。当然,作为一种更好的选择,您也可以使用InforBus的Java版本来实现CORBA的客户方。 JSP运行环境,我们选择中创软件商用中间件有限公司(http://www.inforbus.com)的InforWeb(一个遵循J2EE规范的应用服务器)。操作系统选择Window(当然,你也可以选择HP UNIX、Linux或者AIX之类的)。 程序实现 IDL IDL是CORBA服务方和客户方进行请求调用的协议,只要使用相同的IDL,客户方和服务方就可以进行无缝的通讯,而与客户方和服务方的开发语言、操作系统都没有关系,甚至你可以为客户方和服务方选择不同的CORBA中间件(只要他们都遵循CORBA规范)。在实现CORBA客户方程序的时候,你不需要关心服务方的任何细节,你所需要关心的只有IDL! 在这里我们定义如下所示的IDL(文件名为apptest.idl): module example { interface A { long AOperation(in long ilData); }; }; CORBA服务方程序实现 CORBA服务方实现需要做的工作主要有:将IDL映射到C++,实现IDL中定义的接口(即实现处理逻辑),编写一个主程序实例化服务对象提供服务。 1. 将IDL映射到C++ 这个只需要调用InforBus的IDL编译器idl,执行如下命令: idl apptest.idl 这个命令将产生四个文件:apptest.h、apptest.cpp、apptest_skel.cpp、apptest_skel.cpp,其中包含了Skeleton。 2. 实现IDL中定义的接口 继承Skeleton,实现IDL接口定义,在实现类中完成你的业务逻辑,在这个例子中我们实现一个简单的逻辑,将接收到的参数乘以2,然后将结果返回,代码如下: //////////////////////////////////////// // 文件名:apptest_impl.h #ifndef APPTEST_IMPL_H #define APPTEST_IMPL_H #include \"apptest_skel.h\" class A_impl:public POA_example::A, PortableServer::RefCountServantBase { public: virtual CORBA::Long AOperation(CORBA::Long ilData) throw(CORBA::SystemException); }; #endif ////////////////////////////////////////////////////// // 文件名:apptest_impl.cpp // 包含CORBA系统类库 #include using namespace std; #include // 操作AOperation的实现 CORBA::Long A_impl::AOperation(CORBA::Long ilData) throw(CORBA::SystemException) { CORBA::Long ret; ret = ilData * 2 ; return ret; } 3. 编写一个主程序实例化服务对象提供服务 在主程序中,建立CORBA环境,实例化服务对象并注册到名字服务,然后开始等待请求,代码如下(为了): /////////////////////////////////////////// // 文件名:Server.cpp #include #include #include #include #include #include \"apptest_impl.h\" using namespace std; int main(int argc, char* argv[], char*[]) { CORBA::ORB_var orb; orb = CORBA::ORB_init(argc, argv); CORBA::Object_var nameobj = orb -> resolve_initial_references(\"NameService\"); CosNaming::NamingContext_var nc = CosNaming::NamingContext::_narrow(nameobj.in()); CORBA::Object_var poaObj = orb -> resolve_initial_references(\"RootPOA\"); PortableServer::POA_var rootPOA = PortableServer::POA::_narrow(poaObj); PortableServer::POAManager_var manager = rootPOA -> the_POAManager(); A_impl* AImpl = new A_impl(); PortableServer::ServantBase_var servantA = AImpl; PortableServer::ObjectId_var Aid = rootPOA -> activate_object(servantA); CORBA::Object_var A = rootPOA -> servant_to_reference(servantA); CosNaming::Name AName; AName.length(1); AName[0].id = CORBA::string_dup(\"A\"); AName[0].kind = CORBA::string_dup(\"OperationA\"); nc -> rebind(AName, A.in()); manager -> activate(); orb -> run(); nc -> unbind(AName); return EXIT_SUCCESS; } Web应用实现 Web应用中主要是通过一个JSP访问CORBA服务对象并进行展示,在这里充当CORBA的客户方。实现Web应用需要完成两个方面任务:将IDL映射到Java,在JSP中发送请求并展示结果。 1. 将IDL映射到Java 这个只需要调用JDK的IDL编译器idlj,执行如下命令: idlj apptest.idl 这个命令将产生五个文件:A.java、AOperations.java、AHelper.java、AHolder.java和_AStub.java,其中包含了Stub。 2. 在JSP中发送请求并展示结果。 为了避免在JSP中包含太多的Script,在这里将发送请求的代码从JSP分离到了一个简单的Java类中。 Java类的代码如下(AClient.java): /* * AClient.java */ package example; import org.omg.CORBA.*; import org.omg.CORBA.ORBPackage.InvalidName; import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.CannotProceed; import org.omg.CosNaming.NamingContextPackage.NotFound; /** * @author 公飞 */ public class AClient { public static int opA(int num) throws Exception { String[] args = { \"-ORBInitRef\", \"NameService=corbaloc:iiop:192.168.60.158:900/NameService\" }; ORB orb = ORB.init(args, null); org.omg.CORBA.Object objRef; objRef = orb.resolve_initial_references(\"NameService\"); NamingContext ncRef = NamingContextHelper.narrow(objRef); NameComponent nc = new NameComponent(\"A\", \"OperationA\"); NameComponent path[] = { nc }; org.omg.CORBA.Object objA; objA = ncRef.resolve(path); A a = AHelper.narrow(objA); int out; out = a.AOperation(num); return out; } } JSP文件的代码如下(index.jsp): <%@ page contentType=\"text/html;charset=gb2312\"%> <%@ page import = \"example.AClient\" %> 3*2=<%=AClient.opA(3)%> 好了,编译好你的程序,运行名字服务,运行CORBA服务程序,运行应用服务器InforWeb,部署Web应用,然后就可以通过浏览器访问了。 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-30 13:17 , Processed in 0.159060 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.