The Ja-Jakarta ProjectTomcat Servlet/JSP コンテナ

リンク

ユーザガイド

リファレンス

Tomcat開発

Tomcat5 サーブレット/JSP コンテナ

JNDI リソース HOW-TO

Printer Friendly Version
印刷用
バージョン
はじめに

Tomcat 5 は、その下で動作する Web アプリケーションに対して JNDI InitialContext の実装を提供します。この実装は、 Java2 Enterprise Edition アプリケーションサーバで提供される JNDI の実装と互換性があります。 この InitialContext 内のエントリは $CATALINA_HOME/conf/server.xml ファイルで設定され、 アプリケーションの Web アプリケーション配備記述子 (/WEB-INF/web.xml)の以下の要素で参照できます。

  • <env-entry> - 環境エントリ。 アプリケーションがどのように動作するかを設定するのに使用できる、 単独の値を持つパラメータ。
  • <resource-ref> - リソース参照。 主として JDBC DataSource や JavaMail Session など、 Tomcat 5 内に設定されたカスタムオブジェクトファクトリに対するリソース参照。
  • <resource-env-ref> - リソース環境参照。 Servlet 2.4 で追加された resource-ref の新たなバリエーション。 認証情報が不要なリソースの設定が簡単にできます。

InitialContext は、Web アプリケーションが最初に配備されたときに設定され、 Web アプリケーションコンポーネントから (読み込み専用で) 利用できるようになります。 すべての設定されたエントリとリソースは、JNDI 名前空間の java:comp/env の下に置かれます。したがってリソース - この場合 JDBC DataSource - への典型的なアクセスは以下のようになります。

// 環境ネーミングコンテキストを取得
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");

// データソースを検索
DataSource ds = (DataSource)
  envCtx.lookup("jdbc/EmployeeDB");

// 接続をプールから割り当てて使用する
Connection conn = ds.getConnection();
... この接続をデータベースアクセスに使用 ...
conn.close();

JNDI のプログラミング API や、サービスを提供するために Tomcat がエミュレートしている Java2 Enterprise Edition (J2EE) サーバでサポートする機能に関するより詳しい情報は、以下の仕様を参照してください。

JNDI リソースの設定

利用可能な各 JNDI リソースは、$CATALINA_HOME/conf/server.xml ファイルに以下の要素を含めることで設定できます。

  • <Environment> - JNDI InitialContext を通じて Web アプリケーションに公開するスカラ値の環境エントリの名前と値を設定します (Web アプリケーション配備記述子に含める <env-entry> 要素と同等)。
  • <Resource> - アプリケーションで利用できるようにリソースの名前とデータ型を設定します (Web アプリケーション配備記述子に含める <resource-ref> 要素と同等)。
  • <ResourceParams> - リソースファクトリの実装に使われる Java クラス名と、 リソースファクトリの設定に使われる JavaBean のプロパティを設定します。
  • <ResourceLink> - グローバル JNDI コンテキストで定義されたリソースへのリンクを追加します。

これらの要素は、 <Context> 要素 (特定の Web アプリケーションだけに関連付けられる)内や、 <DefaultContext> 要素(自動的に配備されるアプリケーションのデフォルト設定として使われる) 内の入れ子として、 いくつ入っていてもかまいません。

さらに、Web アプリケーション配備記述子 (/WEB-INF/web.xml) の中に含まれているすべての <env-entry> 要素の名前と値は初期コンテキスト内で同様に設定されます。 その際、conf/server.xml で対応する値は、対応する <Environment> 要素で (override 属性を "true" にセットすることによって) 許可されている時 だけ 上書きされます。

グローバルリソースは、サーバ全体の JNDI コンテキストの中で定義されます。 <Server> 要素の子要素である <GlobalNamingResources> に、上記の resource 要素を追加することによって定義されます。

Tomcat 標準リソースファクトリ

Tomcat 5 には一連の標準リソースファクトリがあり、 Web アプリケーションへのサービスの提供も可能ですが、 それ以上に、 Web アプリケーションや配備記述子の修正なしに、 ($CATALINA_HOME/conf/server.xml での) 柔軟な設定を実現します。 標準リソースファクトリの設定と使い方については、以下の各節で詳しく述べます。

