Cosminexus 機能解説

[目次][用語][索引][前へ][次へ]

4.32.1 サーブレット,JSP実装時共通の注意事項

Cosminexus上で動作するアプリケーションのプログラムとして,サーブレット,JSPを実装するときの共通の注意事項を示します。

<この項の構成>
(1) Webアプリケーションのサポート範囲
(2) トランザクションとJDBCコネクション利用時の注意
(3) パッケージ名の指定に関する注意
(4) Cookie利用時の注意
(5) 特別な意味を持つ入力値の表示に関する注意
(6) コミット後のエラーページの表示に関する注意
(7) PrintWriter,JSPWriterクラス利用時の性能向上について
(8) javax.servlet.error.XXXXXによるエラー情報参照時の注意
(9) ファイルアクセス時の注意
(10) 例外発生時のエラーページの設定について
(11) クラスローダの取得に関する注意
(12) URLConnectionクラス使用時の注意
(13) ネイティブライブラリのロードに関する注意
(14) ユーザスレッドの使用方法
(15) セッション情報の永続化について
(16) initメソッドおよびdestroyメソッドをオーバーライドしていない場合に出力されるメッセージ
(17) javax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性について
(18) バイナリデータを含むWebアプリケーションの操作について
(19) レスポンスの文字エンコーディングに関する注意
(20) javax.serlvet.ServletRequestクラスのgetServerNameメソッドおよびgetServerPortメソッドの戻り値について

(1) Webアプリケーションのサポート範囲

Webアプリケーションのバージョンは,web.xmlに記述するServlet仕様のバージョン情報で識別されます。上位のバージョンのWebアプリケーションは下位のバージョンの機能を使用できます。下位のバージョンのWebアプリケーションは上位のバージョンの機能を使用できません。

Webアプリケーションのバージョンごとに,使用できる機能範囲を次の表に示します。

表4-43 Webアプリケーションのサポート範囲

Webアプリケーションのバージョン サーブレット JSP タグライブラリ
2.2 2.3 2.4 1.1 1.2 2.0 1.1 1.2 2.0
2.2 × × × × × ×
2.3 × × ×
2.4

(凡例)○:使用できる ×:使用できない

注※
タグライブラリのバージョンとは,タブライブラリ・ディスクリプタ(TLDファイル)のバージョンを表します。

なお,Servlet 2.2仕様およびServlet 2.3仕様に対応したWebアプリケーションで,Servlet 2.4仕様およびJSP 2.0仕様の機能を使用した場合にエラーとなる場合があります。エラーとなる機能および処理を次の表に示します。

表4-44 Servlet 2.2/2.3仕様に対応するWebアプリケーションからServlet 2.4仕様の機能を使用した場合のエラー

仕様 使用する機能 エラー時の処理
Servlet 2.4 新規API呼び出し Servlet 2.4仕様で追加されたAPIを使用したかどうかはチェックされません。呼び出した場合の動作は保証されないため呼び出さないよう注意してください。
新規リスナ登録 Webアプリケーションの開始時にメッセージKDJE39297-Wがメッセージログに出力され,そのリスナ定義は無視されます。
JSP 2.0 新規ディレクティブ新規スタンダード・アクション サーブレットログにKDJE39145-Eのメッセージ,メッセージログにKDJE39186-Eのメッセージがそれぞれ出力され,JSPコンパイルエラーとなります。
タグファイル

TLDを使用しない場合
taglibディレクティブで新規属性となるtagdir属性が不正として,サーブレットログにKDJE39145-Eのメッセージ,メッセージログにKDJE39186-Eのメッセージがそれぞれ出力され,JSPコンパイルエラーとなります。

TLDを使用する場合
TLD 2.0を使用したエラーになります。
TLD 2.0 次に示すTLDファイルは,Webアプリケーション開始時にチェックされます。該当する場合,メッセージログにKDJE39293-Wが出力され,無視されます。
  • web.xmlの<taglib><tablib-location>に指定されたTLDファイル
  • /WEB-INF/lib下のJarファイル内の/META-INF以下に配置されたTLDファイル
上記以外のTLDファイルは,JSPコンパイル時にチェックされます。初回アクセス時など,JSPファイルのコンパイル時は,サーブレットログにKDJE 39145-Eのメッセージ,メッセージログにKDJE39186-Eのメッセージがそれぞれ出力され,JSPコンパイルエラーとなります。
シンプル・タグ・ハンドラ サーブレットログにKDJE39145-Eのメッセージを,メッセージログにKDJE39186-Eのメッセージがそれぞれ出力され,JSPコンパイルエラーとなります。

