exteNd Workbench 4.1
コアヘルプ

 

    First Previous Next Last 開発ガイド  05/16/03 09:21:28 

第5章    J2EEアプリケーションクライアントの作成

J2EEアプリケーションクライアントは、ユーザマシンで実行され、J2EEサーバにアクセスする、Javaベースのクライアントを提供するための標準的な方法です。この章では、次を含む独自のJ2EEアプリケーションでJ2EEアプリケーションクライアントを使用する方法について説明します。

 
Top of page

J2EEアプリケーションクライアントの概要

J2EEアプリケーションは一般的にブラウザベースのクライアントを提供しますが、それが常に最適とは限りません。次のような場合は、Javaベースのクライアントを代わりに(または追加に)実装することが必要になります。

J2EEでは、これらのことをJ2EEアプリケーションクライアントを構築することによって行います。

 
Top of section

クライアント機能

次のようないくつかの点において、J2EEアプリケーションクライアントは、ユーザマシン上で実行されるスタンドアロンJavaアプリケーションに似ています。

J2EEアプリケーションクライアントは、次の点で特殊です。

基本アーキテクチャ

J2EEアプリケーションクライアントがJ2EEアプリケーションアーキテクチャ全体にどのように適合するかは、次の図のとおりです。

JACarch

HTTPとJDBCがサポートされている一方、RMI-IIOPは、J2EEアプリケーションクライアントがサーバと通信する一般的な手段であることがわかります。

仕様および青写真

Sunのドキュメントは、J2EEアプリケーションクライアントに関して承認されたソースです。このドキュメントでは、標準の機能、操作、およびライフサイクルだけでなく、それらをサポートしているベンダ要件も定義されています。次を参照してください。

For more information    『Java 2 Platform Enterprise Edition Specification』の第9章「Application Clients」

For more information    『J2EE Blueprints

これらの出版物は、Sun JavaのWebサイト(次を参照)から入手できます。

  
java.sun.com/j2ee/docs.html

 
Top of section

クライアントコンテナ

すべてのJ2EEアプリケーションコンポーネントは、サポートサービスを提供するために1つのコンテナに依存しています。J2EEアプリケーションクライアントは、(少なくとも) JNDI名前空間アクセスを提供するクライアントコンテナによりホストされています。その上、J2EE仕様では、基本的なものから強力なものまで、幅広いクライアントコンテナの実装が可能です。

使用すべきクライアントコンテナに関しては、J2EEサーバベンダにお問い合わせください。たとえば、Novellには、Novell exteNd Application Serverに配備したJ2EEアプリケーションクライアントを実行するためにユーザが呼び出すことのできるSilverJ2EEClientというクライアントコンテナがあります。SilverJ2EEClientでは、次を含むサポートサービスの強力なセットを提供します。

For more information    SilverJ2EEClientの詳細については、Novell exteNd Application Serverコアヘルプの『機能ガイド』を参照してください。

 
Top of section

クライアントのライフサイクル

J2EEアプリケーションクライアントのライフサイクルは複数のフェーズから成り立っており、各フェーズは特定のJ2EEジョブ役割によって処理されます。

フェーズ

関連内容

処理を行う役割

1

クライアントの開発

クライアントのクラスのコーディングおよびコンパイルを実行する

コンポーネントプロバイダ

2

クライアントのパッケージ化

クライアントに対してマニフェストファイルおよび配備記述子ファイルを作成する

すべてのクライアントクラスとその他のファイルを含むアーカイブ(JARファイル)を作成する

コンポーネントプロバイダまたはアプリケーションアセンブラ

3

クライアントの配備

サーバ固有の配備情報を準備し、その情報を使用してクライアントJARをJ2EEサーバに配備する

配備担当者

4

クライアントの実行

ユーザがマシンにクライアントコンテナをインストールできるようにする

ユーザがクライアントコンテナを呼び出し、配備済みのクライアントを起動できるようにする

J2EEサーバで配備済みのクライアントを管理する

配備担当者またはシステム管理者

