Oracle8i CORBA组件的开发和使用

本篇文章来源与时代朝阳数据库(原晓通数据库)培训部Oracle 资料库。

 

CORBA是由对象管理组织(OMG)所制订的分布式应用开发标准,Oracle8i提供了对CORBA的支持,而且开发方法及过程非常简单。本篇文章详细介绍如何开发Oracle8i CORBA应用,包括以下内容:

 

l         CORBA的特征;

l         CORBA的开发步骤;

l         实现CORBA服务器组件

l         实现CORBA应用

l         使用JDeveloper开发CORBA应用。

CORBA的特征

CORBA表示公共对象请求代理结构(Common Object Request Broker Architecture),它结合了最初制订该标准的各厂商的共同想法,并指定了用于调停和处理分布式对象请求的软件组件 —— 代理(Broker)。

 

1.         指定了用于定义对象接口的语言 —— IDLInterface Description Language),并且该语言说明了公用的对象数据、对象可执行的操作以及例外。通过提供IDL,使得开发人员可以使用不同语言来实现CORBA组件。如下图所示:

 

 

2.         指定了网络协议 —— IIOPInternet Inter-ORB Protocol),应用开发人员在不同平台、不同操作系统之间进行跨平台开发。如下图所示:

 

 

3.         提供了用于处理对象请求的代理 —— ORBObject Request Broker),使得处理远程对象请求就象调用本地方法一样。

CORBA组件的开发步骤

1.         编写IDL代码

 

CORBA的关键因素是实现了语言无关性,并且语言无关性是通过定义对象到外部世界接口的元语言来完成的。IDL正是CORBA用来定义对象接口的语言,它用于说明数据、方法和例外。如下图所示:

2.         转换IDL代码为Java代码

 

在编写了IDL代码之后,接下来应该将IDL代码转换为Java文件,这项任务是通过idl2java工具来完成的。如下图所示:

3.         实现CORBA组件

 

在将IDL代码转换为Java代码之后,接下来就可以CORBA组件了,完成该项任务包括以下几步:

 

l         编写Java代码,实现IDL中的方法。如下图所示:

 

l         编译并打包组件代码。在编写了组件代码之后,编译所有Java源文件,然后打包这些代码。如下图所示:

 

l         装载CORBA组件到Oracle8i数据库。在编译并打包了组件代码之后,就可以将组件代码装载到Oracle8i数据库中了,这项任务是通过loadjava工具来完成的。如下图所示:

 

l         发行CORBA组件。在将CORBA组件代码装载到数据库中后,必须发行CORBA组件,然后客户应用才能访问该组件。如下图所示:

在开发了CORBA组件之后,客户应用就可以访问该组件了。如下图所示:

实现CORBA服务器组件

下面以创建在表AUTHS上执行查询、插入、更新、删除操作的CORBA组件为例,介绍开发CORBA组件的方法。如下图所示:

 

 

 

具体步骤如下:

 

1.         编写IDL代码,清单(author.idl):如下:

 

module author {

  struct AuthorInfo {

    string author_code;   

    string name;

    unsigned short sex;

    double salary;

    string birthdate;

    string entry_date_time;

  };

 

  exception SQLError {

    wstring message;

  };

 

  interface Author {

    AuthorInfo queryAuthor (in string author_code) raises (SQLError);

    void insertAuthor (in AuthorInfo info) raises (SQLError);

    void updateAuthor (in AuthorInfo info) raises (SQLError);

    void deleteAuthor (in string author_code) raises (SQLError);

  };

};

 

2.         转换IDL代码为Java文件

3.         实现CORBA组件

 

1)        编写组件代码,程序清单如下(AuthorImpl.java):

 

       import author.*;

import java.sql.*;

import java.io.*;

import oracle.jdbc.driver.*;

 

public class AuthorImpl

       extends _AuthorImplBase

