Domino でサーブレットを実行する

サーブレットを記述する

サーブレットを記述するには、Java™ コンパイラとサーブレット API が必要です。Java コンパイラとサーブレット API は、どちらも Sun Microsystems 社の Web サイトからダウンロードすることができます。コンパイラと他の基本ツールが用意されている Java Development Kit (JDK) と、サーブレット API 仕様、サーブレット .JAR ファイル (jsdk.jar)、サンプルのサーブレットが用意されている Java Servlet Development Kit (JSDK) をダウンロードしてください。Sun のサイトでは、前述のリンク以外にも、Web 上の他のサーブレットリソースへのリンクがあります。

一般に使用されているさまざまな Java 開発環境を使用してサーブレットを書くこともできます。開発者にとって便利なように、Domino サーバーと Domino Designer のインストールキットには、jsdk.jar のコピーが含まれています。jsdk.jar のコピーは、Sun の JSDK で提供されているファイルと同じ内容です。

注: サーブレットに関連する JAR ファイルの格納場所に関する変更を以下に示します。この JAR ファイルにより、サーブレットをコンパイルするための JSDK.JAR の格納場所が異なります。

Sun は、JDK と JSDK を定期的に更新しています。Domino Designer Release 6 は、JDK 1.3 と JSDK 2.0 をサポートします。Domino 四半期メンテナンスリリース (QMR) には、Sun のアップグレードが組み込まれていることがよくあるため、QMR リリース情報でサポートされている JDK と JSDK のバージョンを確認してください。

Domino のサーブレットサポートを有効にする

サーブレットは、HTTP サーバータスクの一部である Domino Java Servlet Manager によってロードされ、呼び出されます。サーブレットのランタイム Java サポートは、Domino Java Virtual Machine (JVM) が行います。HTTP タスクは、開始されると自動的に Servlet Manager を起動し JVM をロードします。HTTP タスクは、これらの処理のステータスメッセージを、サーバーコンソールとログファイルに書き込みます。

Servlet Manager は、Domino ディレクトリのサーバー文書の設定によって管理されます。その設定は、サーバー文書の [インターネットプロトコル] - [Domino Web Engine] タブにあります。設定項目を以下の表に示します。

設定

オプション(O)

Java サーブレットサポート

なし: (デフォルト) HTTP タスクは Servlet Manager も JVM もロードしません。

Domino Servlet Manager: HTTP タスクは、JVM と Servlet Manager の両方をロードします。

サードパーティのサーブレットサポート: HTTP タスクは JVM をロードしますが、Domino Servlet Manager はロードしません。これにより、IBM® の WebSphere® Application Server のようなサードパーティ製 Servlet Manager の使用が可能になります。

サーブレット URL パス

URL がサーブレットを参照していることを Domino に伝える URL 内のパスです。デフォルトは /servlet です。

クラスパス

Servlet Manager のクラスローダーがサーブレットとその依存クラスを検索する 1 つ以上のパスのリストです。この設定により、パスの追加が可能になります。ディレクトリ、JAR ファイル、ZIP ファイルを指定することもできます。パスは、絶対パスでも Domino のデータディレクトリを基準にした相対パスでもかまいません。デフォルトは domino¥servlet です。

例:

相対ディレクトリパス: domino¥servlet

絶対ディレクトリパス: c:¥apps¥MyServlets

JAR ファイル: c:¥javamail¥mail.jar

ZIP ファイル: domino¥servlet¥sql.zip

サーブレットファイル拡張子

URL がサーブレットを参照していることを Domino に伝える URL ファイル拡張子のリストです。リストの中の各拡張子は、servlets.properties ファイル内のディレクティブによって単一のサーブレットにマッピングされなくてなりません。デフォルトは拡張子なしです。

以下の設定は、Java サーブレット API HttpSession インターフェースに対する Domino Servlet Manager のランタイムサポートを制御します。このインターフェースを使用しないサーブレットは、この設定に影響されません。

注: HttpSession インターフェースサポートは、Domino での「HTTP セッション認証」機能とは完全に分離されています。

設定

オプション

