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

JSP
我认为JSP有问题(上)
我认为JSP有问题(下)
jsp“抓”网页代码的程序
关于在bean里面打印html的利弊看法
bean里面如何打印到html页面
jdbc3中的RowSet 接口规范
Apusic Application Server1.0中jsp源代码泄漏漏洞
Unify的eWave ServletExec拒绝服务漏洞
通过提交超长的GET请求导致IBM HTTP Server远程溢出
在HTTP请求中添加特殊字符导致暴露JSP源代码文件
Resin 1.2 重要源代码暴露漏洞
多中WEB服务器的通用JSp源代码暴露漏洞
Tomcat 暴露JSP文件内容
IBM WebSphere Application Server 暴露JSP文件内容
JRun 2.3.x 范例文件暴露站点安全信息
BEA WebLogic 暴露源代码漏洞
IBM WebSphere Application Server 3.0.2 存在暴露源代码漏洞
Tomcat 3.1 存在暴露网站路径问题
Sun Java Web Server 能让攻击者远程执行任意命令
Netscape 修复 JAVA 安全漏洞

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 67 ::
收藏到网摘: 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应用,然后就可以通过浏览器访问了。