{

 

  public AuthorInfo queryAuthor (String author_code) throws SQLError {

    /* 使用try ... catch语句抓取并处理例外 */

    try {

      /* 创建缺省的数据库连接 */

      Connection conn = new OracleDriver().defaultConnection();

      /* 构造动态SQL语句 */

      String sql = "SELECT name,sex,salary,birthdate,entry_date_time " +

                    "FROM auths WHERE author_code = ?";

      /* 准备动态SQL语句 */

      PreparedStatement ps = conn.prepareStatement (sql);

      /* 使用try ... catch语句抓取并处理例外 */

      try {

        /* 设置动态参数值 */

               ps.setString (1, author_code);

        /* 获取并处理结果集 */

          ResultSet rset = ps.executeQuery ();

          if (!rset.next ())

            throw new SQLError ("未找到代码为 " + author_code + "的作者!");

          return new AuthorInfo (author_code, rset.getString(1),rset.getShort(2),

                rset.getDouble(3),rset.getString(4),rset.getString(5));

      }

      finally {

          /* 关闭动态SQL语句 */

              ps.close ();

      }

    }

    catch (SQLException e) {

      throw new SQLError (e.getMessage ());

    }

  }

 

  public void insertAuthor (AuthorInfo info) throws SQLError {

    /* 使用try ... catch语句抓取并处理例外 */

    try {

      /* 创建缺省的数据库连接 */

      Connection conn = new OracleDriver().defaultConnection();

      /* 构造动态SQL语句 */

      String sql = "INSERT INTO auths (author_code,name,sex,salary, " +

                    "birthdate,entry_date_time) VALUES(?,?,?,?,?,?) ";

      /* 准备动态SQL语句 */

      PreparedStatement ps = conn.prepareStatement (sql);

      /* 使用try ... catch语句抓取并处理例外 */

      try {

        /* 设置动态参数值 */

          ps.setString (1, info.author_code);

               ps.setString (2, info.name);

        ps.setShort (3, info.sex);

               ps.setDouble (4, info.salary);

        ps.setString (5, info.birthdate);

               ps.setString (6, info.entry_date_time);

        /* 执行动态SQL语句 */

          ps.executeUpdate ();

      }

      finally {

          /* 关闭动态SQL语句 */

              ps.close ();

      }

    }

    catch (SQLException e) {

      throw new SQLError (e.getMessage ());

    }

  }

 

  public void updateAuthor (AuthorInfo info) throws SQLError {

    /* 使用try ... catch语句抓取并处理例外 */

    try {

      /* 创建缺省的数据库连接 */

      Connection conn = new OracleDriver().defaultConnection();

      /* 构造动态SQL语句 */

      String sql = "UPDATE auths SET salary = ? WHERE author_code = ?";

      /* 准备动态SQL语句 */

      PreparedStatement ps = conn.prepareStatement (sql);

      /* 使用try ... catch语句抓取并处理例外 */

      try {

        /* 设置动态参数值 */

               ps.setDouble (1, info.salary);

               ps.setString (2, info.author_code);

        /* 执行动态SQL语句 */

          ps.executeUpdate ();

      }

      finally {

          /* 关闭动态SQL语句 */

              ps.close ();

      }

    }

    catch (SQLException e) {

      throw new SQLError (e.getMessage ());

    }

  }

 

  public void deleteAuthor (String author_code) throws SQLError {

    /* 使用try ... catch语句抓取并处理例外 */

    try {

      /* 创建缺省的数据库连接 */

      Connection conn = new OracleDriver().defaultConnection();

      /* 构造动态SQL语句 */

      String sql = "DELETE FROM auths WHERE author_code = ?";

      /* 准备动态SQL语句 */

      PreparedStatement ps = conn.prepareStatement (sql);

      /* 使用try ... catch语句抓取并处理例外 */

      try {

        /* 设置动态参数值 */

               ps.setString (1, author_code);

        /* 执行动态SQL语句 */

          ps.executeUpdate ();

      }

      finally {

          /* 关闭动态SQL语句 */

              ps.close ();

      }

    }

    catch (SQLException e) {

      throw new SQLError (e.getMessage ());

    }

  }

}

 

2)        编译并打包CORBA组件

 

在编写了组件代码之后,编译所有Java代码,然后打包这些代码。如下所示:

 

 

3)        装载CORBA组件到Oracle8i数据库

 

 

4)        发行CORBA组件

在将CORBA组件装载到Oracle8i数据库后,客户端还不能访问该CORBA组件。只有发行了该组件之后,客户端才能访问该组件。命令如下:

 

实现CORBA应用

下面以开发访问CORBA组件的客户应用为例,介绍开发CORBA客户应用的方法。如下图所示:

 

如上图所示,我们将创建四个客户应用,它们将分别实现下述功能:

 

l          query_author:通过调用queryAuthor方法,检索作者信息。

l          insert_author:通过调用insertAuthor方法,插入作者记录。

l          update_author:通过调用updateAuthor方法,更新作者信息。

l          delete_author:通过调用deleteAuthor方法,删除作者记录。

 

在本小节中,将把这些客户应用开发为Java Applet应用程序,以便将来可以把它们嵌入到浏览器中执行。如果要在浏览器中执行这些应用,那么读者必须熟悉相应浏览器“安全”方面的内容。在这里将不介绍这部分内容,但读者可以通过appletviewer运行这些应用程序。

 

下面是CORBA客户应用的具体实现方法:

 

1.         编写与服务器端完全相同的IDL代码,然后转换这些IDL代码为Java代码。

2.         实现客户应用query_author

 

