当前位置: 首页 > 图文教程 > 网络编程 > JSP > JSP作为客户方访问CORBA服务对象

JSP
GET 方式提交的含有特殊字符的参数
java big5到gb2312的编码转换
java Lucene 中自定义排序的实现
hibernate中的增删改查实现代码
jsp 定制标签(Custom Tag)
jsp基础速成精华讲解
IE cache缓存 所带来的问题收藏
关于JSP的一点疑问小结
JSP 多条SQL语句同时执行的方法
jsp include文件时的一个乱码解决方法
在JSTL EL中处理java.util.Map,及嵌套List的情况
jsp 页面显示的一些用法
根据Hibernte的cfg文件生成sql文件
五种 JSP页面跳转方法详解
JSP 防范SQL注入攻击分析
JSP 连接MySQL配置与使用
java eclipse 启动参数
jsp 页面上图片分行输出小技巧
解决jsp开发中不支持EL问题
JSP 页面中使用FCKeditor控件(js用法)

JSP作为客户方访问CORBA服务对象


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 72 ::
收藏到网摘: n/a

公飞
  结合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. class A_impl:public POA_example::A, PortableServer::RefCountServantBase {
  7.     public:
  8.         virtual CORBA::Long AOperation(CORBA::Long ilData)
  9.             throw(CORBA::SystemException);
  10. };
  11. #endif
  12. //////////////////////////////////////////////////////
  13. // 文件名:apptest_impl.cpp
  14. // 包含CORBA系统类库
  15. #include <STARCORBA.h>
  16. using namespace std;
  17. #include <apptest_impl.h>
  18. // 操作AOperation的实现
  19. CORBA::Long A_impl::AOperation(CORBA::Long ilData)
  20.         throw(CORBA::SystemException) {
  21.     CORBA::Long ret;
  22.     ret = ilData * 2 ;
  23.     return ret;
  24. }


  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. int main(int argc, char* argv[], char*[]) {
  11.     CORBA::ORB_var orb;    
  12.     orb = CORBA::ORB_init(argc, argv);
  13.     CORBA::Object_var nameobj = 
  14.         orb -> resolve_initial_references("NameService");
  15.     CosNaming::NamingContext_var nc = 
  16.         CosNaming::NamingContext::_narrow(nameobj.in());
  17.     CORBA::Object_var poaObj = 
  18.         orb -> resolve_initial_references("RootPOA");
  19.     PortableServer::POA_var rootPOA = 
  20.         PortableServer::POA::_narrow(poaObj);
  21.     PortableServer::POAManager_var manager = 
  22.         rootPOA -> the_POAManager();
  23.     
  24.     A_impl* AImpl = new A_impl();
  25.     PortableServer::ServantBase_var servantA = AImpl;
  26.     PortableServer::ObjectId_var Aid = 
  27.         rootPOA -> activate_object(servantA);
  28.     CORBA::Object_var A = 
  29.         rootPOA -> servant_to_reference(servantA);
  30.     CosNaming::Name AName;
  31.     AName.length(1);
  32.     AName[0].id = CORBA::string_dup("A");
  33.     AName[0].kind = CORBA::string_dup("OperationA");
  34.     nc -> rebind(AName, A.in());
  35.     
  36.     manager -> activate();
  37.     orb -> run();
  38.     
  39.     nc -> unbind(AName);    
  40.     return EXIT_SUCCESS;
  41. }


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


  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应用,然后就可以通过浏览器访问了。