組織によっては、1人または複数の人がこれらのジョブ役割を果たす場合があります。特に、クライアントクラスを開発するプログラマは、ローカル環境でパッケージ化、配備、および実行を行うことによりクライアントクラスをテストしなければならない場合があります。

 
Top of page

クライアントの開発

J2EEアプリケーションクライアントの開発には、次の操作が含まれます。

  1. クライアントのクラスのコーディング

  2. このようなクラスのコンパイル

 
Top of section

クライアントクラスのコーディング

J2EEアプリケーションクライアントは、1つまたは複数のJavaクラスから構成できます。唯一の要件は、クライアントの実行を開始するために呼び出すことのできるmain()メソッドが1つのクラスに含まれていることです。

クライアントのコーディングでは、Javaで実行可能なあらゆるものがコード化できますが、一般的な目標は、J2EEサーバにアクセスして、通常はEJBセッションBeanを呼び出すことです。コーディングがEJBおよびその他の外部エンティティを参照する場合は、クライアントのJNDI名前空間で定義された名前を使用する必要があります。これにより、配備固有の詳細がクラスに含まれないようにし、外部エンティティが変更された場合でもクライアントコードの変更の必要性が少なくなります。

For more information    EJBの詳細については、 を参照してください。

名前空間セットアップ

クライアントのJNDI名前空間をセットアップするには、クラスを伴う「配備記述子」ファイルを作成する必要があります。このファイルでは、次を参照できるようにする名前を定義します。

For more information    配備記述子ファイルの作成の詳細については、 クライアントのパッケージ化を参照してください。

API使用状況

次の標準Sun APIは、開発するクライアントクラスで使用します。

ベンダ固有のAPIを使用する場合は、クライアントの移植性に影響する可能性があるので注意してください。このようなコードは分離しておき、今後必要になった場合により簡単に置換できるようにします。

例: クライアントクラスのコーディング

この例では、単純なJ2EEアプリケーションクライアントのJavaコード(指定した日付に対して1行の天気予報を表示する)を示します。このコードは、次のことを行うAppClientSampleという単一のクラスから構成されています。