セッション状態トラッキング

有効: (デフォルト) Servlet Manager は、定期的にすべての HttpSession インスタンスのユーザーの使用状況をチェックします。一定期間アイドル状態になったセッションは、自動的に終了されます。Servlet Manager はインスタンスの HttpSession.invalidate() メソッドを呼び出し、セッションの終了をサーブレットに通知します。

無効: セッションが非アクティブであるかどうかはチェックされません。

アイドル状態のセッションのタイムアウト

ユーザーが活動しなくなってから、セッションを終了するまでの待機時間 (分) です。デフォルトは 30 分です。

最大アクティブセッション数

同時にアクティブになれるセッション数。デフォルトは 1,000 セッションです。この制限に達すると、一番長くアイドル状態であったセッションが終了されます。

セッションの保持

有効: HTTP タスクが終了すると、Servlet Manager は Domino のデータディレクトリにある sessdata.ser というディスクファイルにセッションデータを保存します。HTTP タスクが再開すると、このセッションデータが再ロードされます。セッションに結び付けられていたオブジェクトが java.io.Serializable インターフェースを使用する場合、そのオブジェクトも保存されます。

無効: (デフォルト) すべてのセッションデータは、HTTP タスクの終了時に破棄されます。

JVM ローダーを使用してサーブレットクラスをロードする

Servlet Manager のクラスローダーは、ネイティブコードを使用するクラス、カスタムクラスローダーを作成するクラス、またこの他の制限付き操作を実行するクラスをロードしません。サーブレットが Servlet Manager でロードできないクラスを必要とする場合は、Domino JVM クラスローダーを使用してロードしてください。JVM ローダーは通常、Domino と共にインストールされた標準の Java アーカイブ (java.* と lotus.* パッケージ) からクラスをロードします。サーブレットを Servlet Manager クラスパスから JVM クラスパスに移すことにより、強制的に Servlet Manager ローダーではなく JVM ローダーによってサーブレットをロードできます。JVM クラスパスは、NOTES.INI 変数 JavaUserClasses で指定します。

ヒント: さらに、サーブレットに必要なクラスが Domino で供給される LotusXSL.jar ファイルと競合する場合は、NOTES.INI ファイルにクラスをロードすることもできます。サーブレットをロードして実行すると「Verify Error」というメッセージが表示される場合、サーブレットの JAR ファイルを Servlet Manager クラスパスから NOTES.INI ファイルの JavaUserClasses ステートメントに移してみてください。以下に例を示します。
JavaUserClasses=c:¥apps¥MyServlets;c:¥javamail¥mail.jar;domino¥servlet¥sql.zip

サーブレットのプロパティを設定する

個々のサーブレットの特殊なプロパティは、Domino のデータディレクトリにある servlets.properties というテキストファイルで指定できます。次のプロパティの指定方法を説明します。

これらのプロパティは、servlets.properties ファイル内のディレクティブによって指定されます。ディレクティブの一般構文を以下に示します。

servlet(s).<name>.<property>=<value(s)>

ディレクティブには大文字小文字を区別があります。servlets.properties ファイルには、空白行と「#」で始まるコメント行も含めることができます。servlets.properties ファイルはオプションです。サーブレットのプロパティは、デフォルトで、別名なし、初期化引数なし、拡張子マッピングなし、オンデマンドによるサーブレットのロードに設定されます。

サーブレットの別名

別名ディレクティブの構文は次のとおりです。

servlet.<alias-name>.code=<class-name>

以下に例を示します。

servlet.SQLQuery.code=sql.database.query.Servlet

セキュリティのため Domino ではサーブレット URL 内のサーブレット名にピリオド (.) を含めることはできません。これは、悪意のユーザーが Servlet Manager を介して不正な Java パッケージのクラスをロードするのを防止するためです。サーブレットにパッケージ名がある場合は、別名を割り当てる必要があります。前の例では、「sql.database.query.Servlet」というサーブレットを http://acme.com/servlet/SQLQuery?month=june のような URL で起動できるようにします。別名はこの他にも、サーブレットの実際の名前をユーザーから隠したい場合にも有効です。