1)        程序清单(query_author.java

 

/* 导入Java */

import author.*;

 

import oracle.aurora.jndi.sess_iiop.ServiceCtx;

import oracle.aurora.jts.client.AuroraTransactionService;

import oracle.aurora.jts.util.*;

import javax.naming.Context;

import javax.naming.InitialContext;

import java.util.Hashtable;

import java.applet.*;

import java.awt.*;

 

public class query_author extends Applet

{

    /* 声明文本框变量 */

    protected TextField author_code_field;

    /* 声明按钮变量 */

    protected Button query_button;

    /* 声明文本域变量 */

    protected TextArea result_area;

 

    /* 创建用户界面 */

    public void init()

    {

 

       /* 创建面板容器 */

       Panel p1 = new Panel();

       /* 指定面板容器的布局方式 */

       p1.setLayout(new FlowLayout(FlowLayout.LEFT,15,10));

       /* 设置字体 */

       setFont(new Font("宋体", Font.BOLD, 18));

       /*

        * 在面板中放置文本、文本框、按钮

        */

       p1.add(new Label("请输入作者代码"));

       p1.add(author_code_field = new TextField(6));

       p1.add(query_button = new Button("查询"));

       add("North",p1);

 

       /* 创建面板容器 */

       Panel p2 = new Panel();

       /* 指定面板容器的布局方式 */

       p2.setLayout(new FlowLayout(FlowLayout.LEFT,15,10));

       /* 在面板中放置文本区 */

       p2.add(result_area = new TextArea(5,40));

       add("Center",p2);

 

       resize(600,300);

       /* 显示框架 */

       show();

    }

 

    public boolean action(Event evt,Object what) {

 

      /* 单击“查询”按钮,执行以下语句 */

      if(evt.target == query_button) {

 

         /* HTML文件中获取相应参数值:服务名、对象名、用户、口令 */

         String serviceURL = getParameter ("serviceURL");

         String objectName = getParameter ("objectName");

         String user = getParameter ("user");

         String password = getParameter ("password");

 

         try {

           /* 声明Hashtable变量并赋值 */

           Hashtable env = new Hashtable ();

           env.put (Context.URL_PKG_PREFIXES, "oracle.aurora.jndi");

           env.put (Context.SECURITY_PRINCIPAL, user);

           env.put (Context.SECURITY_CREDENTIALS, password);

           env.put (Context.SECURITY_AUTHENTICATION,

                     ServiceCtx.NON_SSL_LOGIN);

           Context ic = new InitialContext (env);

 

           /* 检索CORBA组件 */

           Author author = (Author)ic.lookup (serviceURL + objectName);

 

           /* 声明变量 */

           AuthorInfo info;

      

           /* 清空文本区 */

           result_area.setText("");

           /* 从文本框中取得作者代码 */

           String code = author_code_field.getText();

           /* 根据作者代码检索作者信息 */

           info = author.queryAuthor (code);

           /* 在文本区中显示作者信息 */

           result_area.append("作者代码:" + info.author_code

                                    + "\n作者姓名:" + info.name

                                    +"\n性别:    " + info.sex

                                    +"\n作者工资:" + info.salary

                             + "\n出生日期:" + info.birthdate

                             +"\n录入日期:" + info.entry_date_time);

           /* 清空文本框 */

           author_code_field.setText("");

         }

         catch(Exception e) {}

         return true;

      }

      return false;

  }

}

 

2)        编写HTML文档(query.html

 

<html>

<head>

<title>检索作者信息</title>

</head>

<body>

 

<h2>根据作者代码检索作者信息</h2>

<APPLET codebase="." code="query_author.class"

        width=600 height=250>

   <param name="serviceURL" value="sess_iiop://132.147.120.200:2481:XTDB">

   <param name="objectName" value="/test/author">

   <param name="user" value="aca">

   <param name="password" value="xtgroup">

 

</APPLET>

</body>

</html>

3)        编译客户应用

4)        运行客户应用

 

DOS命令行执行如下命令:

 

appletviewer query.html

 

当执行了上述命令之后,会显示如下图形:

在文本框中输入作者代码(例如“A00001”),单击“查询”按钮,此后会清空文本框,并在文本区中显示查询结果。

 

3.         实现客户应用insert_author

 

