このレッスンでは、CORBA クライアントアプレット作成の基本を学びます。このプログラミング作業の多くは、アプリケーションの作成に必要な作業と同じです。主な違いは、アプレットコードが main() ではなく init() の中にあるという点です。 このレッスンの手順は次のとおりです。
完成した HelloApplet.java ファイルを見るには HelloApplet.java をクリックしてください。
基本設定
CORBA クライアントアプレットの骨格は他の多くのアプレットと同じです。つまり、必要なライブラリパッケージをインポートし、アプレットクラスを宣言し、 init() メソッドを定義し、例外の処理を行います。
必要なライブラリパッケージのインポート
テキストエディタを起動して、HelloApplet.java という名前の新しいファイルをプロジェクトディレクトリに保存します。
クライアントクラスに必要なパッケージをインポートします。
// The package containing our stubs. import HelloApp.*; // HelloClient will use the naming service. import org.omg.CosNaming.*; // The package containing special exceptions thrown by the name service. import org.omg.CosNaming.NamingContextPackage.*; // All CORBA applications need these classes. import org.omg.CORBA.*; // Needed for the applet. import java.awt.Graphics;
次のように、アプレットクラスを宣言します。
public class HelloApplet extends java.applet.Applet { // Put the init() method here in the next step. }
次のように、標準的な init() メソッドを宣言します。
public void init() { // Add the try-catch block here in the next step. }
どの CORBA プログラムでも、実行時に CORBA システム例外が発生する可能性があるので、init() 関数の機能は、すべて try-catch ブロック内に記述します。CORBA プログラムは、呼び出しに伴うプロセス (整列化、非整列化、アップコール) で問題が発生すると、システム例外を発生させます。
このレッスンの例外ハンドラは簡単なもので、どのような問題が起こったかが分かるように、例外の名前とスタックトレースを標準出力 (Java コンソール) に表示します。
init() の中に、次の try-catch ブロックを記述します。
try{ // Add all further HelloApplet code here. } catch(Exception e) { System.out.println("HelloApplet exception: " + e); e.printStackTrace(System.out); }
ファイルを保存します。
ORB オブジェクトの作成
整列化と IIOP の作業をすべて行うために、CORBA クライアントはローカルの ORB オブジェクトを必要とします。各クライアントは、org.omg.CORBA.ORB オブジェクトのインスタンスを生成してから、ORB にそのオブジェクト自体に関する特定の情報を渡すことにより、そのオブジェクトを初期化します。
HelloApplet.java が閉じている場合は、ここで開きます。
try-catch ブロックの中で、ORB 変数を宣言して初期化します。
Properties props = new Properties(); props.put("org.omg.CORBA.ORBInitialPort", "1050"); ORB orb = ORB.init(this, props);
ORB の init() メソッドの呼び出しはアプレットに引き渡されるので、実行時に特定のプロパティを設定できます。ここでは、HelloServer に適切に接続されるように、ORBInitialPort プロパティを 1050 に設定しました。
ここで必ずファイルを保存してください。
Hello サーバの検索
これでアプレットが ORB を備えたので、アプレットは必要なサービスの検索を ORB に要請できます。このレッスンでは、このサービスは Hello サーバです。CORBA クライアントが初期オブジェクト参照を得る方法は数多くありますが、このレッスンのクライアントアプレットでは、OMG により定義され Java IDL の一部として実装されている COS ネームサービスを利用します。
初期ネーミングコンテキストの取得
ネームサービスを利用するための最初のステップは、初期ネーミングコンテキストの取得です。try-catch ブロックの中で、ORB の初期化の次に、orb.resolve_initial_references() を呼び出してネームサービスへのオブジェクト参照を取得します。
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
文字列 NameService は、すべての CORBA ORB に対して定義されています。この文字列を引き渡すと、ORB からネームサービスへのオブジェクト参照であるネーミングコンテキストオブジェクトが返されます。
オブジェクト参照のナロー変換
CORBA のどのオブジェクト参照とも同様に、objRef は汎用の CORBA オブジェクトです。これを NamingContext オブジェクトとして使うには、適切な型にナロー変換する必要があります。前の文の直後に narrow() の呼び出しを追加します。
NamingContext ncRef = NamingContextHelper.narrow(objRef);
これは、idltojava から生成されるヘルパークラスの使用方法です。このクラスの機能は HelloHelper の機能に似ています。ここで ncRef オブジェクトは org.omg.CosNaming.NamingContext になったので、これを使ってネームサービスにアクセスし、他のサービスを検索することができます。次のステップで、その処理を行います。
ネーミング内のサービスの検索
名前の構造は、ネームサービスの実装の方法によって異なります。そのため CORBA ネームサーバでは、NameComponent オブジェクトを利用して複雑な名前を取り扱います。1 つの NameComponent には、オブジェクトのフルネームの一部分 (要素) が入ります。NameComponent オブジェクトの配列によって、コンピュータファイルやディスクシステム上のオブジェクトへの完全なパスを指定できます。
Hello サーバを検索するには、まず Hello サーバを識別する文字列を格納するための NameComponent が必要です。narrow() の呼び出しの直後に、次のコードを追加します。
NameComponent nc = new NameComponent("Hello", "");
この文は、nc の id フィールドに 「Hello」を設定し、kind フィールドに空白文字列を設定します。
NamingContext.resolve() メソッドには、作業用に配列が必要です。Hello オブジェクトへのパスには要素が 1 つしかないので、nc から単一要素の配列を作成します。
NameComponent path[] = {nc};
最後に、ネームサービスの resolve() メソッドに NameComponent 配列を渡して Hello サーバへのオブジェクト参照を取得し、その参照を Hello オブジェクトにナロー変換します。
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
ここで、HelloHelper クラスが機能します。ネームサービス自体を検索したときと同様に、resolve() メソッドから汎用の CORBA オブジェクトが返されるので、オブジェクト参照をこれ以降の作業を実行するために必要な Hello オブジェクトにナロー変換します。
HelloApplet.java を保存します。
sayHello() オペレーションの呼び出し
CORBA の呼び出しは、ローカルオブジェクトでのメソッドの呼び出しに似ています。回線へのパラメータの整列化、サーバ側 ORB へのルーティング、非整列化、サーバメソッドへのアップコールの配置などの複雑な状況を、クライアント側のプログラマは透過的に把握できます。コンパイラの生成したコードがプログラマに代わってさまざまな作業を行うので、CORBA では呼び出しのプログラミングは簡単です
message = helloRef.sayHello();
String message = ""; public void paint(Graphics g) { g.drawString(message, 25, 50); }
HelloApplet を実行するには、いくつかのサーバファイルを新規に作成する必要があります。これらのファイルは、[Path_to_JDK]/docs/guide/idl/tutorial/applet にあります。必要に応じてコピーして、プロジェクトディレクトリを作成します。
Windows のユーザの方は、このマニュアルのパスのスラッシュ (/) をバックスラッシュ (¥) に置き換えてください。
アプレットの設定
プロジェクトディレクトリは次のようになります。
Applet |-HelloApplet.java |-HelloServant.class |-HelloServer.class |-Tutorial.html |-HelloApp |-_HelloImplBase.class |-_HelloStub.class |-Hello.class |-HelloHelper.class |-HelloHolder.class
完成したアプレットを表示するために、[Path_to_JDK]/docs/guide/idl/tutorial/applet ディレクトリに Tutorial.html ファイルが準備されています。ただし、このファイルを使うには、いくつかの属性とパラメータを変更する必要があります。
Tutorial.html を保存して閉じます。
クライアントアプレットのコンパイル
javac HelloApplet.java
tnameserv -ORBInitialPort 1050 &
java HelloServer -ORBInitialPort 1050 &
appletviewer Tutorial.html
アプレットビューアのフレームに、次の文字列が表示されます。
Hello world!!
次のレッスンに進む前に、必ず両方のサーバプロセスを停止させてください。
詳細情報
前のレッスン | 次のレッスン | チュートリアルのホーム | HelloApplet.java
ホーム |