Servlet 2.2仕様およびServlet 2.3仕様から,Servlet 2.4仕様にWebアプリケーションのバージョンアップする場合の作業,および注意事項については,「4.32.6 既存のWebアプリケーションをServlet 2.4仕様にバージョンアップする場合の留意点」を参照してください。

(2) トランザクションとJDBCコネクション利用時の注意

サーブレット,JSPでトランザクションを利用する場合,該当するサービスメソッドでJDBCコネクションを取得し,該当するサービスメソッドが終了する前に解放してください。トランザクションが開始しているサーブレットおよびJSPでは,次に示すJDBCコネクションの使用はサポートされません。

(3) パッケージ名の指定に関する注意

不正なパッケージ名が指定されたクラスをサーブレットおよびJSPで使用した場合,ブラウザからアクセスしたときにステータスコード500のエラーになります。例えば,作成したクラスファイルを正しく配置して,ブラウザからアクセスしても,パッケージ名の宣言に不正があった場合は,該当クラスが見つかりません。この場合,ステータスコード500のエラーが返されます。

(4) Cookie利用時の注意

(5) 特別な意味を持つ入力値の表示に関する注意

フォームなどで「<」や「>」などの特別な意味を持つ文字の入力値をそのまま表示した場合,悪意のあるユーザが<SCRIPT>,<OBJECT>,<APPLET>,<EMBED>のスクリプトなどを実行できるタグを使用して,重大なセキュリティ上の問題を引き起こすおそれがあります。アプリケーション開発者は,ユーザから入力されたデータに対して必ず検査をする処理を追加して,特別な意味を持つ文字を排除する必要があります。

(6) コミット後のエラーページの表示に関する注意

サーブレットまたはJSPでレスポンスがコミットされたあとは,例外などのエラーが発生したとしても,次に示すエラーページはブラウザに表示されません。

レスポンスのコミットは,ユーザがServletResponseクラスのflushBufferメソッドなどを明示的に呼び出してコミットする場合以外にも,レスポンスのバッファが満杯になって自動的にWebコンテナがコミットすることがあります。

サーブレットまたはJSPでコミットされているかどうかを調べるには,ServletResponseクラスのisCommittedメソッドを使用します。また,バッファサイズの変更は,サーブレットの場合はServletResponseクラスのsetBufferSizeメソッドで,JSPの場合はpageディレクティブのbuffer属性の指定で行うことができます。

(7) PrintWriter,JSPWriterクラス利用時の性能向上について

PrintWriterクラスおよびJSPWriterクラスのprintメソッドとprintlnメソッドの呼び出し回数を少なくすることで,アクセス回数を減らし,性能を向上できます。例えば,StringBufferクラスを使用し,最後にprintlnメソッドを呼び出すようにして,printおよびprintlnメソッドの呼び出し回数を削減します。

(8) javax.servlet.error.XXXXXによるエラー情報参照時の注意

Servlet 2.3仕様で定義されているjavax.servlet.error.XXXXX属性は,web.xmlの<error-page>タグに指定されたサーブレットまたはJSP内でそのエラーページを実行する要因となったエラー情報を参照するためのものです。web.xmlの<error-page>タグに指定されたサーブレットまたはJSP以外からは,これらの属性を参照しないでください。

(9) ファイルアクセス時の注意

ファイルにアクセスする場合は,必ず絶対パスを指定してください。相対パスを指定すると,J2EEサーバはWebコンテナサーバの実行ディレクトリからの相対パスによって目的のパスを検索しようとします。ServletContextクラスのgetRealPathメソッドで相対パスを指定すると,WARファイルを展開したディレクトリでの相対パスが取得されます。

また,ファイルにアクセスする場合は,必ずファイルをクローズしてください。WARファイル展開ディレクトリでファイルにアクセスしてクローズしないと,J2EEサーバで正常にアンデプロイできなくなります。WARファイルの展開ディレクトリ下のパスを指定していない場合でもファイルをクローズしていないと,J2EEサーバの起動中にファイルを削除できないなどの現象が発生します。

(10) 例外発生時のエラーページの設定について

JSP,サーブレットへのアクセスで例外が発生した場合,Webコンテナのデフォルトの処理では例外のステータスコードをブラウザに返します。このデフォルトの処理を変える場合はJSPのerrorPageの指定やweb.xmlでエラーページを設定してください。

(11) クラスローダの取得に関する注意