1)        程序清单(insert_author.java

 

/* 导入Java */

import author.*;

 

import oracle.aurora.jndi.sess_iiop.ServiceCtx;

import oracle.aurora.jts.client.AuroraTransactionService;

import oracle.aurora.jts.util.*;

import javax.naming.Context;

import javax.naming.InitialContext;

import java.util.Hashtable;

import java.applet.*;

import java.awt.*;

public class insert_author extends Applet

{

    /* 声明文本框变量 */

    protected TextField author_code_field;

    protected TextField name_field;

    protected TextField sex_field;

    protected TextField salary_field;

    protected TextField birthdate_field;

    protected TextField entry_date_time_field;

 

    /* 声明按钮变量 */

    protected Button insert_button;

 

    /* 创建用户界面 */

    public void init()

    {

       /* 创建面板容器 */

       Panel p1 = new Panel();

       /* 指定面板容器的布局方式 */

       p1.setLayout(new FlowLayout(FlowLayout.LEFT,5,10));

       /* 设置字体 */

       setFont(new Font("黑体", Font.BOLD, 16));

       /*

        * 在面板中放置文本、文本框以及按钮

        */

       p1.add(new Label("代码:"));

       p1.add(author_code_field = new TextField(6));

       p1.add(new Label("姓名:"));

       p1.add(name_field = new TextField(8));

       p1.add(new Label("出生日期:"));

       p1.add(birthdate_field = new TextField(10));

       add("North",p1);

 

       /* 创建面板容器 */

       Panel p2 = new Panel();

       /* 指定面板容器的布局方式 */

       p2.setLayout(new FlowLayout(FlowLayout.LEFT,5,10));

       /*

        * 在面板中放置文本、文本框以及按钮

        */

       p2.add(new Label("工资:"));

       p2.add(salary_field = new TextField(6));

       p2.add(new Label("性别:"));

       p2.add(sex_field = new TextField(8));

       p2.add(new Label("录入日期:"));

       p2.add(entry_date_time_field = new TextField(10));

       add("Center",p2);

 

       /* 创建面板容器 */

       Panel p3 = new Panel();

       /* 指定面板容器的布局方式 */

       p3.setLayout(new FlowLayout(FlowLayout.LEFT,5,10));

       /* 面板中放置按钮 */

       p3.add(insert_button = new Button("插入"));

       add("South",p3);

 

       resize(600,300);

       /* 显示框架 */

       show();

    }

 

    public boolean action(Event evt,Object what) {

      /* 单击“插入”按钮时,将执行以下语句 */

      if(evt.target == insert_button) {

 

         /* HTML文件中获取相应参数值:服务名、对象名、用户、口令 */

         String serviceURL = getParameter ("serviceURL");

         String objectName = getParameter ("objectName");

         String user = getParameter ("user");

         String password = getParameter ("password");

 

         try {

           /* 声明Hashtable变量并赋值 */

           Hashtable env = new Hashtable ();

           env.put (Context.URL_PKG_PREFIXES, "oracle.aurora.jndi");

           env.put (Context.SECURITY_PRINCIPAL, user);

           env.put (Context.SECURITY_CREDENTIALS, password);

           env.put (Context.SECURITY_AUTHENTICATION,

                     ServiceCtx.NON_SSL_LOGIN);

           Context ic = new InitialContext (env);

 

           /* 初始化事务服务 */

           AuroraTransactionService.initialize(ic, serviceURL);

 

           /* 检索CORBA组件 */

           Author author = (Author)ic.lookup (serviceURL + objectName);

 

           /* 声明对象,并初始化对象 */

           AuthorInfo info = new AuthorInfo();

 

           /* 将文本框数据赋值给对象成员 */

           info.author_code = author_code_field.getText();

           info.name = name_field.getText();

           info.sex = (short)Integer.parseInt(sex_field.getText());

           info.salary = Double.valueOf(salary_field.getText()).doubleValue();

           info.birthdate = birthdate_field.getText();

           info.entry_date_time = entry_date_time_field.getText();

 

           /* 开始事务 */

           TS.getTS ().getCurrent ().begin ();

           /* 插入数据 */

           author.insertAuthor(info);

           /* 提交事务 */

           TS.getTS ().getCurrent ().commit (true);

           /* 清空文本框 */

           author_code_field.setText("");

           name_field.setText("");

           sex_field.setText("");

           salary_field.setText("");

           birthdate_field.setText("");

           entry_date_time_field.setText("");

         }

         catch(Exception e) {}

         return true;

      }

      return false;

  }

}

 

2)        编写HTML文档(insert.html

 

<html>

<head>

<title>录入作者信息</title>

</head>

<h1>根据提示录入作者信息</h1>

<APPLET codebase="." code="insert_author.class"

        width=600 height=200>

   <param name="serviceURL" value="sess_iiop://132.147.120.200:2481:XTDB">

   <param name="objectName" value="/test/author">

   <param name="user" value="aca">

   <param name="password" value="xtgroup">

</APPLET>

</body>

</html>

 

3)        编译客户应用

 

4)        运行客户应用

 

DOS命令行执行如下命令:

 

appletviewer insert.html

 

当执行了上述命令之后,会显示如下图形:

 

 

首先在各文本框中输入作者信息,然后单击“插入”按钮,此后会清空所有文本框,并完成插入操作。

 

4.         实现客户应用update_author

 

1)        程序清单(update_author.java

 

/* 导入Java */

import author.*;

 

import oracle.aurora.jndi.sess_iiop.ServiceCtx;

import oracle.aurora.jts.client.AuroraTransactionService;

import oracle.aurora.jts.util.*;

import javax.naming.Context;

import javax.naming.InitialContext;

import java.util.Hashtable;

import java.applet.*;

import java.awt.*;

 

public class update_author extends Applet

{

    /* 声明文本框变量 */

    protected TextField author_code_field;

    protected TextField salary_field;

 

    /* 声明按钮变量 */

    protected Button update_button;

 

    /* 创建用户界面 */

    public void init()

    {

       /* 创建面板容器 */

       Panel p1 = new Panel();

       /* 指定面板容器的布局方式 */

       p1.setLayout(new FlowLayout(FlowLayout.LEFT,15,10));

       /* 设置字体 */

       setFont(new Font("宋体", Font.BOLD, 18));

       /*

        * 在面板中放置文本、文本框

        */

       p1.add(new Label("请输入作者代码"));

       p1.add(author_code_field = new TextField(6));

       add("North",p1);

 

       /* 创建面板容器 */

       Panel p2 = new Panel();

       /* 指定面板容器的布局方式 */

       p2.setLayout(new FlowLayout(FlowLayout.LEFT,15,10));

       /*

        * 在面板中放置文本、文本框

        */

       p2.add(new Label("请输入作者工资"));

       p2.add(salary_field = new TextField(6));

       add("Center",p2);

 

       /* 创建面板容器 */

       Panel p3 = new Panel();

       /* 指定面板容器的布局方式 */

       p3.setLayout(new FlowLayout(FlowLayout.LEFT,15,10));

       /* 在面板中放置按钮 */

       p3.add(update_button = new Button("更新"));

       add("South",p3);

 

       resize(600,300);

       /* 显示框架 */

       show();

    }

 

    public boolean action(Event evt,Object what) {

      /* 当单击“更新”按钮时,会执行以下语句 */

      if(evt.target == update_button) {

         /* HTML文件中获取相应参数值:服务名、对象名、用户、口令 */

         String serviceURL = getParameter ("serviceURL");

         String objectName = getParameter ("objectName");

         String user = getParameter ("user");

         String password = getParameter ("password");

 

         try {

           /* 声明Hashtable变量并赋值 */

           Hashtable env = new Hashtable ();

           env.put (Context.URL_PKG_PREFIXES, "oracle.aurora.jndi");

           env.put (Context.SECURITY_PRINCIPAL, user);

           env.put (Context.SECURITY_CREDENTIALS, password);

           env.put (Context.SECURITY_AUTHENTICATION,

                     ServiceCtx.NON_SSL_LOGIN);

           Context ic = new InitialContext (env);

 

 

           /* 初始化事务服务 */

           AuroraTransactionService.initialize(ic, serviceURL);

 

           /* 检索CORBA组件 */

           Author author = (Author)ic.lookup (serviceURL + objectName);

 

           /* 声明对象,并初始化对象 */

           AuthorInfo info = new AuthorInfo();

 

           /* 将文本框数据赋值给对象成员 */

           info.author_code = author_code_field.getText();

           info.salary = Double.valueOf(salary_field.getText()).doubleValue();

           /* 开始事务 */

           TS.getTS ().getCurrent ().begin ();

           /* 更新数据 */

           author.updateAuthor(info);

           /* 提交事务 */

           TS.getTS ().getCurrent ().commit (true);

           /* 清空文本框 */

           author_code_field.setText("");

           salary_field.setText("");

         }

         catch(Exception e) {}

         return true;

      }

      return false;

  }

}

 

2)        编写HTML文档(update.html

 

<html>

<head>

<title>修改作者信息</title>

</head>

<body>

 

<h1>根据提示修改作者信息</h1>

<APPLET codebase="." code="update_author.class"

        width=350 height=200>

   <param name="serviceURL" value="sess_iiop://132.147.120.200:2481:XTDB">

   <param name="objectName" value="/test/author">

   <param name="user" value="aca">

   <param name="password" value="xtgroup">

</APPLET>

</body>

</html>

 

3)        编译客户应用

4)        运行客户应用

 

DOS命令行执行如下命令:

 

appletviewer update.html

 

当执行了上述命令之后,会显示如下图形:

 

 

首先在文本框中输入作者代码及要修改的作者工资,然后单击“更新”按钮,此后会清空所有文本框,并完成更新操作。

 

5.         实现客户应用delete_author

 