Tomcat 5 で独自のカスタムリソースファクトリのクラスを作成・インストール・設定・使用する方法に関する情報は カスタムリソースファクトリの追加 を参照してください。

注意 - 標準リソースファクトリのうち、 他のプラットフォームでも利用可能であることが義務づけられているのは、 「JDBC データソース」と「ユーザトランザクション」のファクトリだけで、 しかもこれらが必要なのは、プラットフォームが Java2 Enterprise Edition (J2EE) 仕様を実装する場合のみです。他のすべての標準リソースファクトリ、 および独自に作成したカスタムリソースファクトリは Tomcat 固有のものであり、 他のコンテナで使えるかどうかはわかりません。

汎用 JavaBean リソース

0. はじめに

このリソースファクトリは、標準 JavaBeans 命名規約 (つまり引数のないコンストラクタがあり、setFoo() 形式の命名パターンに沿ったプロパティセッタがある) に従った あらゆる Java クラスのオブジェクトの作成に使用できます。 リソースファクトリは、エントリの lookup() が行われるたびに適切な bean クラスの新しいインスタンスを作成します。

この機能を利用するために必要な手順を以下に示します。

1. JavaBean クラスの作成

リソースファクトリが検索されるたびにインスタンス化される JavaBean クラスを作成します。この例では、com.mycompany.MyBean クラスを以下のように作成すると仮定します。

package com.mycompany;

public class MyBean {

  private String foo = "Default Foo";

  public String getFoo() {
    return (this.foo);
  }

  public void setFoo(String foo) {
    this.foo = foo;
  }

  private int bar = 0;

  public int getBar() {
    return (this.bar);
  }

  public void setBar(int bar) {
    this.bar = bar;
  }


}

2. リソースに必要なものの定義

次に、この bean の新しいインスタンスをリクエストする JNDI 名を定義するために、 Web アプリケーション配備記述子 (/WEB-INF/web.xml) を修正します。 一番簡単なのは、<resource-env-ref> 要素を使う方法で、 以下のように行います。

<resource-env-ref>
  <description>
    MyBean インスタンスのためのオブジェクトファクトリ
  </description>
  <resource-env-ref-name>
    bean/MyBeanFactory
  </resource-env-ref-name>
  <resource-env-ref-type>
    com.mycompany.MyBean
  </resource-env-ref-type>
</resource-env-ref>

警告 - 要素の順序が Web アプリケーション配備記述子の DTD で要求されたとおりであることを確認してください! 詳細は、 Servlet 仕様 を参照してください。

3. このリソースを使うコードをアプリケーションに記述

このリソース環境参照の典型的な使い方は、以下のようになるでしょう。

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");

writer.println("foo = " + bean.getFoo() + ", bar = " +
               bean.getBar());

4. Tomcat のリソースファクトリの設定

Tomcat のリソースファクトリを設定するには、この Web アプリケーションの Context 要素内で入れ子になった (あるいは <Host> または <Engine> 要素内のDefaultContext 要素内で入れ子になった)、 以下のような要素を $CATALINA_HOME/conf/server.xml ファイルに追加します。

<Context ...>
  ...
  <Resource name="bean/MyBeanFactory" auth="Container"
            type="com.mycompany.MyBean"/>
  <ResourceParams name="bean/MyBeanFactory">
    <parameter>
      <name>factory</name>
      <value>org.apache.naming.factory.BeanFactory</value>
    </parameter>
    <parameter>
      <name>bar</name>
      <value>23</value>
    </parameter>
  </ResourceParams>
  ...
</Context>

リソース名 (ここでは bean/MyBeanFactory) が Web アプリケーション配備記述子で指定された値と一致していなければならないことに注意してください。 また、bar プロパティの値の初期化も行っており、それにより 新しい bean が返される前に setBar(23) が呼び出されます。 foo プロパティは (初期化可能でしたが) 初期化していないので、 bean ではコンストラクタでセットアップする何らかのデフォルト値が入ることでしょう。

JavaMail セッション

0. はじめに

多くの Web アプリケーションにおいて、 システムの機能として電子メールメッセージの送信が必要となります。 Java Mail API は、 比較的簡単にこういった処理を実現しますが、設定の詳細の多くを クライアントアプリケーションが知っている必要があります (メッセージ送信に使う SMTP ホスト名もその一つです)。

Tomcat 5 には、 javax.mail.Session のセッションインスタンスを作成する標準リソースファクトリがあります。 このセッションインスタンスは server.xml で設定された SMTP サーバに既に接続されています。この方法で、 アプリケーションは電子メールサーバ環境設定の変更から完全に分離されます - アプリケーションはいつでも必要なときに、 あらかじめ設定されたセッションを要求して受け取るだけです。

必要な手順の概要を以下で説明します。

1. リソースに必要なものを定義

まず最初にしなければいけないのは、あらかじめ設定されたセッションを検索する JNDI 名を定義するために、Web アプリケーション配備記述子 (/WEB-INF/web.xml) を修正することです。 慣例に従えば、こうした名前はすべて、mail サブコンテキスト (提供されるすべてのリソースファクトリのルートである標準の java:comp/env ネーミングコンテキストの下位にある) に属すべきです。 典型的な web.xml のエントリは以下のようになるでしょう。

<resource-ref>
  <description>
    電子メールメッセージを送信するのに使われる javax.mail.Session
    インスタンスのファクトリへのリソース参照。
    適切な SMTP サーバへ接続するようにあらかじめ設定されています。
  </description>
  <res-ref-name>
    mail/Session
  </res-ref-name>
  <res-type>
    javax.mail.Session
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>

警告 - 要素の順序が Web アプリケーション配備記述子の DTD で要求されたとおりであることを確認してください! 詳細は、 Servlet 仕様 を参照してください。

2. このリソースを使うコードをアプリケーションに記述

このリソース環境参照の典型的な使い方は、以下のようになるでしょう。

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
Session session = (Session) envCtx.lookup("mail/Session");

Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(request.getParameter("from"));
InternetAddress to[] = new InternetAddress[1];
to[0] = new InternetAddress(request.getParameter("to"));
message.setRecipients(Message.RecipientType.TO, to);
message.setSubject(request.getParameter("subject"));
message.setContent(request.getParameter("content"), "text/plain");
Transport.send(message);

アプリケーションでは、Web アプリケーション配備記述子で定義されたものと同じリソース参照名を使うことに注意してください。 これは、以下で示す $CATALINA_HOME/conf/server.xml で定義されるリソースファクトリと一致してなければなりません。

3. Tomcat のリソースファクトリの設定

Tomcat のリソースファクトリを設定するには、この Web アプリケーションの Context 要素内で入れ子になった (あるいは <Host> または <Engine> 要素内のDefaultContext 要素内で入れ子になった)、 以下のような要素を $CATALINA_HOME/conf/server.xml ファイルに追加します。

<Context ...>
  ...
  <Resource name="mail/Session" auth="Container"
            type="javax.mail.Session"/>
  <ResourceParams name="mail/Session">
    <parameter>
      <name>mail.smtp.host</name>
      <value>localhost</value>
    </parameter>
  </ResourceParams>
  ...
</Context>

リソース名 (ここでは mail/Session) が Web アプリケーション配備記述子で指定された値と一致していなければならないことに注意してください。 mail.smtp.host パラメータの値は、実際のネットワークで SMTP サービスを提供しているサーバを指すようにカスタマイズしてください。

サンプルアプリケーション

Tomcat に付属している /examples アプリケーションには、 このリソースファクトリを利用しているサンプルがあります。 このアプリケーションには "JSP Examples" リンクからアクセスできます。 実際にメールメッセージを送信しているサーブレットのソースコードは、 /WEB-INF/classes/SendMailServlet.java にあります。

