站内搜索: 请输入搜索关键词

当前页面: 开发资料首页JSP 专题JSP作为客户方访问CORBA服务对象

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

摘要: 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. 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
  16. using namespace std;
  17. #include
  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
  4. #include
  5. #include
  6. #include
  7. #include
  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. A_impl* AImpl = new A_impl();
  24. PortableServer::ServantBase_var servantA = AImpl;
  25. PortableServer::ObjectId_var Aid =
  26. rootPOA -> activate_object(servantA);
  27. CORBA::Object_var A =
  28. rootPOA -> servant_to_reference(servantA);
  29. CosNaming::Name AName;
  30. AName.length(1);
  31. AName[0].id = CORBA::string_dup("A");
  32. AName[0].kind = CORBA::string_dup("OperationA");
  33. nc -> rebind(AName, A.in());
  34. manager -> activate();
  35. orb -> run();
  36. nc -> unbind(AName);
  37. return EXIT_SUCCESS;
  38. }


  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. <head>
  4. Hello JSP CORBA Client
  5. </head>
  6. <body>
  7. 3*2=<%=AClient.opA(3)%>
  8. </body>


  好了,编译好你的程序,运行名字服务,运行CORBA服务程序,运行应用服务器InforWeb,部署Web应用,然后就可以通过浏览器访问了。


↑返回目录
前一篇: JSP生成验证码源程序
后一篇: 正确优雅的解决用户退出问题——JSP和Struts解决方案