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

js|对象|访问

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

时间: 2024-10-20 03:16:43

JSP作为客户方访问CORBA服务对象的相关文章

建立JSP操作提高数据库访问效率

js|访问|数据|数据库     从服务器端促进程序快速开发的Java Server Pages (JSP)决定它成为一种广为流行的工具.虽然呆板的一面仍然存在,然而无论它包含多少缺点,JSP能够为Web程序设计者提供很多东西,尤其是与数据库的输入和输出操作与数据的处理.     通过JSP来进行数据库访问不需要太多的引导.问题是如何使开发者能够接受Web程序的数据库访问比传统的本地OLAP系统的数据库访问更加具有吸引力,并且使他们认识到,整洁和简要的数据访问方法才是关键的.在这一点上,JSP可

eclipse中jsp能连接数据库但是访问不了数据库里面的表!!!

问题描述 eclipse中jsp能连接数据库但是访问不了数据库里面的表!!! 代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="java.sql.*" %> <!DOCTYPE html PUBLIC "-//W3C//D

如何知道客户能否访问某网站

问题描述 有什么办法可以知道客户能否访问我的网站现在只知道客户端的IP有没有办法知道此IP能否访问这个DNS因为有客户反映能访问这台机器的一个网站但同一台机器的另外一个网站就无法访问 解决方案 解决方案二:可以ping一下,程序中是可以通过ping去判断的解决方案三:查看IISlog解决方案四:客户得到什么错误.我觉得是不是telnet好点?解决方案五:IISLOG应该是不行,因为他都无法解析到这个域名,怎么会访问到IIS呢?ping的话,好象也有点问题,比如一个网站,我是无法访问的但居然pin

jsp被多次访问是否只有一个实例?

问题描述 jsp被多次访问是否只有一个实例?测试下来好怪有谁能解释一下?测试前请先把apache-tomcat-6.0.18work下的文件删除测试例子<%!publicinta=0;%><%out.println(a++);out.println(",");out.println(Integer.toHexString(this.hashCode()));%>第一次输出0,1a201ec第二次输出0,1a342bf第三次输出1,1a342bf..第N次输出N-

如何在jsp页面 用ognl 访问object数组

问题描述 请问下如何在jsp页面用ognl访问object数组 解决方案 解决方案二:首先,你需要导入struts必要的包,然后在jsp中引用<%@taglibprefix="s"uri="/struts-tags"%>然后将其迭代<s:iteratorvalue=object数组"var="变量名"><s:propertyvalue="#变量名"</s:iterator>

基于cookie使用过滤器实现客户每次访问自登陆一次

相信大家在各大网站都会遇到,登录时,在登录框出现下次免登陆/一个月免登陆的类似选项,本次博文就是讲解如何实现,在这记录一下,也算是做个备忘录合集,如果文中有错,欢迎大家指出 为啥说自登陆一次呢,因为当访问某个页面时,如果第一次自动登录失败时,你下次刷新访问时还再次走自动登录流程,就会出现死循环. 本篇博文代码示例框架为Spring MVC,下面就讲解实现该功能的需要掌握哪些知识:cookies与过滤器 1.cookies 何为Cookies:Cookies为 Web 应用程序保存用户相关信息提供

装在win2000上的tomcat不能被客户机访问

问题描述 以前是没问题的,但服务器被重启一次之后,重新运行tomcat,同一个局域网内的其他客户机就不能访问到服务器上的web应用了.客户机可以PIng通服务器,也可以用网络邻居.远程连接的方式连接上服务器,但就是不能访问tomcat中的web应用.奇怪的是,在服务器上,用服务器的IE去访问tomcat里的web应用却一切正常,tomcat是可以正常打开并使用的.怎么解决好呢?PS. 可以确定客户机的IE里所输入地址和端口是正确无误的   问题补充:<div class="quote_ti

JSP中使用JDBC访问SQL Server 2008数据库示例_JSP编程

由JDBC驱动直接访问数据库 优点:100% Java,快又可跨平台 缺点:访问不同的数据库需要下载专用的JDBC驱动 (1)下载对应数据库版本的jdbc驱动并安装,注意安装后的得到的三个文件msbase.jar,mssqlserver.jar,msutil.jar,将其拷贝到jsp项目的WEB-INF/lib下面,也拷贝到Tomcat安装目录的lib下面,没有具体测试,应该和配置文件有关系. (2)数据源,不需要 (3)配置文件,不需要 (4)写JSP文件测试 <%@ page content

JSP之get方法和post方法的区别

1:提交 表单的方法不同 使用get方法提交表单,请求的参数在请求的头部,可以通过request.getQueryString()方法获取请求参数, 且request.getContentLength()方法返回值为-1:使用post方法提交表单,请求的参数存放在请求体里,所 request.getQueryString方法获取不到请求参数,request.getContentLength()可以获得请求体的长度. 通过get方法提交表单,因为请求表单存放在请求的头部,所以会在浏览器地址栏显示: