Oracle8i 中CORBA组件的开发和使用
本篇文章来源与时代朝阳数据库(原晓通数据库)培训部Oracle 资料库。
CORBA是由对象管理组织(OMG)所制订的分布式应用开发标准,Oracle8i提供了对CORBA的支持,而且开发方法及过程非常简单。本篇文章详细介绍如何开发Oracle8i
CORBA应用,包括以下内容:
l
CORBA的特征;
l
CORBA的开发步骤;
l
实现CORBA服务器组件
l
实现CORBA应用
l
使用JDeveloper开发CORBA应用。
CORBA表示公共对象请求代理结构(Common Object Request
Broker Architecture),它结合了最初制订该标准的各厂商的共同想法,并指定了用于调停和处理分布式对象请求的软件组件 —— 代理(Broker)。
1.
指定了用于定义对象接口的语言 —— IDL(Interface Description Language),并且该语言说明了公用的对象数据、对象可执行的操作以及例外。通过提供IDL,使得开发人员可以使用不同语言来实现CORBA组件。如下图所示:
2. 指定了网络协议 —— IIOP(Internet Inter-ORB Protocol),应用开发人员在不同平台、不同操作系统之间进行跨平台开发。如下图所示:
3.
提供了用于处理对象请求的代理 —— ORB(Object Request Broker),使得处理远程对象请求就象调用本地方法一样。
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组件之后,客户应用就可以访问该组件了。如下图所示:
下面以创建在表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客户应用的方法。如下图所示:
如上图所示,我们将创建四个客户应用,它们将分别实现下述功能:
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”),然后单击“删除”按钮,此后会清空文本框,并完成删除操作。
与手工开发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)
在完成项目的创建工作后,接着会显示如下对话框:
该对话框用于指定CORBA的Java接口,并且该接口用于说明组件对象将要实现的方法。在这里,我们输入“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”,则会编译并运行客户应用,然后显示如下结果:
|