1 つのサーブレットに複数の別名を割り当てることもできます。Servlet Manager は、各別名を参照する最初の URL を受け取ると、サーブレットの新しいインスタンスを作成します。Servlet Manager は、新しいインスタンスが作成されると、サーブレットの init() メソッドを呼び出します。プロパティファイルの他のディレクティブで別名が使用できるため、インスタンスごとに異なるプロパティを与えることができます。例えば、別名ごとに個別の初期化引数ディレクティブを指定できます。また、複数のインスタンスがされる場合でもサーブレットクラスは一度だけロードされるため、サーブレットのインスタンスは静的クラス変数を使用してデータを共有できます。

セキュリティ機能としてサーブレットの別名を使用すると、サーブレットを、URL のクラス名では直接参照できなくなります。これにより、実際のサーブレット名を非表示にすることができます。

初期化引数

サーブレットの初期データはプロパティファイルで指定できます。サーブレットは、ServletConfig.getInitParameter メソッドを使用してデータにアクセスすることができます。初期化ディレクティブの構文は次の通りです。

servlet.<alias or class name>.initArgs=<name1=value1>,<name2=value2>,...

カンマで区切ることにより、複数の引数を指定できます。以下に例を示します。

servlet.SQLQuery.initArgs=target=db2,user=Domino,cacheSize=30

URL 拡張子マッピング

URL 拡張子マッピングディレクティブの構文は次のとおりです。

servlet.<alias or class name>.extension=<extension> <extension> ...

1 つのサーブレットに複数の拡張子を与えることができます。拡張子同士の間にはスペースを 1 つ置いて分離します。サーバーレコード内の [サーブレットファイル拡張子] 設定の中にも、すべての拡張子を含めなくてはなりません。例えば、URL 拡張子「sql」または「sq」を指定したときに必ず Domino が SQLQuery サーブレットを呼び出すようにするには、「sql,sq」をサーバー設定に追加し、次のディレクティブをプロパティファイルに追加してください。

servlet.SQLQuery.extension=sql sq

これによって、ユーザーは次のような URL でサーブレットを起動できます。

http://acme.com/query.sql?month=june

起動時にロードする

デフォルトでは、Servlet Manager は、サーブレットを参照する URL が最初に受信されたときに、サーブレットのクラスファイルをメモリにロードします。しかし、Servlet Manager のスタート時に 1 つ以上のサーブレットを直ちにロードするよう指定できます。これによって、サーブレットが初めて URL から要求されたとき、ユーザーが遅れを感じるのを防ぐことができます。

スタートアップディレクティブの構文は次のとおりです。

servlets.startup=<alias or class> <alias or class> ...

"servlets" は複数形で、サーブレット名はスペースで区切る必要があることに注意してください。

サーブレットに 1 つ以上の別名を与えた場合、スタートアップディレクトリに別名を含めることができます。これにより、Servlet Manager にサーブレットクラスをロードさせ、別名ごとに 1 つのインスタンスを作成させることができます。

Servlet Manager がサーブレットのクラスをロードすると、それらのクラスは、Domino HTTP タスクがコンソールコマンド「tell http quit」によって停止されるか、コンソールコマンド「tell http restart」によって再始動されるまでメモリに常駐します。サーブレットをアンロードする前に、Servlet Manager は、サーブレットの各インスタンスに対して destroy() メソッドを呼び出します。これにより各インスタンスのリソースをクリーンアップできます。

JVM クラスローダーによってロードされたクラスは、HTTP タスクが停止されるまで残ります。「tell http restart」コマンドはクラスをアンロードしません。

プロパティファイルの例

servlets.properties ファイルの例を次に示します。

# Properties for the sql servlet
servlet.SQLQuery.code=sql.database.query.Servlet
servlet.SQLQuery.initArgs=cache=30
servlet.SQLQuery.extension=sql
# Properties for the mail servlet
servlet.MailServlet.initArgs=mime=enabled,smime=disabled

# Both servlets should be loaded at startup
servlets.startup=SQLQuery MailServlet
# end of file