在JSP中访问CORBA服务对象实例

结合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):

1. module?example?{
2. ????interface?A?{
3. ????????long?AOperation(in?long?ilData);
4. ????};
5. };


   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,然后将结果返回,代码如下:

1.
2. //?文件名:apptest_impl.h
3. #ifndef?APPTEST_IMPL_H
4. #define?APPTEST_IMPL_H
5. #include?\"apptest_skel.h\"
6.
7. class?A_impl:public?POA_example::A,?PortableServer::RefCountServantBase?{
8. ????public:
9. ????????virtual?CORBA::Long?AOperation(CORBA::Long?ilData)
10. ????????????throw(CORBA::SystemException);
11. };
12.
13. #endif
14.
15. //
16. //?文件名:apptest_impl.cpp
17. //?包含CORBA系统类库
18. #include?<STARCORBA.h>
19. using?namespace?std;
20. #include?<apptest_impl.h>
21.
22. //?操作AOperation的实现
23. CORBA::Long?A_impl::AOperation(CORBA::Long?ilData)
24. ????????throw(CORBA::SystemException)?{
25. ????CORBA::Long?ret;
26. ????ret?=?ilData?*?2?;
27. ????return?ret;
28. }


   3.?编写一个主程序实例化服务对象提供服务
   在主程序中,建立CORBA环境,实例化服务对象并注册到名字服务,然后开始等待请求,代码如下(为了):

1. ///
2. //?文件名:Server.cpp
3. #include?<stdio.h>
4. #include?<STARCORBA.h>
5. #include?<STARCosNaming.h>
6. #include?<stdlib.h>
7. #include?<errno.h>
8. #include?\"apptest_impl.h\"
9. using?namespace?std;
10.
11. int?main(int?argc,?char*?argv[],?char*[])?{
12. ????CORBA::ORB_var?orb;????
13. ????orb?=?CORBA::ORB_init(argc,?argv);
14.
15. ????CORBA::Object_var?nameobj?=?
16. ????????orb?->?resolve_initial_references(\"NameService\");
17. ????CosNaming::NamingContext_var?nc?=?
18. ????????CosNaming::NamingContext::_narrow(nameobj.in());
19.
20. ????CORBA::Object_var?poaObj?=?
21. ????????orb?->?resolve_initial_references(\"RootPOA\");
22. ????PortableServer::POA_var?rootPOA?=?
23. ????????PortableServer::POA::_narrow(poaObj);
24. ????PortableServer::POAManager_var?manager?=?
25. ????????rootPOA?->?the_POAManager();
26. ????
27. ????A_impl*?AImpl?=?new?A_impl();
28. ????PortableServer::ServantBase_var?servantA?=?AImpl;
29. ????PortableServer::ObjectId_var?Aid?=?
30. ????????rootPOA?->?activate_object(servantA);
31. ????CORBA::Object_var?A?=?
32. ????????rootPOA?->?servant_to_reference(servantA);
33.
34. ????CosNaming::Name?AName;
35. ????AName.length(1);
36. ????AName[0].id?=?CORBA::string_dup(\"A\");
37. ????AName[0].kind?=?CORBA::string_dup(\"OperationA\");
38. ????nc?->?rebind(AName,?A.in());
39. ????
40. ????manager?->?activate();
41. ????orb?->?run();
42. ????
43. ????nc?->?unbind(AName);????
44. ????return?EXIT_SUCCESS;
45. }


   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):

1. /*
2. ?*?AClient.java
3. ?*/
4. package?example;
5.
6. import?org.omg.CORBA.*;
7. import?org.omg.CORBA.ORBPackage.InvalidName;
8. import?org.omg.CosNaming.*;
9. import?org.omg.CosNaming.NamingContextPackage.CannotProceed;
10. import?org.omg.CosNaming.NamingContextPackage.NotFound;
11.
12. /**
13. ?*?@author?公飞
14. ?*/
15. public?class?AClient?{
16. ????public?static?int?opA(int?num)?throws?Exception?{
17. ????????String[]?args?=?{?\"-ORBInitRef\",
18. ????????????????\"NameService=corbaloc:iiop:192.168.60.158:900/NameService\"?};
19. ????????ORB?orb?=?ORB.init(args,?null);
20. ????????org.omg.CORBA.Object?objRef;
21. ????????objRef?=?orb.resolve_initial_references(\"NameService\");
22. ????????NamingContext?ncRef?=?NamingContextHelper.narrow(objRef);
23. ????????NameComponent?nc?=?new?NameComponent(\"A\",?\"OperationA\");
24. ????????NameComponent?path[]?=?{?nc?};
25.
26. ????????org.omg.CORBA.Object?objA;
27. ????????objA?=?ncRef.resolve(path);
28. ????????A?a?=?AHelper.narrow(objA);
29.
30. ????????int?out;
31. ????????out?=?a.AOperation(num);
32. ????????return?out;
33. ????}
34. }


   JSP文件的代码如下(index.jsp):

1. <%@?page?contentType=\"text/html;charset=gb2312\"%>
2. <%@?page?import?=?\"example.AClient\"?%>
3. <html>
4. ????<head>
5. ????????<title>Hello?JSP?CORBA?Client</title>
6. ????</head>?
7. ????<body>
8. ????????3*2=<%=AClient.opA(3)%>
9. ????</body>
10. </html>


   好了,编译好你的程序,运行名字服务,运行CORBA服务程序,运行应用服务器InforWeb,部署Web应用,然后就可以通过浏览器访问了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值