JSP作为顾客方访问CORBA服务内容
发布时间:2023-05-20 13:52:19 所属栏目:教程 来源:
导读:结合j2ee和corba可以充分利用两者的优点建立性能更好功能更强的应用系统,例如可以使用c++实现的corba对象作为业务处理构件,形成高性能业务逻辑层,在jsp中访问corba构件建立展现层。 下面我们就一起来看一个在jsp中
结合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 <starcorba.h> using namespace std; #include <apptest_impl.h> // 操作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 <stdio.h> #include <starcorba.h> #include <starcosnaming.h> #include <stdlib.h> #include <errno.h> #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/" %> <html> <head> <title>hello jsp corba client</title> </head> <body> 3*2=<%=aclient.opa(3)%> </body> </html> 好了,编译好你的程序,运行名字服务,运行corba服务程序,运行应用服务器inforweb,部署web应用,然后就可以通过浏览器访问了。 (编辑:聊城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
站长推荐