レッスン 3 クライアントアプレットの開発


このレッスンでは、CORBA クライアントアプレット作成の基本を学びます。このプログラミング作業の多くは、アプリケーションの作成に必要な作業と同じです。 主な違いは、アプレットコードが main() ではなく init() の中にあるという点です。 このレッスンの手順は次のとおりです。

  1. 基本設定
  2. ORB オブジェクトの作成
  3. Hello サーバの検索
  4. sayHello() オペレーションの呼び出し
  5. Hello World アプレットのコンパイルと実行

完成した 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() メソッドの宣言

次のように、標準的な init() メソッドを宣言します。

  public void init()
  {
    // Add the try-catch block here in the next step.
  }

CORBA システム例外の処理

どの 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", "");

この文は、ncid フィールドに「Hello」を設定し、kind フィールドに空白文字列を設定します。

Hello オブジェクトへのパスには要素が 1 つしかないので、nc から単一要素の配列を作成します。NamingContext.resolve() メソッドには、作業用に配列が必要です。

      NameComponent path[] = {nc};

最後に、ネームサービスの resolve() メソッドに NameComponent 配列を渡して Hello サーバへのオブジェクト参照を取得し、その参照を Hello オブジェクトにナロー変換します。

      Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));

ここで、HelloHelper クラスが機能します。上に示したように、ネームサービスの検出時に resolve() メソッドは、一般的な CORBA オブジェクトを返します。このため、即座に Hello オブジェクトにナロー変換することができます。このオブジェクトは、残りの作業を実行するのに必要なオブジェクト参照です。

HelloApplet.java を保存します。

sayHello() オペレーションの呼び出し

CORBA の呼び出しは、ローカルオブジェクトでのメソッドの呼び出しに似ています。回線へのパラメータの整列化、サーバ側 ORB へのルーティング、非整列化、サーバメソッドへのアップコールの配置などの複雑な状況を、クライアント側のプログラマは透過的に把握できます。コンパイラの生成したコードがプログラマに代わってさまざまな作業を行うので、CORBA では呼び出しのプログラミングは簡単です

  1. HelloApplet.java が閉じていれば、開きます。

  2. try-catch ブロックの中で、最後の文の直後に、次の呼び出しを記述します。
          message = helloRef.sayHello();
    
  3. 最後に、呼び出しの結果を標準出力に表示します。次のコードを init() メソッドの外側 (ただし、HelloApplet クラスの中) に記述します。
    String message = "";
    
    public void paint(Graphics g)
    {
      g.drawString(message, 25, 50);
    }
    
  4. HelloApplet.java を保存して閉じます。

Hello World アプレットのコンパイルと実行

HelloApplet を実行するには、いくつかのサーバファイルを新規に作成する必要があります。これらのファイルは、[Path_to_JDK]/docs/guide/idl/tutorial/applet にあります。必要に応じてコピーして、プロジェクトディレクトリを作成します。

Windows のユーザの方は、このマニュアルのパスのスラッシュ (/) をバックスラッシュ (\) に置き換えてください。

アプレットの設定

  1. Applet という名前のプロジェクトディレクトリを新規に作成します。

  2. HelloApplet.java ファイルを Applet ディレクトリにコピーします。

  3. HelloServer.classHelloServant.classTutorial.html の 3 ファイルを [Path_to_JDK]/docs/guide/idl/tutorial/applet から Applet ディレクトリへコピーします。

  4. [Path_to_JDK]/docs/guide/idl/tutorial/applet/HelloApp ディレクトリとその内容全体を、Applet ディレクトリにコピーします。

プロジェクトディレクトリは次のようになります。

Applet
 |-HelloApplet.java
 |-HelloServant.class
 |-HelloServer.class
 |-Tutorial.html
 |-HelloApp
    |-_HelloImplBase.class
    |-_HelloStub.class
    |-Hello.class
    |-HelloHelper.class
    |-HelloHolder.class

HTML ファイルの設定

完成したアプレットを表示するために、[Path_to_JDK]/docs/guide/idl/tutorial/applet ディレクトリに Tutorial.html ファイルが準備されています。ただし、このファイルを使うには、いくつかの属性とパラメータを変更する必要があります。

  1. テキストエディタで Tutorial.html を開きます。

  2. APPLET タグの中の CODEBASE 属性の値として、プロジェクトの Applet ディレクトリへのパスを入力します。

  3. 最初の PARAM タグの中の ORBInitialHost の値として、CORBA ネームサーバが実行するマシン (ほとんどの場合は自分のローカルマシン) の名前を入力します。

  4. 2 番目の PARAM タグの中の ORBInitialPort の値として、ネームサーバの操作に使うポートの番号 (このレッスンの例と同じにする場合は 1050) を入力します。

Tutorial.html を保存して閉じます。

クライアントアプレットのコンパイル

  1. 作成した Applet ディレクトリに移動します。

  2. HelloApplet.java に対して Java コンパイラを実行します。
    javac HelloApplet.java
    
  3. ファイルにエラーがあれば、修正してコンパイルし直します。正確に入力するのが難しい場合は、[Path_to_JDK]/docs/guide/idl/tutorial/app ディレクトリからファイルをコピーして使ってもかまいません。

  4. Applet ディレクトリに HelloApplet.class が生成されたことを確認します。

クライアントアプレットの実行

  1. Java IDL ネームサーバを起動します。
    tnameserv -ORBInitialPort 1050 &
  2. Hello サーバを起動します。
    java HelloServer -ORBInitialPort 1050 &
  3. アプレットビューアを起動して、Tutorial.html を表示します。
    appletviewer Tutorial.html

    アプレットビューアのフレームに、次の文字列が表示されます。

    Hello world!!
  4. Netscape Communicator 4.0 以降を使って Tutorial.html をブラウズしても、"Hello world!!" の文字列がブラウザフレームに表示されます。

次のレッスンに進む前に、必ず両方のサーバプロセスを停止させてください。

詳細情報

クライアントの開発
CORBA クライアントのプログラミングに関する問題
例外:システム例外
CORBA のシステム例外の動作と、Java IDL のシステム例外のマイナーコードの詳細な説明
初期化: システムプロパティ
初期化時に ORB に引き渡し可能なプロパティの種類についての説明
ネームサービス
COS ネームサービスの詳細な説明


前のレッスン | 次のレッスン | チュートリアルのホーム | HelloApplet.java
ホーム


Copyright © 1996, 1997 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn. View, CA. 94043-1100 USA., All rights reserved.