加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 教程 > 正文

JSP作为顾客方访问CORBA服务内容

发布时间:2023-05-20 13:52:19 所属栏目:教程 来源:
导读:结合j2ee和corba可以充分利用两者的优点建立性能更好功能更强的应用系统,例如可以使用c++实现的corba对象作为业务处理构件,形成高性能业务逻辑层,在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):
 
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应用,然后就可以通过浏览器访问了。
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!