`
Joy.zhang
  • 浏览: 57272 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

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

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

相关推荐

    JSP高级编程(全)

    第三部分 JDBC 新技术及其在JSP/Servlet 中的应用 第9 章 JDBC 2.0/3.0 API 的新特性 9.1 JDBC API 2.0 的新特性 9.2 JDBC API 2.0 简介 9.3 JDBC API 3.0 简介 9.4 附录JDBC 数据类型和Java 数据类型的映射关系 9.5...

    h_JAVA 2应用编程150例.rar

    实例6 在窗口中显示背景图 16 实例7 在窗体中绘制图形 18 实例8 利用JNI实现窗口特效 20 实例9 文件选择对话框 24 实例10 改变字体 26 实例11 应用JTree 28 实例12 应用JTable 30 实例13 记事本 32 实例14 使用...

    JSP高级编程          

    第三部分 JDBC 新技术及其在JSP/Servlet 中的应用 第9 章 JDBC 2.0/3.0 API 的新特性 9.1 JDBC API 2.0 的新特性 9.2 JDBC API 2.0 简介 9.3 JDBC API 3.0 简介 目录 9.4 附录JDBC 数据类型和Java 数据类型的映射...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    java面试宝典

    130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 32 131、在JSP中如何设置COOKIE? 32 132、在JSP中如何删除一个COOKIE? 32 133、在一个JSP的请求处理中如何停止JSP的执行 33 134、在JSP中如何定义...

    千方百计笔试题大全

    130、如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 32 131、在JSP中如何设置COOKIE? 32 132、在JSP中如何删除一个COOKIE? 32 133、在一个JSP的请求处理中如何停止JSP的执行 33 134、在JSP中如何定义...

    java应用软件程序设计

    这里边包括:第1章 Java图形用户界面编程 1 实例1 布局管理 2 实例2 设计软件启动界面 9 实例3 实现多色窗口 11 实例4 切分窗口 13 实例5 丰富多彩的按钮 15 实例6 在窗口中显示背景图 16 实例...

    J2EE应用开发详解

    165 10.1.1 JavaBean的特点 166 10.1.2 JavaBean的元素及属性 167 10.1.3 JavaBean的分类 168 10.2 创建JavaBean 168 10.2.1 JavaBean的规格说明 168 10.2.2 创建一个简单的JavaBean 168 10.3 在JSP中使用JavaBean ...

    水木清华站∶Java版精华区 含jsp及js等集合.chm

    [目录]为什么Applet修改后在浏览器中不发生变化 3. [目录]Java中的类型转换 4. [目录]怎样找到编译时缺少的类 2. [目录]Java疑难解答 1. [目录]Java原理问题 1. [目录]Java中是指针还是...

    java面试题

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步。在很多情况下采用异步往往更有效率。 数据库三大范式? 答:1:确保每列都是不可分割的原子值 2...

    二十三种设计模式【PDF版】

    状态是编程中经常碰到的实例,将状态对象化,设立状态变换器,便可在状态中轻松切换. 设计模式之 Memento(注释状态?) 很简单一个模式,就是在内存中保留原来数据的拷贝. 设计模式之 Interpreter(解释器) 主要用来对...

    高级java2大学教程 源代码

    介绍了有关网络服务的内容,并通过实例讲解了servlet和JSP的应用,然后列举了与其他Web服务相关的技术,例如WML、SOAP等。本书还讨论了构造企业级Java应用的关键技术,其中包括安全、JDBC、EJB等,并给出一个利用...

    Java面试宝典2010版

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 71、说出一些常用的类,包,接口,请各举5个 72、java中有几种...

    最新Java面试宝典pdf版

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    JAVA技术chm格式

    usePage changes如何成为一个优秀的jsp程序员国内不谈java《学不会的JAVA,消不了的忧愁》之五Servlet的基础结构一个简单的Servlet分布式应用开发技术概述CORBA技术及实例About UBB with java has a bu 资源太大,传...

    Java面试笔试资料大全

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    JAVA面试宝典2010

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

    Java面试宝典-经典

    70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常! 48 71、说出一些常用的类,包,接口,请各举5个 49 72、java中有...

Global site tag (gtag.js) - Google Analytics