警告 - デフォルトの設定では、localhost の 25 番ポートで SMTP サーバが接続要求を受付けていることを想定しています。 このケースに当てはまらない場合は、$CATALINA_HOME/conf/server.xml ファイルを編集し、mail.smtp.host パラメータの値を実際のネットワークの SMTP サーバのホスト名に修正してください。

JDBC データソース

0. はじめに

アプリケーションで必要な機能をサポートするために、多くの Web アプリケーションは JDBC ドライバ経由でデータベースにアクセスする必要があります。 そのため、J2EE プラットフォーム仕様では、J2EE アプリケーションサーバは、DataSource 実装 (すなわち JDBC 接続の接続プール) を使えるようにする必要があります。Tomcat 5 はまさしく同様のサポートを提供するので、このサービスを使って Tomcat で開発した、データベースを利用するアプリケーションは、変更なしにどの J2EE サーバでも動かすことができるでしょう。

JDBC についての情報は、以下を参考にして下さい。

注意 - Tomcat でのデフォルトのデータソースサポートは、 Jakarta Commons サブプロジェクトの DBCP 接続プールに基づいています。 けれども、後ほど 説明するカスタムリソースファクトリを自分で作成することにより、 javax.sql.DataSource を実装する他の接続プールも利用できます。

1. JDBC ドライバのインストール

JDBC データソース JNDI リソースファクトリを使うには、 適切な JDBC ドライバを Tomcat 内部クラスと Web アプリケーションの両方で利用可能にする必要があります。 これを実現するには、ドライバの JAR ファイル (複数の場合もあり) を $CATALINA_HOME/common/lib ディレクトリ以下にインストールするのが一番簡単です。そうすればドライバは、 リソースファクトリとアプリケーションの両方から利用可能となります。

2. リソースに必要なものを定義

次に、あらかじめ設定されたデータソースを検索する JNDI 名を定義するために、Web アプリケーション配備記述子 (/WEB-INF/web.xml) を修正します。 慣例に従えば、こうした名前はすべて、jdbc サブコンテキスト (提供されるすべてのリソースファクトリのルートである標準の java:comp/env ネーミングコンテキストの下位)に属すべきです。 典型的な web.xml のエントリは以下のようになるでしょう。

<resource-ref>
  <description>
    java.sql.Connection インスタンスのためのファクトリへの
    リソース参照。server.xml ファイルで設定された、特定の
    データベースと接続するのに使われます。
  </description>
  <res-ref-name>
    jdbc/EmployeeDB
  </res-ref-name>
  <res-type>
    javax.sql.DataSource
  </res-type>
  <res-auth>
    Container
  </res-auth>
</resource-ref>

警告 - 要素の順序が Web アプリケーション配備記述子の DTD で要求されたとおりであることを確認してください! 詳細は、 Servlet 仕様 を参照してください。

3. このリソースを使うコードをアプリケーションに記述

このリソース環境参照の典型的な使い方は、以下のようになるでしょう。

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)
  envCtx.lookup("jdbc/EmployeeDB");

Connection conn = ds.getConnection();
... データベースアクセスでこの接続を使用 ...
conn.close();

アプリケーションでは、Web アプリケーション配備記述子で定義されたものと同じリソース参照名を使うことに注意してください。 これは、以下で示す $CATALINA_HOME/conf/server.xml で定義されるリソースファクトリと一致してなければなりません。

4. Tomcat のリソースファクトリの設定

Tomcat のリソースファクトリを設定するには、この Web アプリケーションの Context 要素内で入れ子になった (あるいは <Host> または <Engine> 要素内のDefaultContext 要素内で入れ子になった)、 以下のような要素を $CATALINA_HOME/conf/server.xml ファイルに追加します。

<Context ...>
  ...
  <Resource name="jdbc/EmployeeDB" auth="Container"
            type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/EmployeeDB">
    <parameter>
      <name>username</name>
      <value>dbusername</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>dbpassword</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>org.hsql.jdbcDriver</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:HypersonicSQL:database</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>8</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>4</value>
    </parameter>
  </ResourceParams>
  ...
</Context>

リソース名 (ここでは jdbc/EmployeeDB) が Web アプリケーション配備記述子で指定した値と一致していなければならないことに注意してください。