1)        程序清单(delete_author.java

 

/* 导入Java */

import author.*;

 

import oracle.aurora.jndi.sess_iiop.ServiceCtx;

import oracle.aurora.jts.client.AuroraTransactionService;

import oracle.aurora.jts.util.*;

import javax.naming.Context;

import javax.naming.InitialContext;

import java.util.Hashtable;

import java.applet.*;

import java.awt.*;

 

public class delete_author extends Applet

{

    /* 声明文本框变量 */

    protected TextField author_code_field;

    /* 声明按钮变量 */

    protected Button delete_button;

    /* 声明文本域变量 */

    protected TextArea sql_message;

 

    /* 创建用户界面 */

    public void init()

    {

       /* 创建面板容器 */

       Panel p1 = new Panel();

       /* 指定面板容器的布局方式 */

       p1.setLayout(new FlowLayout(FlowLayout.LEFT,15,10));

       /* 设置字体 */

       setFont(new Font("宋体", Font.BOLD, 18));

       /*

        * 在面板中放置文本、文本框以及按钮

        */

       p1.add(new Label("请输入作者代码"));

       p1.add(author_code_field = new TextField(6));

       p1.add(delete_button = new Button("删除"));

       add("North",p1);

 

       /* 创建面板容器 */

       Panel p2 = new Panel();

       /* 指定面板容器的布局方式 */

       p2.setLayout(new FlowLayout(FlowLayout.LEFT,15,10));

       /* 在面板中放置文本区 */

       p2.add(sql_message = new TextArea(2,40));

       add("South",p2);

 

       resize(600,300);

       /* 显示框架 */

       show();

    }

 

    public boolean action(Event evt,Object what) {

      if(evt.target == delete_button) {

 

         /* HTML文件中获取相应参数值:服务名、对象名、用户、口令 */

         String serviceURL = getParameter ("serviceURL");

         String objectName = getParameter ("objectName");

         String user = getParameter ("user");

         String password = getParameter ("password");

 

         try {

           /* 声明Hashtable变量并赋值 */

           Hashtable env = new Hashtable ();

           env.put (Context.URL_PKG_PREFIXES, "oracle.aurora.jndi");

           env.put (Context.SECURITY_PRINCIPAL, user);

           env.put (Context.SECURITY_CREDENTIALS, password);

           env.put (Context.SECURITY_AUTHENTICATION,

                     ServiceCtx.NON_SSL_LOGIN);

           Context ic = new InitialContext (env);

 

           /* 初始化事务服务 */

           AuroraTransactionService.initialize(ic, serviceURL);

 

           /* 检索CORBA组件 */

           Author author = (Author)ic.lookup (serviceURL + objectName);

 

           /* 声明对象,并初始化对象 */

           AuthorInfo info = new AuthorInfo();

      

           /* 清空文本区和文本框 */

           sql_message.setText("");

           /* 从文本框中取得作者代码 */

           String code = author_code_field.getText();

           /* 开始事务 */

           TS.getTS ().getCurrent ().begin ();

           /* 更新数据 */

           author.deleteAuthor (code);

           /* 提交事务 */

           TS.getTS ().getCurrent ().commit (true);

 

           /* 清空文本框 */

           author_code_field.setText("");

           sql_message.setText("删除记录成功!");

         }

         catch(Exception e) { }

         return true;

      }

      return false;

  }

}

 

2)        编写HTML文档(delete.html

 

<html>

<head>

<title>删除作者信息</title>

</head>

<body>

 

<h1>根据提示删除作者信息</h1>

<APPLET codebase="." code="delete_author.class"

        width=600 height=200>

   <param name="serviceURL" value="sess_iiop://132.147.120.200:2481:XTDB">

   <param name="objectName" value="/test/author">

   <param name="user" value="aca">

   <param name="password" value="xtgroup">

</APPLET>

</body>

</html>

 

3)        编译客户应用

 

 

4)        运行客户应用

 

DOS命令行执行如下命令:

 

appletviewer delete.html

 

当执行了上述命令之后,会显示如下图形:

 

 

在文本框中输入作者代码(例如“A00021”),然后单击“删除”按钮,此后会清空文本框,并完成删除操作。

使用JDeveloper开发CORBA应用

与手工开发CORBA应用相比,JDeveloper可以快速完成CORBA应用的开发过程。另外,在使用JDeveloper开发CORBA应用时,开发人员将无需编写IDL代码,从而简化了编写CORBA应用的方法。本节以创建用于操纵ARTICLE表的CORBA组件为例,说明使用JDeveloper 2.0开发CORBA组件的方法。如下图所示:

 

 

如上图所示,该CORBA组件将实现以下四个方法:

 

l         queryArticle:该方法将用于检索文章信息。

l         insertArticle:该方法将用于插入文章记录。

l         updateArticle:该方法将用于更新文章信息。

l         deleteArticle:该方法将用于删除文章记录。

 

完成上述任务的方法如下:

 

1.         准备工作

 

1)        选择“File> New Workspace”,创建名称为corba.jws的工作组。如下图所示:

 

 

2)        选择“File>New Project”,此时会启动新项目创建向导,并显示如下对话框:

 

 

该对话框用于选择要创建的项目类型。因为要创建CORBA组件对象,所以选择 Create a Project for a New CORBA Object”。

 

3)        单击“Next”按钮,此时会弹出如下对话框:

 

 

该对话框用于设置项目名称、项目包名以及项目路径。其中,项目名称用于指定项目的名称,在这里我们输入“article”;项目包名用于指定项目所在的子目录,在这里我们删除原有的缺省设置;项目路径用于指定项目所在的目录,在这里通过“Browser”按钮选择“C:\corba”。

 

4)        单击“Next”按钮,此时会显示如下对话框:

 

 