J2EEアプリケーション内のコードからCosminexus Component Containerのクラスローダを取得して,次に示すメソッドを使用する場合に,java.net.JarURLConnectionクラスが使用されます。

上記メソッドが呼び出される過程でjava.net.JarURLConnectionクラスのopenConnectionメソッドが呼び出され,該当するURLに指定されたJARファイルがオープンされます。このJARファイルはcloseメソッドを明示的に呼ばないかぎり,オープンされたままになり削除できません。上記メソッドはJ2EEアプリケーション内で使用しないでください。また,JARファイルに対する操作が必要でjava.net.JarURLConnectionクラスのopenConnectionメソッドを使用する場合には,該当するJARファイルに対してcloseメソッドを必ず呼び出すようにしてください。

(12) URLConnectionクラス使用時の注意

java.net.URLConnectionクラスはsetUseCaches(boolean)メソッドを使用して,指定されたURLに対してコネクションを取得するときにキャッシュの情報を利用するかどうかを指定できます。URLConnectionクラスに対してsetUseCaches(false)メソッドを指定した場合に,コネクションごとに対象のオブジェクトが生成されます。J2EEアプリケーション内のコードから使用する場合には,J2EEサーバのJavaVMがメモリ不足となるおそれがあります。

(13) ネイティブライブラリのロードに関する注意

System.loadLibraryメソッドを使用して,サーブレットおよびJSPからネイティブライブラリをロードしないでください。サーブレットおよびJSPでネイティブライブラリをロードすると,JNI仕様の制約によって,java.lang.UnsatisfiedLinkErrorが発生することがあります。ネイティブライブラリのロードが必要な場合は,System.loadLibraryメソッドを呼び出すコンテナ拡張ライブラリを作成し,サーブレットおよびJSPからコンテナ拡張ライブラリを参照するように実装してください。コンテナ拡張ライブラリの作成については,「10. コンテナ拡張ライブラリ」を参照してください。

(14) ユーザスレッドの使用方法

アプリケーションを構成するサーブレットおよびJSPからスレッドを生成して,使用できます。ユーザがプログラムの中で明示して生成するスレッドのことを,ユーザスレッドといいます。

ユーザスレッドは,生成後の動作のしかた(ライフサイクル)によって,次の二つに分けられます。

ユーザスレッドの使用条件
  • ユーザスレッドは,Enterprise Beanでは使用できません(EJB仕様で,Enterprise Beanからのスレッドの生成が禁止されているため)。
  • ユーザスレッドが使用できるApplication Serverのサーバモードを次に示します。

    表4-45 ユーザスレッドの前提条件(サーバモード)

    サーバモード 使用可否
    J2EEサーバモード 1.4モード
    ベーシックモード ×
    サーブレットエンジンモード

    (凡例)○:使用できる ×:使用できない

    注※
    サーブレットエンジンモードでサポートされている範囲で機能を使用できます。ただし,コネクションプールは使用できません。

ユーザスレッドを使用する場合のライフサイクルについて説明します。

(a) サービスメソッドやinitメソッドの範囲内で動作させる場合

サービスメソッドやinitメソッドでユーザスレッドの処理を完了させるモデルです。このモデルの処理の流れを次の図に示します。

図4-47 サービスメソッドやinitメソッドの範囲内で動作させる場合の処理

[図データ]

サービスメソッドやinitメソッドの呼び出しの範囲内で,ユーザスレッドを生成します。サービスメソッドやinitメソッドでは,joinメソッドによってユーザスレッドの処理が完了するのを待ってから,リターンします。

(b) サービスメソッドやinitメソッドのバックグラウンドで動作させる場合

サービスメソッドやinitメソッドでユーザスレッドを生成し,その後ユーザスレッドをバックグラウンドで動作させるモデルです。このモデルの処理の流れを次の図に示します。

図4-48 サービスメソッドやinitメソッドのバックグラウンドで動作させる場合の処理

[図データ]

ユーザスレッドを生成したサービスメソッドやinitメソッドは,ユーザスレッドを生成したあと,処理の完了を待たないでリターンします。ただし,アプリケーションを停止したあとは,ユーザスレッドからJ2EEサービスを利用できなくなります。したがって,アプリケーションの停止によってサーブレットやJSPのdestroyメソッドが呼ばれる前に,ユーザスレッドの処理を完了しておく必要があります。

(15) セッション情報の永続化について

Webコンテナではセッション情報の永続化はサポートされません。Webコンテナではセッション情報は,正常,異常に関係なくWebコンテナが終了すると失われます。セッション情報を保持したい場合は,セッションフェイルオーバ機能を使用してください。

