第4回 J2EEアプリケーションを構成するコンポーネント

丸山不二夫
稚内北星学園大学学長
(http://www.wakhok.ac.jp/)
2001/6/30
今回の内容

EJBファイルとWARファイルの形式
customerEjb.jarファイルを解凍する
EJBファイルの構造

petstore.warファイルを解凍する
Webコンポーネントの構造
J2EEアプリケーション・ファイルに含まれるファイルたち
J2EEアプリケーションの開発
アプリケーション開発のシナリオ

 今回は、すこし回り道になるのですが、EJBコンポーネント・ファイルとWebコンポーネントのWARファイルがどのような構造をしているかを見てみることにしましょう。

 前回と同じく、petstore.earファイルを解凍して取り出したファイルの構造を探ることから始めることにしましょう。

 

 EJBファイルとWARファイルの形式

 *Ejb.jarファイルは、名前から分かるようにJar形式のファイルです。実は、*.warファイルもJar形式のファイルです。このように、それ自身がJar形式のファイルである*.earファイル(J2EEアプリケーション・ファイル)は、内部に同じくJar形式の*Ejb.jarファイル、*.warファイルを含んでいます。このあたりは、ZIPで圧縮したファイルに、さらにZIPで圧縮を加えたというよりは、1つのアプリケーションを構成する性格の異なる複数のファイルたちを1つのアプリケーション・ファイルに束ねたということでしょう。

 余談ですが、JarファイルはZIPファイルだといいましたが、ZIPファイルにはMETA-INFOディレクトリがあるとは限りません。しかし、Jarファイルにはそれが存在します。META-INFOはMETA-INFORMATIONの略で、そのアーカイブ・ファイルの中身に「ついての(meta)」情報を格納します。その意味では、Deployment Descriptorの情報がここに置かれるのは自然なことです。

 

 customerEjb.jarファイルを解凍する

 タマネギの皮をむくように、petstore.earファイルを解凍してcustomerEjb.jarを取り出し、再びcustomerEjb.jarファイルを解凍してみましょう。次のリストはこのEJBファイルに含まれているファイルの一覧です。

./META-INF/ejb-jar.xml
./META-INF/MANIFEST.MF
./com/sun/j2ee/blueprints/customer/account/ejb/Account.class
./com/sun/j2ee/blueprints/customer/account/ejb/AccountEJB.class
./com/sun/j2ee/blueprints/customer/account/ejb/AccountHome.class
./com/sun/j2ee/blueprints/customer/account/ejb/
AccountDAOException.class
./com/sun/j2ee/blueprints/customer/account/ejb/AccountDAO.class
./com/sun/j2ee/blueprints/customer/account/model/AccountModel.class
./com/sun/j2ee/blueprints/customer/util/DatabaseNames.class
./com/sun/j2ee/blueprints/customer/util/CreditCard.class
./com/sun/j2ee/blueprints/customer/util/JNDINames.class
./com/sun/j2ee/blueprints/customer/util/ContactInformation.class
./com/sun/j2ee/blueprints/customer/util/Calendar.class
./com/sun/j2ee/blueprints/customer/util/EJBUtil.class
./com/sun/j2ee/blueprints/customer/util/Debug.class
./com/sun/j2ee/blueprints/customer/util/Address.class
./com/sun/j2ee/blueprints/customer/order/ejb/OrderDAOCS.class
./com/sun/j2ee/blueprints/customer/order/ejb/OrderDAO.class
./com/sun/j2ee/blueprints/customer/order/ejb/Order.class
./com/sun/j2ee/blueprints/customer/order/ejb/OrderDAOException.class
./com/sun/j2ee/blueprints/customer/order/ejb/OrderEJB.class
./com/sun/j2ee/blueprints/customer/order/ejb/UUIDGenerator.class
./com/sun/j2ee/blueprints/customer/order/ejb/OrderDAOSybase.class
./com/sun/j2ee/blueprints/customer/order/ejb/OrderHome.class
./com/sun/j2ee/blueprints/customer/order/ejb/OrderDAOOracle.class
./com/sun/j2ee/blueprints/customer/order/ejb/OrderDAOFactory.class
./com/sun/j2ee/blueprints/customer/order/model/OrderModel.class
./com/sun/j2ee/blueprints/customer/order/model/LineItem.class
./com/sun/j2ee/blueprints/customer/customer/ejb/Customer.class
./com/sun/j2ee/blueprints/customer/customer/ejb/CustomerEJB.class
./com/sun/j2ee/blueprints/customer/customer/ejb/CustomerHome.class
リスト1 customerEjb.jarに含まれるファイルの一覧

 

 EJBファイルの構造

 たくさんのファイルが無秩序に存在しているように見えるかもしれませんが、そうではありません。EJBコンポーネントは、基本的にはEJBとその補助クラス・ファイルから構成されています。1つのEJBは、EJBクラスとリモート・インターフェイスとホーム・インターフェイスの3つのファイルによって定義されます。先のcustomerEjbの例では、Order、Customer、Accountという3つのEJBが含まれています。それぞれの名前を持った3つの定義ファイルが存在していることを確かめてください。このように、1つの*Ejb.jarファイルには複数のEJBが含まれることがあります。画面1の左側のパネルは、それぞれのEJBコンポーネント・ファイルに、複数のEJBが含まれていることを示しています。

画面1 左側のパネルを見ると、EJBコンポーネント・ファイルに、複数のEJBが含まれていることがわかる (クリックすると拡大します)

 EJBは、J2EEの本体といっていいほど大事なものです。ここでは、簡単にしか触れられませんでしたが、EJBとその3つの定義ファイルの役割などについては、別の機会に詳しく説明することになると思います。

 以下に、一般的な形で、EJBファイルの構造をまとめてみました。

EJBコンポーネント・ファイル *.Ejb.jar
  EJBクラス *.class
リモート・インターフェイス *.class
ホーム・インターフェイス *.class
  その他のクラス *.class
  <EJB Deployment Descriptor> *.xml
表1 EJB コンポーネントの構造

 EJBコンポーネントに含まれるファイルたちは、どのようにJ2EEサーバに配置されるのでしょう? EJBコンポーネント自身に配置についての詳しい情報が含まれています。表1を見てください。META-INFOディレクトリの下に、ejb-jar.xmlという名前のXMLファイルがありますね。そのファイルが、このコンポーネントにかかわる詳細なDeployment Descriptorの情報を与えています。次に、そのリストの一部を示します。もちろん、petstore.earに含まれる5つの*Ejb.jarファイルすべてについて、このようなDeployment DescriptorがXMLの形式で記述されています。

 ここでは、Order、Customer、Accountという3つのEJBそれぞれについて、ホーム・インターフェイスとリモート・インターフェイスとEJBクラスの3つの定義クラス名が、記述されています。これが表1のクラス・ファイルと対応していることを確認してください。

<?xml version="1.0" encoding="ISO8859_1"?>

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN'
'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>

<ejb-jar>
  <description>These two EJBs (Account and Order) represent a
    cutomer and a customer order. In that these EJBs are dendent
    on each other to complete and manage an order(s)
    we are bundling them together.</description>
    <display-name>Customer Component</display-name>
  <enterprise-beans>
    <entity>
      <description>no description</description>
      <display-name>TheOrder</display-name>
      <ejb-name>TheOrder</ejb-name>
      <home>
        com.sun.j2ee.blueprints.customer.order.ejb.OrderHome
      </home>
      <remote>
        com.sun.j2ee.blueprints.customer.order.ejb.Order
      </remote>
      <ejb-class>
         com.sun.j2ee.blueprints.customer.order.ejb.OrderEJB
      </ejb-class>
      ........
      ........
    </entity>
    <session>
      <description>This is the customer session bean which will be
        a facade for the account and order beans</description>
      <display-name>TheCustomer</display-name>
      <ejb-name>TheCustomer</ejb-name>
      <home>
        com.sun.j2ee.blueprints.customer.customer.ejb.CustomerHome
      </home>
      <remote>
        com.sun.j2ee.blueprints.customer.customer.ejb.Customer
      </remote>
      <ejb-class>
        com.sun.j2ee.blueprints.customer.customer.ejb.CustomerEJB
      </ejb-class>
      ........
      ........
    </session>
    <entity>
      <description>no description</description>
      <display-name>TheAccount</display-name>
      <ejb-name>TheAccount</ejb-name>
      <home>
       com.sun.j2ee.blueprints.customer.account.ejb.AccountHome
      </home>
      <remote>
        com.sun.j2ee.blueprints.customer.account.ejb.Account
      </remote>
      <ejb-class>
         com.sun.j2ee.blueprints.customer.account.ejb.AccountEJB
      </ejb-class>
    ........
    ........
    </entity>
  </enterprise-beans>
  ........
  ........
</ejb-jar>
リスト2 Deployment Descriptorの内容

 

 petstore.warファイルを解凍する

 今度は、petstore.earファイルを解凍してpetstore.warを取り出し、再びこのファイルを解凍してDeployment Descriptorファイルを探してみましょう。このファイルには、300個近いファイルが詰め込まれています。Java Pet Storeデモが、結構大がかりなデモであることが分かると思います。この長大なファイル・リストを示すことはしませんが、ServletからJSP、画像ファイルからHTMLファイルまで、いろんな種類のファイルがこの中にあることが分かります。

./WEB-INF/web.xml
./WEB-INF/tlds/taglib.tld
........
  ........
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/web/
RequestProcessor.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/web/
MainServlet.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/web/
InventoryWebImpl.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/web/
AccountWebImpl.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/web/
CatalogWebImpl.class
........
  ........
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/ejb/
StateHandler.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/ejb/
CartHandler.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/ejb/
AccountHandler.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/ejb/
StateMachine.class
........
  ........
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/event/
CartEvent.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/event/
OrderEvent.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/event/
AccountEvent.class
./WEB-INF/classes/com/sun/j2ee/blueprints/petstore/control/event/
EStoreEvent.class
........
  ........
./images/dogs.gif
./images/dogsHL.gif
./images/logo-topbar.gif
./images/e_checkout.gif
./images/fish.gif
./images/fish1.jpg
........
  ........
./cart.jsp
./changeable_carttable.jsp
./changeaddressform.jsp
./changepreferencesform.jsp
./checkout.jsp
./confirmshippingdata.jsp
./createnewaccount.jsp
./duplicateaccount.jsp
./editaccount.jsp
./signoff.jsp
リスト1 application.xml

 

 Webコンポーネントの構造

 Webコンポーネントは、JSPファイル、Servletのクラス・ファイル、画像データやHTMLを含んでいます。そのほかにJSPの内部で呼び出されるJavaBeansのクラス・ファイルや、JSPのtag定義のクラス・ファイルなどのさまざまなJavaクラスを含むことができます。

Webコンポーネント・ファイル *.war
  JSPファイル *.jsp
サーブレット・クラス *.class
GIFファイル *.gif
HTMLファイル *.html
  その他のJavaクラス *.class
  <Webコンポーネント Deployment Descriptor> *.xml
表2 Webコンポーネントの構造


 

 WebコンポーネントのDeployment Descriptor

 *.warファイルでは、META-INFOではなくWEB-INFOというディレクトリの下に、Web コンポーネントのDeployment Descriptorの情報が見つかります。次のリストは、web.xmlというWeb コンポーネントのDeployment Descriptorファイルの一部です。

<?xml version="1.0" encoding="ISO8859_1"?>

<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN'
'http://java.sun.com/j2ee/dtds/web-app_2.2.dtd'>


<web-app>
  <display-name>WebTier</display-name>
  <description>no description</description>
  <servlet>
    <servlet-name>webTierEntryPoint</servlet-name>
    <display-name>centralServlet</display-name>
    <description>no description</description>
    <servlet-class>
    com.sun.j2ee.blueprints.petstore.control.web.MainServlet
    </servlet-class>
   </servlet>
  <servlet-mapping>
    <servlet-name>webTierEntryPoint</servlet-name>
    <url-pattern>/control/*</url-pattern>
  </servlet-mapping>
  ........
  ........
  ........

</web-app>
リスト1 application.xml

 

 J2EEアプリケーション・ファイルに含まれる
 ファイルたち

 このように、EARファイルに直接含まれるEJBコンポーネント・ファイル、Webコンポーネント・ファイルたちは、その内部にクラス構造を持っています。また、それぞれがその内部にDeployment Descriptor情報を抱えています。こうした形で、J2EEアプリケーション・ファイル *.earには、確かにDeployment用の情報が組み込まれていることが分かりました。

 以下に、J2EEアプリケーション・ファイルに含まれるファイルの一覧を示します。


J2EEアプリケーション・ファイル *.ear

EJBコンポーネント・ファイル *.Ejb.jar
  EJBクラス *.class
リモート・インターフェイス *.class
ホーム・インターフェイス *.class
  その他のクラス *.class
  <EJB Deployment Descriptor> *.xml

Webコンポーネント・ファイル *.war
  JSPファイル *.jsp
サーブレット・クラス *.class
GIFファイル *.gif
HTMLファイル *.html
  その他のJavaクラス *.class
  <Webコンポーネント Deployment Descriptor> *.xml

リソース・アダプタ・ファイル *.rar

J2EEアプリケーション・クライアント・ファイル *.jar
  Javaアプリケーション *.class
<J2EE クライアント Deployment Descriptor> *.xml

<J2EE クライアント Deployment Descriptor> *.xml


 

 J2EEアプリケーションの開発

 これまでは、Java Pet Storeの解説を通じて、基本的には誰かが作ったJ2EEアプリケーションを動かすというJ2EEアプリケーションの利用者の立場でJ2EEを見てきましたが、今度は、J2EEアプリケーションの開発者の立場に立ってみようと思います。いうまでもありませんが、アプリケーションを使うのとアプリケーションを作るのとでは、まったく立場は違います。

 第3回で“deployer”の話をしましたが、J2EEで面白いのは、開発者にもいろいろな層がありうることが想定されていることです。

 J2EE Product Providerは、J2EEコンテナ自身やJ2EE開発ツールを作る開発者です。これは高度な作業で、基本的にはOSベンダやデータベース・ベンダが行う仕事かもしれません。Application Component Providerは、J2EEを構成する基本要素として、さまざまな機能を持つEJBコンポーネントやWebコンポーネントを市場に提供します。今後、日本でもこうしたJ2EEコンポーネント・プロバイダが成長していくでしょう。Application Assemblerは、市場でコンポーネント・プロバイダが提供する部品を調達して、それらを組み合わせてアプリケーションを作成します。

 J2EEアプリケーションを作成するというのは、最終的には、J2EEアプリケーションをパッケージしたEARファイルを作成することです。EARファイルは、基本的にはEJBコンポーネント・ファイルとWebコンポーネント・ファイルから構成されているのはお分かりですね。それでは、EARファイルを構成する、これらのファイルは、どのように作られるのでしょうか? もちろん、それらのファイルの生成にもdeloytoolが使われます。前回見たように、deploytoolで配置可能なファイルはdeploytool自身で作られるのです。

 

 アプリケーション開発のシナリオ

 J2EEアプリケーションを開発するうえで、こうしたJ2EEアプリケーション・ファイルの構成を知っていることが必要です。以下に、J2EEアプリケーション開発の典型的なシナリオでの大まかなステップを記します。

1 開発者は、まず、アプリケーションをWebコンポーネントとEJBコンポーネントの2つの部分に分ける設計をします

2 続いて、それぞれのWebコンポーネント、EJBコンポーネントを構成するソフトウェア部品をコードします

3

出来上がったソフトウェア部品から、Webコンポーネント、EJBコンポーネントを作成します

ここでは、deploytoolを利用することができます。deploytoolのファイル・メニューの[New...]を選んで、WebコンポーネントやEJBコンポーネントの作成ウィジェットを呼び出します(画面2)。部品がそろっていて設計方針が明確であれば、deploytool中のこれらのウィジェットを通じて、WebコンポーネントとEJBコンポーネントの作成は比較的容易です。これらのコンポーネントのDeployment Descriptorは、ウィジェットが自動的に作成します。

画面2 (クリックすると拡大します)

4

Webコンポーネント、EJBコンポーネントから、アプリケーション・ファイルを作成します

ここでも、deploytoolを利用することができます。deploytoolのファイル・メニューの[Add to Application ...] のメニューを選んで、3で作成したコンポーネントを、1つずつアプリケーションに付け加えます(図3)。アプリケーション・ファイルのDeployment Descriptorも自動的に生成されます。

画面3  (クリックすると拡大します)

ここでは、コンポーネント・ファイルの追加に先立って、受け皿としてアプリケーションがあらかじめ必要であることに留意してください。アプリケーションの生成は、先のファイル・メニューの[New...]の中から可能です。

  次回は、単純な、Webコンポーネントを含むJ2EEアプリケーションを実際に開発して、開発ツールとしてのdeploytoolの利用法を見てみたいと思います。

連載内容
J2EEの基礎
  第1回 Java Pet Storeで、J2EEを体験する(1)
  第2回 Java Pet Storeで、J2EEを体験する(2)
 

第3回 J2EEアプリケーションと配置(deployment)

第4回 J2EEアプリケーションを構成するコンポーネント
  第5回 データベースのブラウザを作る
  第6回 EJBにおけるコンテナとコンポーネント
  第7回 J2EEのセキュリティのキホンを知る
  第8回 J2EEのトランザクション処理


連載記事一覧




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間