AppClientSample.javaファイルは次のとおりです。

  package com.exsamp.appclient;
  
  import java.io.*;
  import javax.naming.*;
  import javax.rmi.*;
  import javax.swing.*;
  
  import com.exsamp.ejb.*;
  
  
  // The AppClientSample class shows how you can develop a class 
  // for use as a J2EE application client. It includes an example
  // of using an environment entry and bean reference both defined
  // separately in the deployment descriptor. The bean reference 
  // is used to call an EJB session bean on the server.
  
  public class AppClientSample
  {
      
    // Main method, used for application client startup (as
    // specified in the manifest file).
     
    public static void main(String[] args)
    {
      if (args.length < 1) 
      {
        // Make sure all of the required command-line args have
        // been provided to the application client. Otherwise,
        // display an error message and terminate.
        JFrame frame = new JFrame();
        frame.show();
        JOptionPane.showMessageDialog(frame, 
          "Required arguments:\n" + 
          "* Day code (where 0=today, 1=tomorrow, etc.)" +
          "\n\nExample -- for today\qs forecast: 0",
          "Missing Command-Line Arguments", 
          JOptionPane.INFORMATION_MESSAGE);
        System.exit(0);
      }
      else 
      {
        // Get the command-line args so the application client can
        // pass them to the AppClientSample constructor.
        try
        {
          int daycode = Integer.parseInt(args[0]);
          
          // Create an instance of AppClientSample. This executes the 
          // constructor for the class, which calls a particular EJB
          // session bean.
          AppClientSample sample = new AppClientSample(daycode);
        }
        catch (NumberFormatException nfe)
        {
          System.out.println("AppClientSample requires one arg, " +
                             "which must be an integer");
          System.exit(0);
        }
      }
    }    
  
  
    // Constructor for the AppClientSample class. It:
    // * Finds a specific EJB session bean on the server
    // * Calls a method of that session bean
    // * Displays the result returned by that method (if any) 
    //
    // It takes 1 argument: Day code (where 0=today, 1=tomorrow, 
    // etc.)  Example -- for today\qs forecast: 0
    
    public AppClientSample(int daycode)
    {
      try  
      {
        // Find the appropriate EJB session bean on the server.
  
          // Using a bean reference, do a JNDI lookup to return the
          // bean\qs home interface as an Object.
          InitialContext initCtx = new InitialContext();
          Object sbobj = 
                 initCtx.lookup("java:comp/env/ejb/myBean");
  
          // Narrow the Object returned by the lookup to make sure
          // it can be cast to the appropriate type (the class that
          // corresponds to your bean\qs home interface). Then, cast
          // it.
          sbobj = PortableRemoteObject.narrow(sbobj, 
                                              SBMyEJBHome.class);
          SBMyEJBHome sbhome = (SBMyEJBHome)sbobj;
  
          // Call the home object\qs create() method to get an 
          // instance of the bean\qs remote interface. 
          SBMyEJB sbremote = sbhome.create();
  
        // Once you have the remote object, you\qre ready to call
        // business methods of the EJB session bean. (These are
        // the methods exposed by the bean\qs remote interface.)
        String result = sbremote.getMyText(daycode);
  
        // Now look up the value of the application client\qs 
        // environment entry reportTitle.
  
          // Get the application client\qs environment naming 
          // context. Use the InitialContext object created earlier
          // and stored in initCtx.
          Context env = (Context)initCtx.lookup("java:comp/env");
  
          // Get the reportTitle value set by the application
          // client\qs deployer.
          String title = (String)env.lookup("reportTitle");
  
        // Display the result returned from the EJB session
        // bean\qs business method, the title returned from the
        // environment entry lookup, and the value of the passed
        // command-line argument (daycode).
        String day = "";
        switch (daycode)
        {
          case 0:
            day = "today";
            break;
          case 1:
            day = "tomorrow";
            break;
          default:
            day = Integer.toString(daycode) + " days from today";
        }      
        JFrame frame = new JFrame();
        frame.show();
        JOptionPane.showMessageDialog(frame, 
          "The forecast for " + day + " is:\n\n    " +
          result + "\n\n" +
          "Note: forecast obtained from getMyText() method " +
          "of EJB session bean SBMyEJB",
          title, 
          JOptionPane.INFORMATION_MESSAGE);
      }
      catch (Exception e) 
      {
        System.out.println("Application error in AppClientSample");
        e.printStackTrace();
      }
      finally 
      {
        // Now that the application client is all done,
        // make sure the VM terminates.
        System.exit(0);
      }
    }
  }

Workbenchの場合

Novell exteNd WorkbenchでJ2EEアプリケーションクライアントのコーディングを開始するには、次の操作を実行します。

  1. New Projectウィザード([File]>[New Project]の順に選択)を使用して、CAR (Client Archive)プロジェクトを作成します。

    For more information    『ツールガイド』の プロジェクトおよびアーカイブに関する章を参照してください。

  2. クライアントクラスに対してJavaソースファイルを作成します。このファイルを作成して、CARプロジェクトに各ファイルを追加するには、Java Classウィザード([File]>[New]の順に選択)を使用します。

    For more information    『ツールガイド』の コンポーネントウィザードに関する章を参照してください。

  3. JavaエディタでJavaソースファイルを編集します。作業するファイルを開くには、ナビゲーションペインを使用します。

    For more information    『ツールガイド』の ソースエディタに関する章を参照してください。

たとえば、次の図では、CARプロジェクトのAppClientSample.spfが示されています。このプロジェクトはAppClientSample.javaファイルを含んでおり、アーカイブの次の場所にクラスをマップします。

  com/exsamp/appclient

また、このプロジェクトにはMETA-INFディレクトリも含まれています(詳細については、このすぐ後に説明します)。

JACproject

 
Top of section

クライアントクラスのコンパイル

J2EEアプリケーションクライアントに対して開発したクラスをコンパイルすることは、他のJavaクラスをコンパイルする場合と同様です。Sun javacまたは別のJavaコンパイラを使用することが可能です。次を含む必要なものをコンパイラですべて検出できるようにクラスパスを設定することだけが必要です。

