|
開発ガイド 05/16/03 09:21:28 |
J2EEアプリケーションクライアントは、ユーザマシンで実行され、J2EEサーバにアクセスする、Javaベースのクライアントを提供するための標準的な方法です。この章では、次を含む独自のJ2EEアプリケーションでJ2EEアプリケーションクライアントを使用する方法について説明します。
J2EEアプリケーションは一般的にブラウザベースのクライアントを提供しますが、それが常に最適とは限りません。次のような場合は、Javaベースのクライアントを代わりに(または追加に)実装することが必要になります。
J2EEでは、これらのことをJ2EEアプリケーションクライアントを構築することによって行います。
次のようないくつかの点において、J2EEアプリケーションクライアントは、ユーザマシン上で実行されるスタンドアロンJavaアプリケーションに似ています。
J2EEアプリケーションクライアントがJ2EEアプリケーションアーキテクチャ全体にどのように適合するかは、次の図のとおりです。
HTTPとJDBCがサポートされている一方、RMI-IIOPは、J2EEアプリケーションクライアントがサーバと通信する一般的な手段であることがわかります。
Sunのドキュメントは、J2EEアプリケーションクライアントに関して承認されたソースです。このドキュメントでは、標準の機能、操作、およびライフサイクルだけでなく、それらをサポートしているベンダ要件も定義されています。次を参照してください。
『Java 2 Platform Enterprise Edition Specification』の第9章「Application Clients」
これらの出版物は、Sun JavaのWebサイト(次を参照)から入手できます。
java.sun.com/j2ee/docs.html
すべてのJ2EEアプリケーションコンポーネントは、サポートサービスを提供するために1つのコンテナに依存しています。J2EEアプリケーションクライアントは、(少なくとも) JNDI名前空間アクセスを提供するクライアントコンテナによりホストされています。その上、J2EE仕様では、基本的なものから強力なものまで、幅広いクライアントコンテナの実装が可能です。
使用すべきクライアントコンテナに関しては、J2EEサーバベンダにお問い合わせください。たとえば、Novellには、Novell exteNd Application Serverに配備したJ2EEアプリケーションクライアントを実行するためにユーザが呼び出すことのできるSilverJ2EEClientというクライアントコンテナがあります。SilverJ2EEClientでは、次を含むサポートサービスの強力なセットを提供します。
SilverJ2EEClientの詳細については、Novell exteNd Application Serverコアヘルプの『機能ガイド』を参照してください。
J2EEアプリケーションクライアントのライフサイクルは複数のフェーズから成り立っており、各フェーズは特定のJ2EEジョブ役割によって処理されます。
組織によっては、1人または複数の人がこれらのジョブ役割を果たす場合があります。特に、クライアントクラスを開発するプログラマは、ローカル環境でパッケージ化、配備、および実行を行うことによりクライアントクラスをテストしなければならない場合があります。
J2EEアプリケーションクライアントの開発には、次の操作が含まれます。
J2EEアプリケーションクライアントは、1つまたは複数のJavaクラスから構成できます。唯一の要件は、クライアントの実行を開始するために呼び出すことのできるmain()メソッドが1つのクラスに含まれていることです。
クライアントのコーディングでは、Javaで実行可能なあらゆるものがコード化できますが、一般的な目標は、J2EEサーバにアクセスして、通常はEJBセッションBeanを呼び出すことです。コーディングがEJBおよびその他の外部エンティティを参照する場合は、クライアントのJNDI名前空間で定義された名前を使用する必要があります。これにより、配備固有の詳細がクラスに含まれないようにし、外部エンティティが変更された場合でもクライアントコードの変更の必要性が少なくなります。
クライアントのJNDI名前空間をセットアップするには、クラスを伴う「配備記述子」ファイルを作成する必要があります。このファイルでは、次を参照できるようにする名前を定義します。
配備記述子ファイルの作成の詳細については、
クライアントのパッケージ化を参照してください。
次の標準Sun APIは、開発するクライアントクラスで使用します。
Java 2 Platform, Standard Edition SDKのJ2SE API
Java 2 Platform, Enterprise Edition SDKのJ2EE API
ベンダ固有のAPIを使用する場合は、クライアントの移植性に影響する可能性があるので注意してください。このようなコードは分離しておき、今後必要になった場合により簡単に置換できるようにします。
この例では、単純なJ2EEアプリケーションクライアントのJavaコード(指定した日付に対して1行の天気予報を表示する)を示します。このコードは、次のことを行うAppClientSampleという単一のクラスから構成されています。
EJBセッションBeanにアクセスし(配備記述子ファイルで定義されたBean参照を使用して)、そのメソッドの1つを呼び出す
コマンドライン引数、EJBメソッド呼び出し、および環境エントリから取得された値を含むメッセージダイアログボックスを表示する
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);
}
}
}
Novell exteNd WorkbenchでJ2EEアプリケーションクライアントのコーディングを開始するには、次の操作を実行します。
New Projectウィザード([File]>[New Project]の順に選択)を使用して、CAR (Client Archive)プロジェクトを作成します。
『ツールガイド』の
プロジェクトおよびアーカイブに関する章を参照してください。
クライアントクラスに対してJavaソースファイルを作成します。このファイルを作成して、CARプロジェクトに各ファイルを追加するには、Java Classウィザード([File]>[New]の順に選択)を使用します。
『ツールガイド』の
コンポーネントウィザードに関する章を参照してください。
JavaエディタでJavaソースファイルを編集します。作業するファイルを開くには、ナビゲーションペインを使用します。
『ツールガイド』の
ソースエディタに関する章を参照してください。
たとえば、次の図では、CARプロジェクトのAppClientSample.spfが示されています。このプロジェクトはAppClientSample.javaファイルを含んでおり、アーカイブの次の場所にクラスをマップします。
com/exsamp/appclient
また、このプロジェクトにはMETA-INFディレクトリも含まれています(詳細については、このすぐ後に説明します)。
J2EEアプリケーションクライアントに対して開発したクラスをコンパイルすることは、他のJavaクラスをコンパイルする場合と同様です。Sun javacまたは別のJavaコンパイラを使用することが可能です。次を含む必要なものをコンパイラですべて検出できるようにクラスパスを設定することだけが必要です。
Workbenchでは、プロジェクトのファイルのクラスパス要件だけでなく、J2SEパッケージおよびJ2EEパッケージも自動的に処理します。プロジェクトのクラスパスに追加するファイルがさらにある場合は、[Project Settings]ダイアログボックス([Project]>[Project Settings]の順に選択)で追加できます。
たとえば、AppClientSampleクラスは、EJBセッションBean (CARプロジェクトとは無関係)にアクセスします。したがって、AppClientSampleをコンパイルする前に、このBeanのEJBクライアントJARをプロジェクトのクラスパスに追加しなければなりません。
プロジェクトのクラスパスを設定したら、個々のソースファイルをコンパイルしたり([Project]>[Compile]の順に選択)、すべてをコンパイルするプロジェクトを作成したりする([Project]>[Build]の順に選択)ことができます。
『ツールガイド』の
プロジェクトおよびアーカイブに関する章を参照してください。
J2EEアプリケーションクライアントのパッケージ化には、次の操作が含まれます。
マニフェストは、JARファイルまたはその他のアーカイブに関するメタ情報を指定する属性を含むテキストファイルです。クライアントJARの場合、必要となる唯一の属性はMain-Classです。この属性では、クライアントにより実行が開始されたときにmain()メソッドが呼び出されるクライアントクラスを指定できます。
マニフェストファイルは新しい行で終了するようにしてください。
マニフェストファイルには、次のように名前を付ける必要があります。
MANIFEST.MF
このファイルは、クライアントJARの次のディレクトリにあります。
META-INF
Sunのドキュメントは、JARマニフェストとその属性に関して承認されたソースです。
Java 2 Standard SDKの『JAR File Specification』を参照してください。
マニフェストに対して新しいテキストファイルを作成するには、[File]>[New]の順に選択します。その後、テキストエディタでこのファイルを編集して、CARプロジェクトに追加できます。
たとえば、AppClientSampleプロジェクトのマニフェストファイルは次のようになります。
このファイルでは、Main-ClassとしてAppClientSampleクラスが指定されています。
Manifest-Version: 1.0 Main-Class: com.exsamp.appclient.AppClientSample
配備記述子は、クライアントクラスにより参照される外部エンティティを定義するために使用するXMLファイルです。前に説明したように、このようなエンティティには次のものが含まれます。
J2EE 1.3には、「コールバックハンドラ」クラス(ユーザから認証情報を収集するために、クライアントコンテナによって使用されます)を指定するオプションもあります。
配備記述子ファイルには、次のように名前を付ける必要があります。
application-client.xml
このファイルは、クライアントJARの次のディレクトリにあります。
META-INF
J2EEアプリケーションクライアントに対して配備記述子ファイルを作成する場合は、XMLタグの階層として情報を入力します。従うべき形式は、このファイルのSun DTD (Document Type Definition)によって決定されます。
詳細については、『リファレンス』の
J2EE配備記述子DTDに関する章を参照してください。
New Projectウィザード([File]>[New Project]の順に選択)を使用してCARプロジェクトを作成すると、配備記述子ファイルが自動的にセットアップされます。配備記述子を作成する別の方法は、[File]>[New]の順に選択することです。プロジェクトにこのファイルを含めたら、配備記述子エディタでファイルを編集できます。
『ツールガイド』の章「
配備記述子エディタ」を参照してください。
たとえば、次は、AppClientSampleプロジェクトの配備記述子ファイルです。
<?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>
J2EEアプリケーションクライアントに対して作成するアーカイブは、次を含む標準のJARファイルです。
CARプロジェクトに対してクライアントJARファイルを作成するには、[Project]>[Build and Archive]の順に選択します。
『ツールガイド』の
プロジェクトおよびアーカイブに関する章を参照してください。
たとえば、AppClientSampleプロジェクトの作成およびアーカイブ操作を実行すると、クライアントJARファイルのAppClientSample.jarが生成され、次のメッセージが表示されます。
J2EEアプリケーションクライアントの配備には、次の操作が含まれます。
別の配備方法 この章では、単独のクライアントJARをサーバに直接配備する単純なケースに焦点を当てています。しかし、クライアントJARは、EAR (Enterprise Archive)ファイル内でサーバに配備することにより、完全なJ2EEアプリケーションのコンテキストに含めると有利な場合があります。このようにすると、他のJ2EEモジュールを参照するアプリケーションクライアントに対するサポートがさらに強化されます。
EARプロジェクトのセットアップの詳細については、『ツールガイド』の
プロジェクトおよびアーカイブに関する章を参照してください。
クライアントJARを配備する場合、通常は、配備に関するサーバ固有の情報を指定する必要があります。この作業には、標準の配備記述子ファイル(application-client.xml)で定義された環境エントリ、EJB参照、およびリソース参照をターゲット環境の実際のエントリにマップすることが含まれます。
この情報を指定する方法は、配備する先のJ2EEサーバのブランドによって異なります。形式は、一般的に、標準の配備記述子と同様にXMLファイルになります。
Workbenchには、CARプロジェクトに対してサーバ固有の配備情報を作成するための次の方法があります。
|
ターゲットサーバ |
操作 |
|---|---|
|
Novell exteNd Application Server |
[File]>[New]の順に選択して、exteNd配備計画ファイルを作成します。その後、配備計画エディタでこのファイルを編集できます。 配備計画は、XMLファイルです。保存するときに、配備計画には任意の名前と場所を指定できます (プロジェクトファイルとともにディスクに保存できますが、アーカイブには追加しないでください)。 プロジェクトに対して配備計画を設定すると、[Project]タブに移動してSPFファイルを右クリックすることにより、後で配備計画を開くことができます。
|
|
別のJ2EEサーバ |
配備情報に対して新しいXMLファイルを作成するには、[File]>[New]の順に選択します。その後、XMLエディタでこのファイルを編集し、サーバで必要な名前および拡張子(通常は.xml)を付けて保存できます。
|
たとえば、AppClientSampleプロジェクトのクライアントJARをNovell exteNd Application Serverに配備するとします。すると、サーバに必要な配備情報を準備するために、AppClientSampleDeplPlan.xmlという配備計画ファイルが作成されます。
この配備計画に対するXMLソースには、次のものが含まれます。
このJ2EEアプリケーションクライアントによって使用される各環境エントリに対して詳細が指定された<environmentList>タグ
reportTitle環境エントリに対してランタイム時に使用する値を指定するこのリスト内の1つの<environmentEntry>タグ
このJ2EEアプリケーションクライアントによって使用される各EJB参照に対して詳細が指定された<beanReferenceList>タグ
ランタイム時にアクセスするためにEJB参照ejb/myBeanを配備済みのEJBセッションBeanのJNDI名(およびサーバホスト)にマップするこのリスト内の1つの<beanReference>タグ
ランタイム時にサーバからユーザマシンにクライアントJARとともにダウンロードされる追加のJARファイルをリストする<usesJars>タグ
参照するEJBセッションBeanにアクセスするためにクライアントで必要なEJBクライアントJARファイルを指定するこのリスト内の1つの<el>タグ
<?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>
クライアントJARおよびサーバ固有の配備情報が準備できたら、J2EEアプリケーションクライアントを配備できます。ターゲットJ2EEサーバに装備されたネイティブ配備ツールを使用したり、Workbench内から配備したりすることが可能です。
Workbenchでは、一般的なさまざまなJ2EEサーバへの配備をサポートしています。配備する方法を指定するには、[Project]>[Deployment Settings]の順に選択します。現在の設定を使用してただちに配備するには、[Project]>[Deploy Archive]の順に選択します。
『ツールガイド』の
アーカイブ配備に関する章を参照してください。
たとえば、AppClientSampleプロジェクトのクライアントJARをNovell exteNd Application Serverに配備するとします。この作業には、アーカイブ操作を配備するために次の配備設定を指定することが含まれます。
[Output]ペインのメッセージは、配備のステータスを示します。
この場合、結果は、ユーザがNovell exteNd Application Serverからアクセスしてクライアントコンテナ(SilverJ2EEClient)で実行する準備ができているAppClientSampleというJ2EEアプリケーションクライアント配備になります。この配備は、SMC (サーバ管理コンソール)で次のように表示されます。
J2EEアプリケーションクライアントの実行には、次の操作が含まれます。
使用すべきクライアントコンテナ、そのインストール方法、およびその呼び出し方法については、J2EEサーバベンダにお問い合わせください。
Novell exteNdクライアントコンテナであるSilverJ2EEClientのインストールおよび呼び出しの詳細については、Novell exteNd Application Serverコアヘルプの『機能ガイド』を参照してください。
たとえば、J2EEアプリケーションクライアントのAppClientSampleがNovell exteNd Application Serverに配備されており(前の図を参照)、このクライアントを実行するとします。次のコマンドラインでは、SilverJ2EEClientコンテナが呼び出され、AppClientSampleが起動し、引数(0)がクライアントに渡されます。
SilverJ2EEClient jklobucher81k AppClientSampleDB AppClientSample 0
この場合、クライアントにより、AppClientSampleクラス(マニフェストで指定されているとおり)のmain()メソッドで実行が開始されます。その後、一部の情報が(EJB、環境エントリ、および渡された引数にアクセスすることにより)取得され、ユーザに表示されます。
|
開発ガイド 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.