この例では、HypersonicSQL データベースの JDBC ドライバを使用していると仮定しています。 driverClassNamedriverName パラメータをそれぞれ実際に使用するデータベースの JDBC ドライバと接続 URL に合わせてカスタマイズしてください。

Tomcat の標準データソースリソースファクトリ (org.apache.naming.factory.DbcpDataSourceFactory) の設定プロパティは、以下のようになります。

  • driverClassName - 使用される JDBC ドライバの完全修飾 Java クラス名。
  • maxActive - プールから同時に割り当てられるアクティブインスタンスの最大数。
  • maxIdle - プール内で同時にアイドルにしておける接続の最大数。
  • maxWait - プールが例外を投げるまでに、 (利用可能な接続がない場合に) 接続を返されるのを待つ最大ミリ秒。
  • password - JDBC ドライバに渡されるデータベースのパスワード。
  • url - JDBC ドライバに渡される接続 URL。 (下位互換性のために、driverName プロパティも認識します。)
  • user - JDBC ドライバに渡されるデータベースのユーザ名。
  • validationQuery - アプリケーションに返される前に、 接続が有効かどうか確認するのに、プールが使用する SQL クエリ。 指定されている場合、このクエリは少なくとも 1 行を返す SQL SELECT 文でなければなりません。
カスタムリソースファクトリの追加

もし標準リソースファクトリに要件を満たすものがなければ、 独自のファクトリを実装し Tomcat 5 に組み込み、conf/server.xml 設定ファイルでそのファクトリの利用方法を設定できます。 以下の例においては、前述の 汎用 JavaBean リソースの例から、com.mycompany.MyBean Bean の作り方だけを知っているファクトリを作成します。

1. リソースファクトリクラスの実装

JNDI サービスプロバイダである javax.naming.spi.ObjectFactory インタフェースを実装するクラスを作成しなければいけません。 Web アプリケーションがこのファクトリと紐づいたコンテキストエントリへの lookup() を呼出すたびに、以下の引数で getObjectInstance() メソッドが呼出されます。

  • Object obj - オブジェクト作成時に使われる、 場所および参照の情報を含むオブジェクト (null の可能性あり)。 Tomcat では、これは常に javax.naming.Reference 型のオブジェクトで、このファクトリクラスのクラス名や、 返値のオブジェクトを作成するのに使う (conf/server.xml からの) 設定プロパティが含まれています。
  • Name name - このファクトリが紐づく名前で、 nameCtx をベースとします。 名前を指定しないときは null
  • Context nameCtx - 指定された name パラメータのベースとなるコンテキスト。name がデフォルトの初期コンテキストをベースとする場合は null
  • Hashtable environment - このオブジェクトを作成するのに使われる環境 (null の可能性あり)。 Tomcat オブジェクトファクトリでは通常は無視される。

MyBean インスタンスの生成方法を知るリソースファクトリを作成するには、 以下のようなクラスを作ればいいでしょう。

package com.mycompany;

import java.util.Enumeration;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.NamingException;
import javax.naming.RefAddr;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;

public class MyBeanFactory implements ObjectFactory {

  public Object getObjectInstance(Object obj,
      Name name, Context nameCtx, Hashtable environment)
      throws NamingException {

      // 指定の bean クラスのインスタンスを取得
      MyBean bean = new MyBean();

      // 属性にしたがい bean のプロパティをカスタマイズ
      Reference ref = (Reference) obj;
      Enumeration addrs = ref.getAll();
      while (addrs.hasMoreElements()) {
          RefAddr addr = (RefAddr) addrs.nextElement();
          String name = addr.getType();
          String value = (String) addr.getContent();
          if (name.equals("foo")) {
              bean.setFoo(value);
          } else if (name.equals("bar")) {
              try {
                  bean.setBar(Integer.parseInt(value));
              } catch (NumberFormatException e) {
                  throw new NamingException("Invalid 'bar' value " + value);
              }
          }
      }

      // カスタマイズしたインスタンスを返す
      return (bean);

  }

}

この例では、無条件に com.mycompany.MyBean クラスの新しいインスタンスを作成し、このファクトリを設定する <ResourceParams> 要素 (以下を参照) に含まれているパラメータに基づいてプロパティに設定を行います。 factory という名前のパラメータはすべてスキップされることに注意して下さい。 このパラメータは、bean に設定されるパラメータではなく、 ファクトリクラスそのものの名前 (この場合は com.mycompany.MyBeanFactory) を指定するのに使います。

ObjectFactory に関するより詳しい情報は、 JNDI 1.2 Service Provider Interface (SPI) 仕様 を参照してください。

このクラスをコンパイルするには、クラスパスに $CATALINA_HOME/common/lib$CATALINA_HOME/server/lib ディレクトリ内のすべての JAR ファイルが含まれている必要があります。それが完了している場合は、 ファクトリクラス (と対応する bean クラス) を展開した状態で $CATALINA_HOME/common/classes 以下に置くか、もしくは JAR ファイルとして $CATALINA_HOME/common/lib 内に置いてください。 こうすれば、必要なクラスファイルが Catalina 内部リソースと Web アプリケーションの両方から見えるようになります。

2. リソースに必要なものを定義

次に、この bean の新しいインスタンスをリクエストする JNDI 名を定義するために Web アプリケーション配備記述子 (/WEB-INF/web.xml) を修正します。 一番簡単なのは以下のように <resource-env-ref> 要素を使う方法です。

<resource-env-ref>
  <description>
    MyBean インスタンスのためのオブジェクトファクトリ。
  </description>
  <resource-env-ref-name>
    bean/MyBeanFactory
  </resource-env-ref-name>
  <resource-env-ref-type>
    com.mycompany.MyBean
  </resource-env-ref-type>
<resource-env-ref>

警告 - 要素の順序が Web アプリケーション配備記述子の DTD で要求されたとおりであることを確認してください! 詳細は、 Servlet 仕様 を参照してください。

3. このリソースを使うコードをアプリケーションに記述

このリソース環境参照の典型的な使い方は、以下のようになるでしょう。

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");

writer.println("foo = " + bean.getFoo() + ", bar = " +
               bean.getBar());

4. Tomcat でのリソースファクトリの定義

Tomcat のリソースファクトリを設定するには、この Web アプリケーションの Context 要素内で入れ子になった (あるいは <Host> または <Engine> 要素内の DefaultContext 要素内で入れ子になった)、 以下のような要素を $CATALINA_HOME/conf/server.xml ファイルに追加します。

<Context ...>
  ...
  <Resource name="bean/MyBeanFactory" auth="Container"
            type="com.mycompany.MyBean"/>
  <ResourceParams name="bean/MyBeanFactory">
    <parameter>
      <name>factory</name>
      <value>com.mycompany.MyBeanFactory</value>
    </parameter>
    <parameter>
      <name>bar</name>
      <value>23</value>
    </parameter>
  </ResourceParams>
  ...
</Context>

リソース名 (ここでは bean/MyBeanFactory) が Web アプリケーション配備記述子で指定した値と一致していなければならないことに注意してください。 また、bar プロパティの値の初期化も行っており、それにより 新しい bean が返される前に setBar(23) が呼び出されます。 foo プロパティは (初期化可能でしたが) 初期化していないので、 bean ではコンストラクタでセットアップする何らかのデフォルト値が入ることでしょう。

また、アプリケーション開発者としての観点で言えば、リソース環境参照の定義や、 新しいインスタンスを要求するのに使われているプログラミングは、 汎用 JavaBean リソース の例で使われている方法と同じであることにも注意して下さい。 これは、機能性をカプセル化するために JNDI リソースを使う利点の一つを具体的に示しています。 つまり 互換性のある API を維持している限り、 リソースを使ってアプリケーションを修正しなくても、 内部の実装を変更できます。


[訳注: この文書は鰈崎 義之が翻訳し、 高橋 達男が校正しました。 日本語訳に対するコメントがあれば、report@jajakarta.orgに送って下さい。]
Copyright © 1999-2003, Apache Software Foundation