Workbenchの場合

Workbenchでは、プロジェクトのファイルのクラスパス要件だけでなく、J2SEパッケージおよびJ2EEパッケージも自動的に処理します。プロジェクトのクラスパスに追加するファイルがさらにある場合は、[Project Settings]ダイアログボックス([Project]>[Project Settings]の順に選択)で追加できます。

たとえば、AppClientSampleクラスは、EJBセッションBean (CARプロジェクトとは無関係)にアクセスします。したがって、AppClientSampleをコンパイルする前に、このBeanのEJBクライアントJARをプロジェクトのクラスパスに追加しなければなりません。

JACclasspath

プロジェクトのクラスパスを設定したら、個々のソースファイルをコンパイルしたり([Project]>[Compile]の順に選択)、すべてをコンパイルするプロジェクトを作成したりする([Project]>[Build]の順に選択)ことができます。

For more information    『ツールガイド』の プロジェクトおよびアーカイブに関する章を参照してください。

 
Top of page

クライアントのパッケージ化

J2EEアプリケーションクライアントのパッケージ化には、次の操作が含まれます。

  1. マニフェストファイルの作成

  2. 配備記述子ファイルの作成

  3. クライアントファイルを含むJARの作成

 
Top of section

マニフェストファイルの作成

マニフェストは、JARファイルまたはその他のアーカイブに関するメタ情報を指定する属性を含むテキストファイルです。クライアントJARの場合、必要となる唯一の属性はMain-Classです。この属性では、クライアントにより実行が開始されたときにmain()メソッドが呼び出されるクライアントクラスを指定できます。

マニフェストファイルは新しい行で終了するようにしてください。

名前および場所

マニフェストファイルには、次のように名前を付ける必要があります。

  MANIFEST.MF

このファイルは、クライアントJARの次のディレクトリにあります。

  META-INF

仕様

Sunのドキュメントは、JARマニフェストとその属性に関して承認されたソースです。

For more information    Java 2 Standard SDKの『JAR File Specification』を参照してください。

Workbenchの場合

マニフェストに対して新しいテキストファイルを作成するには、[File]>[New]の順に選択します。その後、テキストエディタでこのファイルを編集して、CARプロジェクトに追加できます。

たとえば、AppClientSampleプロジェクトのマニフェストファイルは次のようになります。

JACmanifest

このファイルでは、Main-ClassとしてAppClientSampleクラスが指定されています。

  Manifest-Version: 1.0
  Main-Class: com.exsamp.appclient.AppClientSample

 
Top of section

配備記述子ファイルの作成

配備記述子は、クライアントクラスにより参照される外部エンティティを定義するために使用するXMLファイルです。前に説明したように、このようなエンティティには次のものが含まれます。

J2EE 1.3には、「コールバックハンドラ」クラス(ユーザから認証情報を収集するために、クライアントコンテナによって使用されます)を指定するオプションもあります。

名前および場所

配備記述子ファイルには、次のように名前を付ける必要があります。

  application-client.xml

このファイルは、クライアントJARの次のディレクトリにあります。

  META-INF

仕様

J2EEアプリケーションクライアントに対して配備記述子ファイルを作成する場合は、XMLタグの階層として情報を入力します。従うべき形式は、このファイルのSun DTD (Document Type Definition)によって決定されます。

For more information    詳細については、『リファレンス』の J2EE配備記述子DTDに関する章を参照してください。

Workbenchの場合

New Projectウィザード([File]>[New Project]の順に選択)を使用してCARプロジェクトを作成すると、配備記述子ファイルが自動的にセットアップされます。配備記述子を作成する別の方法は、[File]>[New]の順に選択することです。プロジェクトにこのファイルを含めたら、配備記述子エディタでファイルを編集できます。

For more information    『ツールガイド』の章「 配備記述子エディタ」を参照してください。

たとえば、次は、AppClientSampleプロジェクトの配備記述子ファイルです。

JACdepdesc

この配備記述子のXMLソースには、次のものが含まれます。

完全なファイルは次のとおりです。

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE application-client PUBLIC "-//Sun Microsystems, Inc.//DTD J2EE Application
  Client 1.2//EN" "http://java.sun.com/j2ee/dtds/application-client_1_2.dtd">
  <application-client>
     <display-name>AppClientSample</display-name>
     <description>Sample J2EE application client that calls a session bean</description>
     <env-entry>
        <description>Environment entry used to provide report title text to the client
        </description>
        <env-entry-name>reportTitle</env-entry-name>
        <env-entry-type>String</env-entry-type>
     </env-entry>
     <ejb-ref>
        <description>Sample session bean for accessing forecast information</description>
        <ejb-ref-name>ejb/myBean</ejb-ref-name>
        <ejb-ref-type>Session</ejb-ref-type>
        <home>com.exsamp.ejb.SBMyEJBHome</home>
        <remote>com.exsamp.ejb.SBMyEJB</remote>
     </ejb-ref>
  </application-client>

 
Top of section

クライアントJARファイルの作成

J2EEアプリケーションクライアントに対して作成するアーカイブは、次を含む標準のJARファイルです。

Workbenchの場合

CARプロジェクトに対してクライアントJARファイルを作成するには、[Project]>[Build and Archive]の順に選択します。

For more information    『ツールガイド』の プロジェクトおよびアーカイブに関する章を参照してください。

たとえば、AppClientSampleプロジェクトの作成およびアーカイブ操作を実行すると、クライアントJARファイルのAppClientSample.jarが生成され、次のメッセージが表示されます。

JACarchive

 
Top of page

クライアントの配備

J2EEアプリケーションクライアントの配備には、次の操作が含まれます。

  1. J2EEサーバに対する配備情報の作成

  2. そのサーバへのクライアントJARの配備

別の配備方法   この章では、単独のクライアントJARをサーバに直接配備する単純なケースに焦点を当てています。しかし、クライアントJARは、EAR (Enterprise Archive)ファイル内でサーバに配備することにより、完全なJ2EEアプリケーションのコンテキストに含めると有利な場合があります。このようにすると、他のJ2EEモジュールを参照するアプリケーションクライアントに対するサポートがさらに強化されます。

For more information    EARプロジェクトのセットアップの詳細については、『ツールガイド』の プロジェクトおよびアーカイブに関する章を参照してください。

 
Top of section

サーバ固有の配備情報の作成

クライアントJARを配備する場合、通常は、配備に関するサーバ固有の情報を指定する必要があります。この作業には、標準の配備記述子ファイル(application-client.xml)で定義された環境エントリ、EJB参照、およびリソース参照をターゲット環境の実際のエントリにマップすることが含まれます。

この情報を指定する方法は、配備する先のJ2EEサーバのブランドによって異なります。形式は、一般的に、標準の配備記述子と同様にXMLファイルになります。

Workbenchの場合

Workbenchには、CARプロジェクトに対してサーバ固有の配備情報を作成するための次の方法があります。

ターゲットサーバ

操作

Novell exteNd Application Server

File]>[New]の順に選択して、exteNd配備計画ファイルを作成します。その後、配備計画エディタでこのファイルを編集できます。

配備計画は、XMLファイルです。保存するときに、配備計画には任意の名前と場所を指定できます (プロジェクトファイルとともにディスクに保存できますが、アーカイブには追加しないでください)。

プロジェクトに対して配備計画を設定すると、[Project]タブに移動してSPFファイルを右クリックすることにより、後で配備計画を開くことができます。

For more information    『ツールガイド』の章「 配備計画エディタ」を参照してください。

別のJ2EEサーバ

配備情報に対して新しいXMLファイルを作成するには、[File]>[New]の順に選択します。その後、XMLエディタでこのファイルを編集し、サーバで必要な名前および拡張子(通常は.xml)を付けて保存できます。

For more information    特定のJ2EEサーバで必要な配備情報の概要については、『ツールガイド』の アーカイブ配備に関する章を参照してください。

たとえば、AppClientSampleプロジェクトのクライアントJARをNovell exteNd Application Serverに配備するとします。すると、サーバに必要な配備情報を準備するために、AppClientSampleDeplPlan.xmlという配備計画ファイルが作成されます。

JACdepplan

この配備計画に対するXMLソースには、次のものが含まれます。

完全なファイルは次のとおりです。

  <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE carJarOptions PUBLIC "-//SilverStream Software, LLC.//DTD J2EE CAR
  Deployment Plan 1.3//EN" "deploy-car_1_3.dtd">
  <?AgMetaXML 1.0?>
  <carJarOptions isObject="true">
      <carJar isObject="true">
          <version type="String">1.0</version>
          <environmentList isObject="true">
              <environmentEntry isObject="true">
                  <name type="String">reportTitle</name>
                  <value type="String">AppClientSample: Forecast Report</value>
              </environmentEntry>
          </environmentList>
          <beanReferenceList isObject="true">
              <beanReference isObject="true">
                  <name type="String">ejb/myBean</name>
                  <beanLink type="String">sssw://jklobucher81k/RMI/SBMyEJB</beanLink>
              </beanReference>
          </beanReferenceList>
          <usesJars type="StringArray">
              <el>MyEJB-client.jar</el>
          </usesJars>
      </carJar>
  </carJarOptions>

 
Top of section

クライアントJARファイルの配備

クライアントJARおよびサーバ固有の配備情報が準備できたら、J2EEアプリケーションクライアントを配備できます。ターゲットJ2EEサーバに装備されたネイティブ配備ツールを使用したり、Workbench内から配備したりすることが可能です。

Workbenchの場合

Workbenchでは、一般的なさまざまなJ2EEサーバへの配備をサポートしています。配備する方法を指定するには、[Project]>[Deployment Settings]の順に選択します。現在の設定を使用してただちに配備するには、[Project]>[Deploy Archive]の順に選択します。

For more information    『ツールガイド』の アーカイブ配備に関する章を参照してください。

たとえば、AppClientSampleプロジェクトのクライアントJARをNovell exteNd Application Serverに配備するとします。この作業には、アーカイブ操作を配備するために次の配備設定を指定することが含まれます。

JACdepsettings

[Output]ペインのメッセージは、配備のステータスを示します。

JACdepmessages

この場合、結果は、ユーザがNovell exteNd Application Serverからアクセスしてクライアントコンテナ(SilverJ2EEClient)で実行する準備ができているAppClientSampleというJ2EEアプリケーションクライアント配備になります。この配備は、SMC (サーバ管理コンソール)で次のように表示されます。

JACdepsmc

 
Top of page

クライアントの実行

J2EEアプリケーションクライアントの実行には、次の操作が含まれます。

  1. 各ユーザマシンでのクライアントコンテナのインストール

  2. 配備済みのクライアントを開始するためのクライアントコンテナの呼び出し

使用すべきクライアントコンテナ、そのインストール方法、およびその呼び出し方法については、J2EEサーバベンダにお問い合わせください。

For more information    Novell exteNdクライアントコンテナであるSilverJ2EEClientのインストールおよび呼び出しの詳細については、Novell exteNd Application Serverコアヘルプの『機能ガイド』を参照してください。

たとえば、J2EEアプリケーションクライアントのAppClientSampleがNovell exteNd Application Serverに配備されており(前の図を参照)、このクライアントを実行するとします。次のコマンドラインでは、SilverJ2EEClientコンテナが呼び出され、AppClientSampleが起動し、引数(0)がクライアントに渡されます。

  SilverJ2EEClient jklobucher81k AppClientSampleDB AppClientSample 0

この場合、クライアントにより、AppClientSampleクラス(マニフェストで指定されているとおり)のmain()メソッドで実行が開始されます。その後、一部の情報が(EJB、環境エントリ、および渡された引数にアクセスすることにより)取得され、ユーザに表示されます。

JACrun

    First Previous Next Last 開発ガイド  05/16/03 09:21:28 

Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC, a wholly owned subsidiary of Novell, Inc. All rights reserved.