また,web.xmlで<distributable>タグを指定した場合,およびSerializableでないオブジェクトをセッション情報として登録した場合もIllegalArgumentExceptionは発生しません。

(16) initメソッドおよびdestroyメソッドをオーバーライドしていない場合に出力されるメッセージ

initメソッドおよびdestroyメソッドをオーバーライドしていないサーブレットを初期化または終了すると,次の形式のログがサーブレットログに出力されます。

また,JSPの場合は,pageディレクティブのextends属性で指定するJSPの基底クラスでinitメソッドおよびdestroyメソッドをオーバーライドしなかった場合,同様のメッセージが出力されます。その場合,サーブレット名は"com.hitachi.software.web.servlet-name.jsp"となります。JSPでpageディレクティブのextends属性を指定しなかった場合は,initメソッドのログだけが出力され,destroyメソッドのログは出力されません。

(17) javax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性について

javax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性について,Servletで例外をスローした場合とJSPファイルで例外をスローした場合の二つに分けて説明します。

(a) Servletで例外をスローした場合

Servletでスローした例外クラスがjava.lang.Error,またはその派生クラスの場合
javax.servlet.ServletExceptionクラスの例外がjavax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性に設定されます。Servletでスローした例外は,javax.servlet.ServletExceptionクラスのgetRootCauseメソッドで取得できます。

Servletでスローした例外クラスがjava.lang.Error,またはその派生クラス以外のクラスの場合
Servletでスローした例外がjavax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性に設定されます。
(b) JSPファイルで例外をスローした場合
●エラーページがJSPファイルの場合

web.xmlの<error-page>タグでエラーページを指定した場合
web.xmlの<error-page>タグでエラーページを指定した場合について,JSP 2.0とJSP 1.2に分けて示します。
JSP 2.0
JSPファイルでスローした例外がjavax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性に設定されます。
JSP 1.2
JSPファイルでスローした例外クラスが次のクラスのどれかであれば,JSPファイルでスローした例外がjavax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性に設定されます。
  • java.io.IOException,またはその派生クラス
  • java.lang.RuntimeException,またはその派生クラス
  • javax.servlet.ServletException,またはその派生クラス
JSPファイルでスローした例外クラスが上記以外の場合,javax.servlet.ServletExceptionクラスの例外がjavax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性に設定されます。JSPファイルでスローした例外は,javax.servlet.ServletExceptionクラスのgetRootCauseメソッドで取得できます。

pageディレクティブのerrorPage属性でエラーページを指定した場合
pageディレクティブのerrorPage属性でエラーページを指定した場合について,エラーページでpageディレクティブのisErrorPage属性にtrueを指定した場合とfalseを指定した場合に分けて示します。
エラーページでpageディレクティブのisErrorPage属性にtrueを指定した場合
JSPファイルでスローした例外がjavax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性に設定されます。
エラーページでpageディレクティブのisErrorPage属性にfalseを指定した場合
javax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性に値は設定されません。
●エラーページがServletの場合

web.xmlの<error-page>タグでエラーページを指定した場合
エラーページがJSPファイルの場合の,web.xmlの<error-page>タグでエラーページを指定した場合と同様です。

pageディレクティブのerrorPage属性でエラーページを指定した場合
javax.servlet.ServletRequestオブジェクトのjavax.servlet.error.exception属性に値は設定されません。

(18) バイナリデータを含むWebアプリケーションの操作について

バイナリデータを含むWebアプリケーションでは,次のことに注意してください。

(19) レスポンスの文字エンコーディングに関する注意

JSPまたはサーブレットのレスポンスボディの文字エンコードディングが,UTF-16(16ビットUCS変換形式)の場合,ブラウザによって正しく表示できない場合があります。その場合は,JSPまたはサーブレットの文字エンコードディングに,UTF-16BE(16ビットUCS変換形式のビッグエンディアンバイト順),またはUTF-16LE(16ビットUCS変換形式のリトルエンディアンバイト順)を使用してください。

(20) javax.serlvet.ServletRequestクラスのgetServerNameメソッドおよびgetServerPortメソッドの戻り値について

getServerNameメソッド,およびgetServerPortメソッドの戻り値について説明します。

Servlet2.4仕様では,Hostヘッダの有無によって,getServerNameメソッド,およびgetServerPortメソッドの戻り値が異なります。Servlet2.4仕様でのgetServerNameメソッド,およびgetServerPortメソッドの戻り値を次の表に示します。

表4-46 getServerNameメソッド,およびgetServerPortメソッドの戻り値(Servlet2.4仕様の場合)