该对话框用于设置项目说明信息。

5)        单击“Next”按钮,此时会显示如下对话框:

 

 

6)        单击“Finish”按钮,这样就完成了项目article的创建过程。

 

2.         编写CORBA组件代码

 

在完成了准备工作之后,接下来将编写CORBA组件代码。方法如下:

 

1)        在完成项目的创建工作后,接着会显示如下对话框:

 

 

该对话框用于指定CORBAJava接口,并且该接口用于说明组件对象将要实现的方法。在这里,我们输入“article.Article”。

 

2)        单击“OK”按钮,这样将会生成CORBA组件框架。如下图所示:

 

 

3)        双击Article.java文件,然后在其中添加接口方法。代码如下:

 

package article;

 

public interface Article extends org.omg.CORBA.Object {

  public String queryArticle(String article_code);

  public void insertArticle(String article_code,String author_code,

    String secrate_level,String pub_date,String title);

  public void updateArticle(String article_code,String secrate_level);

  public void deleteArticle(String article_code);

}

 

4)        选中Article.java,单击鼠标右键,此时会显示如下弹出菜单:

 

 

5)        单击“Generate CORBA Server Classes”,此时会在_example8i_Article.java生成相应的方法代码,双击该文件,并为相应方法添加代码。完成后的_example8i_Article.java代码如下:

 

package article;

import java.sql.*;

import java.io.*;

import oracle.jdbc.driver.*;

 

public class _example8i_Article extends article._ArticleImplBase

implements oracle.aurora.AuroraServices.ActivatableObject {

  public _example8i_Article(java.lang.String name) {

    super(name);

  }

  public _example8i_Article() {

    super();

  }

 

  public org.omg.CORBA.Object _initializeAuroraObject() {

    return this;

  }

 

  public java.lang.String queryArticle( java.lang.String arg0) {

    String articleinfo = new String();

    try {

      Connection conn = new OracleDriver().defaultConnection();

      String sql = "SELECT author_code,secrate_level,pub_date," +

                    "title FROM article WHERE article_code = ?";

      PreparedStatement ps = conn.prepareStatement (sql);

      try {

               ps.setString (1, arg0);

          ResultSet rset = ps.executeQuery ();

          while (rset.next ())

          articleinfo = "作者代码:" + rset.getString(1) + "\n" +

                        "保密级别:" + rset.getString(2) + "\n" +

                        "出版日期:" + rset.getString(3) + "\n" +

                        "文章标题:" + rset.getString(4) + "\n";

        rset.close();

        ps.close();

      }

      catch(SQLException e){

        return e.getMessage();

      }

    }

    catch(SQLException e){

      return e.getMessage();

    }

    return articleinfo;

  }

 

  public void insertArticle( java.lang.String arg0,

    java.lang.String arg1,  java.lang.String arg2,

    java.lang.String arg3,  java.lang.String arg4

  )

  {

    try {

      Connection conn = new OracleDriver().defaultConnection();

      String sql = "INSERT INTO article (article_code,author_code," +

                   "secrate_level,pub_date,title) VALUES(?,?,?,?,?)";

      PreparedStatement ps = conn.prepareStatement (sql);

      try {

               ps.setString (1, arg0);

               ps.setString (2, arg1);

        ps.setString (3, arg2);

               ps.setString (4, arg3);

               ps.setString (5, arg4);

          ps.executeUpdate ();

        ps.close();

      }catch(SQLException e){}

      conn.commit();

    }catch(SQLException e){}

  }

  public void updateArticle(  java.lang.String arg0,

    java.lang.String arg1 )

  {

    try {

      Connection conn = new OracleDriver().defaultConnection();

      String sql = "UPDATE article SET secrate_level = ? " +

                   "WHERE article_code = ?";

      PreparedStatement ps = conn.prepareStatement (sql);

      try {

               ps.setString (1, arg1);

               ps.setString (2, arg0);

          ps.executeUpdate ();

        ps.close();

      }catch(SQLException e){}

      conn.commit();

    }catch(SQLException e){}

  }

 

  public void deleteArticle( java.lang.String arg0 )

  {

    try {

      Connection conn = new OracleDriver().defaultConnection();

      String sql = "DELETE FROM article WHERE article_code = ?";

      PreparedStatement ps = conn.prepareStatement (sql);

      try {

               ps.setString (1, arg0);

          ps.executeUpdate ();

        ps.close();

      }catch(SQLException e){}

      conn.commit();

    }catch(SQLException e){}

  }

}

 

在添加了接口方法和实现接口的代码之后,选择“Project>Make Project article.jpr”编译Java代码。如果编译成功,则继续下一步;否则修改错误,重新编译。

 

3.         配置并发行CORBA组件

 

在成功地编译了CORBA组件代码之后,为了使用CORBA组件,还必须将该组件装载到Oracle8i数据库,并发行该CORBA组件。方法如下:

 

