分享
 
 
 

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

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

公飞

结合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):

module example {

interface A {

long AOperation(in long ilData);

};

};

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,然后将结果返回,代码如下:

////////////////////////////////////////

// 文件名:apptest_impl.h

#ifndef APPTEST_IMPL_H

#define APPTEST_IMPL_H

#include "apptest_skel.h"

class A_impl:public POA_example::A, PortableServer::RefCountServantBase {

public:

virtual CORBA::Long AOperation(CORBA::Long ilData)

throw(CORBA::SystemException);

};

#endif

//////////////////////////////////////////////////////

// 文件名:apptest_impl.cpp

// 包含CORBA系统类库

#include <STARCORBA.h>

using namespace std;

#include <apptest_impl.h>

// 操作AOperation的实现

CORBA::Long A_impl::AOperation(CORBA::Long ilData)

throw(CORBA::SystemException) {

CORBA::Long ret;

ret = ilData * 2 ;

return ret;

}

3. 编写一个主程序实例化服务对象提供服务

在主程序中,建立CORBA环境,实例化服务对象并注册到名字服务,然后开始等待请求,代码如下(为了):

///////////////////////////////////////////

// 文件名:Server.cpp

#include <stdio.h>

#include <STARCORBA.h>

#include <STARCosNaming.h>

#include <stdlib.h>

#include <errno.h>

#include "apptest_impl.h"

using namespace std;

int main(int argc, char* argv[], char*[]) {

CORBA::ORB_var orb;

orb = CORBA::ORB_init(argc, argv);

CORBA::Object_var nameobj =

orb -> resolve_initial_references("NameService");

CosNaming::NamingContext_var nc =

CosNaming::NamingContext::_narrow(nameobj.in());

CORBA::Object_var poaObj =

orb -> resolve_initial_references("RootPOA");

PortableServer::POA_var rootPOA =

PortableServer::POA::_narrow(poaObj);

PortableServer::POAManager_var manager =

rootPOA -> the_POAManager();

A_impl* AImpl = new A_impl();

PortableServer::ServantBase_var servantA = AImpl;

PortableServer::ObjectId_var Aid =

rootPOA -> activate_object(servantA);

CORBA::Object_var A =

rootPOA -> servant_to_reference(servantA);

CosNaming::Name AName;

AName.length(1);

AName[0].id = CORBA::string_dup("A");

AName[0].kind = CORBA::string_dup("OperationA");

nc -> rebind(AName, A.in());

manager -> activate();

orb -> run();

nc -> unbind(AName);

return EXIT_SUCCESS;

}

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

/*

* AClient.java

*/

package example;

import org.omg.CORBA.*;

import org.omg.CORBA.ORBPackage.InvalidName;

import org.omg.CosNaming.*;

import org.omg.CosNaming.NamingContextPackage.CannotProceed;

import org.omg.CosNaming.NamingContextPackage.NotFound;

/**

* @author 公飞

*/

public class AClient {

public static int opA(int num) throws Exception {

String[] args = { "-ORBInitRef",

"NameService=corbaloc:iiop:192.168.60.158:900/NameService" };

ORB orb = ORB.init(args, null);

org.omg.CORBA.Object objRef;

objRef = orb.resolve_initial_references("NameService");

NamingContext ncRef = NamingContextHelper.narrow(objRef);

NameComponent nc = new NameComponent("A", "OperationA");

NameComponent path[] = { nc };

org.omg.CORBA.Object objA;

objA = ncRef.resolve(path);

A a = AHelper.narrow(objA);

int out;

out = a.AOperation(num);

return out;

}

}

JSP文件的代码如下(index.jsp):

<%@ page contentType="text/html;charset=gb2312"%>

<%@ page import = "example.AClient" %>

<html>

<head>

<title>Hello JSP CORBA Client</title>

</head>

<body>

3*2=<%=AClient.opA(3)%>

</body>

</html>

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有