Hostヘッダの有無 getServerNameメソッドの戻り値 getServerPortメソッドの戻り値
有り Hostヘッダの「:」より前の部分 Hostヘッダの「:」よりあとの部分
無し 解決されたサーバ名またはIPアドレス クライアントとの接続を受け付けたサーバのポート番号

Cosminexusでは,getServerNameメソッド,およびgetServerPortメソッドの戻り値は,HTTPリクエストと,使用する機能の組み合わせによって得られます。なお,HTTP 1.1のリクエストにHostヘッダが含まれない場合,HTTP 1.1仕様に従って,400エラーとなります。また,HTTP 1.1仕様では,リクエストラインのリクエストURIが絶対URIの場合,ホストにはリクエストURIのホストを使用して,Hostヘッダの内容は無視するように定義されています。なお,Servlet仕様では明記されていませんが,HTTP仕様に従って,リクエストラインのURIに含まれるホスト名を優先するようになっています。

HTTPリクエストと,使用する機能の組み合わせによって得られる,getServerNameメソッド,およびgetServerPortメソッドの戻り値を次の表に示します。なお,ゲートウェイ指定機能を使用している場合の,getServerNameメソッド,およびgetServerPortメソッドの戻り値については,表4-48を参照してください。

表4-47 getServerNameメソッド,およびgetServerPortメソッドの戻り値(Cosminexusの場合)

HTTPリクエスト 使用する機能 getServerNameメソッドの戻り値 getServerPortメソッドの戻り値
Hostヘッダの有無 リクエストラインのURIの種類
有り 絶対URI Webサーバ連携 リクエストラインのホスト名 リクエストラインのポート番号
インプロセスHTTPサーバ リクエストラインのホスト名 リクエストラインのポート番号
簡易Webサーバ Hostヘッダのホスト名 Hostヘッダのポート番号
相対URI Webサーバ連携 Hostヘッダのホスト名 Hostヘッダのポート番号
インプロセスHTTPサーバ Hostヘッダのホスト名 Hostヘッダのポート番号
簡易Webサーバ Hostヘッダのホスト名 Hostヘッダのポート番号
無し 絶対URI Webサーバ連携 リクエストラインのホスト名 リクエストラインのポート番号
インプロセスHTTPサーバ リクエストラインのホスト名 リクエストラインのポート番号
簡易Webサーバ J2EEサーバのホスト名またはIPアドレス※1 簡易Webサーバのポート番号
相対URI Webサーバ連携 Webサーバのホスト名またはIPアドレス※2 Webサーバのポート番号
インプロセスHTTPサーバ J2EEサーバのホスト名またはIPアドレス※1 インプロセスHTTPサーバのポート番号
簡易Webサーバ J2EEサーバのホスト名またはIPアドレス※1 簡易Webサーバのポート番号

注※1 java.net.InetAddress.getLocalHostメソッド,またはgetHostNameメソッドの戻り値となります。

注※2 Hitachi Web Serverを使用する場合,ServerNameディレクティブに指定した値となります。ServerNameディレクティブについては,マニュアル「Hitachi Web Server」を参照してください。


ゲートウェイ指定機能使用時のgetServerNameメソッド,およびgetServerPortメソッドの戻り値を次の表に示します。

表4-48 ゲートウェイ指定機能使用時のgetServerNameメソッド,およびgetServerPortメソッドの戻り値(Cosminexusの場合)

HTTPリクエスト 使用する機能 getServerNameメソッドの戻り値 getServerPortメソッドの戻り値
Hostヘッダの有無 リクエストラインのURIの種類
有り 絶対URI Webサーバ連携 リクエストラインのホスト名 リクエストラインのポート番号
インプロセスHTTPサーバ リクエストラインのホスト名 リクエストラインのポート番号
相対URI Webサーバ連携 Hostヘッダのホスト名 Hostヘッダのポート番号
インプロセスHTTPサーバ Hostヘッダのホスト名 Hostヘッダのポート番号
無し 絶対URI Webサーバ連携 ゲートウェイ指定機能で指定したホスト名 ゲートウェイ指定機能で指定したポート番号
インプロセスHTTPサーバ リクエストラインのホスト名 リクエストラインのポート番号
相対URI Webサーバ連携 ゲートウェイ指定機能で指定したホスト名 ゲートウェイ指定機能で指定したポート番号
インプロセスHTTPサーバ ゲートウェイ指定機能で指定したホスト名 ゲートウェイ指定機能で指定したポート番号