1)        选择“Project>Deploy>New Profile”,此时会弹出如下对话框:

 

 

该对话框用于指定配置Java类的方式,因为要将CORBA组件装载到Oracle8i数据库,所以选择Deploy CORBA object to Oracle8i”。

 

2)        单击“Next”按钮,此时会弹出如下对话框:

 

 

3)        单击“Next”按钮,此时会弹出如下对话框:

 

 

4)        单击“Next”按钮,此时会弹出如下对话框:

 

 

该对话框用于设置执行配置操作时所需要的类或包,在这里保留缺省设置。

 

5)        单击“Next”按钮,此时会弹出如下对话框:

 

 

该对话框用于指定CORBA对象名和要发行的接口。其中Object Name框用于输入组件对象名,在这里我们输入“/test/article”;Server Class框用于指定实现组件方法的类,在这里通过单击“Browse...”按钮选择“article._example8i_Article”;Helper Class用于指定组件帮助类,在这里通过单击“Browse...”按钮选择“article.ArticleHelper”。

6)        单击“Next”按钮,此时会弹出如下对话框:

 

Source Jar框用于指定打包文件(打包所有已生成的类),在这里我们输入“C:\corba\article.jar”;而Connection则用于指定数据库连接。

 

7)        单击“New”按钮,此时会弹出建立连接对话框,如下图所示:

 

该对话框用于设置连接的相关信息:

 

l          Connection Name:用于指定连接名,在这里我们输入“article”。

l          Username:用于指定数据库用户的名称,在这里我们输入“aca”。

l          Password:用于指定用户的口令,在这里我们输入“xtgroup”。

l          Host ID:用于指定数据库服务器所在机器的网络地址,在这里我们输入“132.147.120.200”。

l          SID:用于指定Oracle实例的名称,在这里我们输入“XTDB”。

l          Port:用于指定监听端口号,在这里我们输入“2481”。

l          Test Connection按钮:用于测试连接信息。

 

8)        单击“OK”按钮,此时的对话框如下所示:

 

 

9)        单击“Next”按钮,此时会显示如下对话框:

 

 

该对话框用于指定配置文件的名称,在这里保留缺省设置。

 

10)     单击“Finish”按钮,此时会显示如下对话框:

 

11)     单击“Yes”,将开始装载并发行CORBA组件对象。如下图所示:

 

 

12)     单击“Done”,这样我们就完成了服务器端CORBA组件的全部开发过程。

 

4.         编写客户端代码验证CORBA组件

 

在配置并发行了CORBA组件之后,应该编写客户应用来验证CORBA组件正确与否。在JDeveloper中完成这项任务十分容易,具体方法如下:

 

1)        选择“File>New”,此时会弹出对话框,切换到“Snippets”页,如下图所示:

 

 

该对话框用于指定要实现的客户应用,在这里我们选择 Example CORBA Client”。

 

2)        单击“OK”按钮,此时会弹出如下对话框:

 

 

在该对话框中生成了CORBA客户应用的框架,另外,通过单击“Parameters...”按钮还可以修改相应的参数设置。

 

3)        单击“Parameters”,此时会弹出如下对话框:

 

 

该对话框用于指定CORBA应用的相应参数:

 

l          Name of Class:用于指定Java类的名称,在这里我们输入“Client”。

l          CORBA Java Interface:用于指定服务器端的CORBA接口名,在这里我们输入“article.Article”。

l          Host Name:用于指定CORBA组件所在机器的网络地址,在这里我们输入“132.147.120.200”。

l          Port Number:用于指定监听端口号,在这里我们输入“2481”。

l          Service:用于指定Oracle服务的名称,在这里我们输入“XTDB”。

l          Published Name:用于指定所发行的CORBA组件名,在这里我们输入“test/article”。

l          Username:用于指定数据库用户名,在这里我们输入“aca”。

l          Password:用于指定数据库用户的口令,在这里我们输入“xtgroup”。

 

4)        单击“OK”按钮,此时的对话框如下图所示:

 

 

5)        单击“OK”按钮,这样就生成了客户应用的框架。双击“Client.java”,然后编写相应的验证代码:

 

l         首先找到以下注释:

// Method calls go here!

    // e.g.

    // System.out.println(corbaInterface.foo());

 

l         然后在此处编写如下的验证代码(删除开头的package ;):

 

/* 插入一条记录 */

corbaInterface.insertArticle("ME20","A00001","2","16-JUN-99"

          ,"如何防治CIH病毒");

/* 更新记录 */

corbaInterface.updateArticle("ME20","3");

/* 显示记录信息 */

System.out.println(corbaInterface.queryArticle("ME20"));

/* 删除记录 */

corbaInterface.deleteArticle("ME20");

 

l         选中“Client.java”,单击鼠标右键,此时会显示如下弹出菜单:

 

 

l         选择“Run”,则会编译并运行客户应用,然后显示如下结果: