Servletサービスにおけるアプリケーション動作の非互換項目を以下に示します。該当する機能をWebアプリケーションで使用している場合には、Webアプリケーションを修正してください。
Servlet/JSP仕様の差分については、Java(TM) Servlet SpecificationおよびJavaServer Pages(TM) Specificationをあわせて参照してください。
またシステム移行の際には、運用前に業務の観点で十分な動作検証を実施してください。
No. | 機能 | Tomcat3.1ベースのServletサービス | Tomcat4.1ベースのServletサービス | Tomcat5.5ベースのServletサービス |
---|---|---|---|---|
1 | カスタムタグのTag#release()メソッド | カスタムタグの開発で実装するjavax.servlet.jsp.tagext.Tagインタフェースのpublic void release()メソッドは、カスタムタグを使用したページの呼出しが終わるごとに呼び出されます。 | カスタムタグの開発で実装するjavax.servlet.jsp.tagext.Tagインタフェースのpublic void release()メソッドは、Webアプリケーション終了時に呼び出されます。 public void doCatch(Throwable t) | |
2 | Webブラウザに返却されるステータスコード | Webアプリケーション環境定義ファイルに<error-page>タグが設定されている場合は、ステータスコードは200が返却されます。 | Webアプリケーション環境定義ファイルに<error-page>タグが設定されている場合にも、発生した現象のステータスコードがそのまま返却されます。 | Webアプリケーション環境定義ファイルに<error-page>タグが設定されている場合にも、発生した現象のステータスコードがそのまま返却されます。 |
3 | JSPの呼出し | JSPファイルを更新した場合、前回コンパイルされたJSPファイルとファイル更新日時が異なる場合に反映されます。(反映はServletコンテナ再起動、またはリロード機能有効時) | JSPまたはJSPから静的includeしているファイルを更新した場合、前回コンパイルされた日時よりも新しい日付のJSPファイルの場合に反映されます。 | |
4 | Webアプリケーション環境定義ファイルの<servlet>タグ内の<load-on-startup>タグ | 0を指定した場合は、サーブレット・コンテナ起動時にロードされません。 | 0を指定した場合は最後にロードされます。 | 0を指定した場合は最初にロードされます。 |
-2147483648~2147483647以外の値を指定した場合はWebアプリケーションの起動は失敗します。 | -2147483648~2147483647以外の値を指定した場合もWebアプリケーションの起動は成功します。 | |||
5 | Webブラウザにスタックトレースを表示 | サーブレット・コンテナ環境定義ファイルのContextManagerタグのerrResponse属性で、リクエストの処理でErrorやExceptionが発生した場合、Webブラウザにスタックトレースを表示するかどうかを指定します。 | 内部の情報が漏洩する可能性があるため、リクエストの処理でErrorやExceptionが発生した場合、Webブラウザにスタックトレースを表示しません。 | |
6 | Webアプリケーション環境定義ファイルの<servlet-mapping>タグ内の<servlet-name>タグ | 指定していない名前を記述した場合は、無効となります。 | 指定していない名前を記述した場合は、Webアプリケーションの起動に失敗します。 | |
7 | Webアプリケーション環境定義ファイルの<welcome-file-list>タグ内の<welcome-file>タグ | welcome fileを省略した場合、サーブレット・コンテナ環境定義ファイルで記述するContext定義のdirList属性の指定により、その実体となるディレクトリ配下のディレクトリやファイルの一覧、またはステータスコード404(ファイルが存在しない)が表示されます。 | welcome fileを省略した場合、デフォルト設定が使用されます。デフォルト設定のファイルは以下の順番で有効になります。 | |
8 | Webアプリケーション環境定義ファイルの<env-entry>タグ内の<env-entry-value>タグ | <env-entry-value>タグを省略して環境エントリをlookupした場合にはjavax.naming.NamingExceptionまたはそのサブクラスが投げられます。 | <env-entry-value>タグを省略した場合には、デフォルト値が設定されます。 (注1) | |
Tomcat3.1ベースのServletサービスと同じ動作をさせる場合には、Interstage管理コンソールの[ワークユニット] > 「ワークユニット名」 > [環境設定]タブ > [詳細設定] > [ワークユニット設定] > [JavaVMオプション]に「-Dcom.fujitsu.interstage.jservlet. | Tomcat3.1ベースのServletサービスと同じ動作をさせる場合には、deployment descriptor(web.xml)から、該当する<env-entry>タグを削除してください。 | |||
9 | Webアプリケーション環境定義ファイルの<taglib-location>タグで存在しないパスを指定した場合 | 無効となります。 | Webアプリケーションの起動に失敗します。 | 無効となります。 |
10 | WEB-INF配下にXMLの文法に誤りのあるTagLibraryDescriptorファイルが存在した場合 | 「XML parsing error on file」がコンテナの標準出力、標準エラー出力のログに出力されるが、サーブレット・コンテナの起動に成功します。 | メッセージ「IJServer15111」がコンテナログに出力され、Webアプリケーションの起動に失敗します。 | メッセージは出力されますが、Webアプリケーションの起動は成功します。 |
11 | Webアプリケーション環境定義ファイルの<servlet-mapping>タグ内の<url-pattern>タグ | 特定の拡張子をもつURLを指定した場合(例:*.jsp)は、URL内の「/」と「/」で囲まれた箇所もマッピング対象となります。 | 特定の拡張子をもつURLを指定した場合(例:*.jsp)は、URL内の「/」と「/」で囲まれた箇所もマッピング対象とならず、最後の「/」以降がマッピング対象となります。 | |
12 | Webアプリケーション環境定義ファイルの<welcome-file-list>タグ内の<welcome-file>タグに指定されたファイルを表示する場合の動作 | URLが「/」で終わっていない場合、URLの最後に「/」を追加した値をLocationヘッダに指定し、ステータスコード:302を返します。 URLが「/」で終わっている場合、<welcome-file>タグに指定されたコンテンツに内部でforwardします。そのため、指定したコンテンツ(JSP等)先で取得できるリクエストのURLなどのパス情報は、forwardされたコンテンツのものとなります。 | URLが「/」で終わっていない場合、URLの最後に「/」を追加した値をLocationヘッダに指定し、ステータスコード:302を返します。 URLが「/」で終わっている場合、<welcome-file>タグに指定されたファイル名を追加したURLをLocationヘッダに指定し、ステータスコード:302を返します。そのため、指定したコンテンツ先で取得できるリクエストのURLなどのパス情報は、ブラウザが再度リクエストを発行(リダイレクト)した時の情報となります。 | URLが「/」で終わっていない場合、URLの最後に「/」を追加した値をLocationヘッダに指定し、ステータスコード:302を返します。 URLが「/」で終わっている場合、<welcome-file>タグに指定されたコンテンツを直接処理して返します。そのため、指定したコンテンツ先で取得できるリクエストのURLなどのパス情報は、ブラウザからリクエストされてきたパスのままとなり、<welcome-file>タグで指定したコンテンツを含むパスとはなりません。 |
13 | 複数のAccept-Languageヘッダを持つリクエストを受け付けた場合のHttpServletRequest#getHeaders()メソッドの動作 (注2) | version属性(※)に4.1を指定または省略している場合 version属性(※)に5.0または5.1を指定している場合 | 「,」で区切られた値を1つの要素としてEnumerationが返されます。 | |
14 | レスポンスのデフォルトLocale | "en"です。 | "en_US"です。 | デフォルトではサーバのLocaleとなります。 |
| レスポンスのコミット後またはgetWriterメソッド呼出し後の、setLocaleメソッドまたはsetContentTypeメソッド呼出しのレスポンスのエンコーディングへの反映 (注4) | 「setLocaleメソッドまたはsetContentTypeメソッド呼出しのレスポンスのエンコーディングへの反映」を参照してください。 | ||
16 | レスポンスのsetLocaleメソッドまたはsetContentTypeメソッド(引数のmimeタイプ文字列にcharset属性を含む) (注5)によりレスポンスのエンコーディングを設定済みで、setContentTypeメソッドをcharset属性を含まないmimeタイプ文字列を指定して呼び出した場合の動作 (注6) | レスポンスのWriterによるデータの書き出しには反映されますが、レスポンスのContent-Typeヘッダにはcharset属性は付加されません。 | Servletの仕様に従い、レスポンスのWriterによるデータの書き出し、Content-Typeヘッダのcharset属性ともに、先に設定済みのエンコーディングが反映されます。 | |
17 | レスポンスのsetContentTypeメソッドをcharset属性ありのmimeタイプ文字列を指定して呼び出した (注5)後の、setLocaleメソッドのレスポンスのエンコーディングへの反映 (注6) | 反映されます。 | Servletの仕様に従い、反映されません。 | |
18 | setLocaleメソッドまたはsetContentTypeメソッドでエンコーディングを指定しない場合のレスポンスのエンコーディング | レスポンスのWriterによるデータの書き出しはISO-8859-1となりますが、レスポンスのContent-Typeヘッダに、charset属性は付加されません。 | レスポンスのWriterによるデータの書き出し、およびContent-Typeヘッダのcharset属性はISO-8859-1となります。 | |
19 | getWriterでcharsetを指定する場合のエラーページ処理のエンコーディングへの反映 | getWriterで指定したcharsetの内容が、エラーページ処理に引き継がれます。 | getWriterで指定したcharsetの内容が、エラーページ処理に引き継がれません。 | getWriterで指定したcharsetの内容が、エラーページ処理に引き継がれます。 |
20 | JSPのpageディレクティブで明示的にpageEncodingまたはcontentType属性を指定しない場合のデフォルトエンコーディング | レスポンスのデータの書き出しはISO-8859-1、Content-Typeヘッダは"text/html"となります。 | レスポンスのデータの書き出しはISO-8859-1、Content-Typeヘッダは"text/html;charset=ISO-8859-1"となります。 | |
21 | サーブレットのserviceが、永久的に使用不能な状態であること示すUnavailableExceptionをthrowした時の動作 | Servlet2.3では規定されていませんが、基本的にステータスコード500を返却。 | Servlet2.3では規定されていませんが、基本的にステータスコード503を返却。 | ステータスコード404を返却。 |
22 | deployment descriptor(web.xml)のtaglibタグ | <taglib>タグは、<web-app>タグの直下に記載します。 | <taglib>タグは、<web-app>タグの直下に記載します。 | <taglib>タグは、<jsp-config>タグ配下に記載します。 |
23 | server.xml定義ファイルへのrealmの設定 | - | Tomcat4.1と同様のrealmタグを設定することができます。 | できません。ディレクトリサービスを使用してください。 |
24 | 「コンテキストの共有」有効時のセション | - | Webアプリケーション環境設定の「コンテキストの共有」を「する」に設定し、Webアプリケーションから別のWebアプリケーションに、RequestDispatcherを使用してディスパッチした場合、ディスパッチ前と後で使用するセションは同じとなります。 | Webアプリケーション環境設定の「コンテキストの共有」を「する」に設定し、Webアプリケーションから別のWebアプリケーションに、RequestDispatcherを使用してディスパッチした場合、Servletの仕様に厳密に従い、セションは別のものとなります。セションの属性は共有されません。ディスパッチ前のセションの情報(属性)をディスパッチ後に使用したい場合は、リクエストの属性として(ServletRequest#setAttributeメソッド等を使用して)受渡を行う等、アプリケーションで対応してください。 |
25 | HttpSessionのgetAttribute(null)呼出し時 | NullPointerExceptionとなります。 | nullが返却されます。 | NullPointerExceptionとなります。 |
26 | JSPのコンパイル | JSPの仕様に沿っていなくてもコンパイル/実行できる場合がありました。 | JSPの仕様に沿っていない場合は動作しない可能性があります。 フルクラス名で指定する publicなクラスを指定する publicなデフォルトコンストラクタがあるクラスを指定する 修正しない場合は、事前に充分な動作検証を行ってください。 | |
27 | HttpSessionListenerのsessionDestroyed | セションが破棄された後に呼び出されます。 | セションが破棄される前に呼び出されます。 | |
28 | HttpSessionBindingListenerのvalueBound | オブジェクトがHttpSessionのgetAttributeで取得できる状態になってから呼び出されます。 | オブジェクトがHttpSessionのgetAttributeで取得できる状態になる前に呼び出されます。 | |
29 | Webアプリケーション環境定義ファイルのタグの順番 | <env-entry>タグ配下は以下の順で記載します。 | <env-entry>タグ配下は以下の順で記載します。 | |
30 | JSPのタグの書式 | 以下の例のように、タグ~閉じタグ(ETag)間に子タグやBODYがなく、改行などがあっても動作する場合がありました。 | JSP2.0では許可される書式が明示され、左記のような記述はコンパイル時にエラーとなります。JSPの仕様に従い、以下のようにしてください。 | |
31 | JSPのBeanのプロパティ値がnullの場合の動作 | JSPのBeanのプロパティ値がnullの場合、<jsp:getProperty>アクションの出力は""(空文字列)となります。 | JSPの仕様に従い、出力は"null"となります。 プロパティの初期値を""とするなど、JSPの仕様に従うようにアプリケーションを修正する。(推奨) Interstage管理コンソールの[ワークユニット] > 「ワークユニット名」 > [環境設定]タブ > [詳細設定] > [ワークユニット設定] > [JavaVMオプション]に「-Dcom.fujitsu.interstage.jservlet.jsp.bean. | |
32 | Webアプリケーション環境定義ファイルの<security-constraint>タグ内の<auth-constraint>タグ内の<role-name>タグ | "*"を指定する場合、<security-role>タグに有効な<role-name>タグが定義されていなければリソースにアクセスできません。 | "*"を指定する場合、<security-role>タグを定義しなくてもリソースにアクセスできます。 | "*"を指定する場合、<security-role>タグに有効な<role-name>タグが定義されていなければリソースにアクセスできません。 |
33 | JSPのファイルエンコーディング | JSP1.2に従い、JSPファイルを読み込むエンコーディングは、コンパイル単位でした。include先のJSPファイルも、include元とおなじエンコーディングで読み込まれます。 | JSP2.0に従い、JSPファイルを読み込むエンコーディングは、ファイル単位となります。include先のJSPファイルを読み込むエンコーディングは、include元のJSPファイルを読み込むエンコーディングの影響を受けません。(デフォルトISO-8859-1) | |
34 | JSPでカスタムタグライブラリ使用時の動作 | TLD(Tag Library Description file)にて、対象のタグのbody-contentに「TAGDEPENDENT」(大文字)指定でも動作可能です。 XML構文のJSP(JSP Documents)の場合、TLD(Tag Library Description file)にて、対象のタグのbody-contentに「tagdependent」(「TAGDEPENDENT」)を指定し、タグのボディで<jsp:text>などを使用した場合、ボディは処理された後にタグライブラリに渡されます。 | TLD(Tag Library Description file)にて、対象のタグのbody-contentに「TAGDEPENDENT」(大文字)は指定できません。仕様に従い、「tagdependent」(小文字)を指定してください。 XML構文のJSP(JSP Documents)の場合、TLD(Tag Library Description file)にて、対象のタグのbody-contentに「tagdependent」を指定し、タグのボディで<jsp:text>などを使用した場合、ボディは処理されずにそのままタグライブラリに渡されます。仕様通りの正しい動作です。 なおServletの仕様に従い、参照するTLDファイルは必ずWebアプリケーション内に存在している必要があります。 | |
35 | サーブレットコンテキストの初期化パラメタ | サーブレットコンテキストの初期化パラメタ(<context-param>タグ)の複数指定時、重複したパラメタ名(<param-name>タグ)がある場合、最後に指定したものが有効となります。 | 重複したパラメタ名は指定できません。定義エラーとなります。 | |
36 | 無効なセションのgetLastAccessedTimeメソッド呼出し | 無効なセション(破棄やタイムアウトしたセション)のgetLastAccessedTimeメソッドを呼出し可能です。 | 無効なセション(破棄やタイムアウトしたセション)のgetLastAccessedTimeメソッドを呼び出した場合、IllegalStateExceptionとなります。 | |
37 | Webアプリケーション環境定義ファイルの<listener-class>タグ | <listener-class>タグに存在しないクラスを指定した場合は、コンテナログにエラーは出力されますがアプリケーションの起動は成功します。 | <listener-class>タグに存在しないクラスを指定した場合は、IJServer起動時にコンテナログにエラーが出力され、アプリケーションの状態は"非活性"になります。また、そのアプリケーションにアクセスした場合にはステータスコード404(ファイルが存在しない)が表示されます。 | |
38 | ServletRequestのgetServerName | リクエストを受信したサーバのホスト名。 CGI変数のSERVER_NAMEと同じ値が返ります。 | リクエストを受信したサーバのホスト名。 リクエストヘッダのHostヘッダの値が返ります。Hostヘッダがない場合は、CGI変数のSERVER_NAMEと同じ値が返ります。 | |
39 | ServletRequestのgetServerPort | リクエストを受信したサーバのポート番号。 CGI変数のSERVER_PORTと同じ値が返ります。 | リクエストを受信したサーバのポート番号。 リクエストヘッダのHostヘッダの値が返ります。Hostヘッダがない場合は、CGI変数のSERVER_PORTと同じ値が返ります。 | |
40 | HttpServletResponseのsendRedirect | 指定された相対URLを用いて、クライアントに一時的なリダイレクトレスポンスを送信します。 Servletコンテナによる絶対URLへの変換は、CGI変数のSERVER_NAMEおよびSERVER_PORTと同じ値が使用されます。 | 指定された相対URLを用いて、クライアントに一時的なリダイレクトレスポンスを送信します。 Servletコンテナによる絶対URLへの変換は、リクエストヘッダのHostヘッダの値が使用されます。Hostヘッダがない場合は、CGI変数のSERVER_NAMEおよびSERVER_PORTと同じ値が使用されます。 |
以下のデフォルト値が設定されます。
env-entry-type | エントリ値 |
---|---|
java.lang.Boolean | Boolean.FALSE |
java.lang.Byte | 値0のByteオブジェクト |
java.lang.Character | 値0のCharacterオブジェクト |
java.lang.String | なし |
java.lang.Short | 値0のShortオブジェクト |
java.lang.Integer | 値0のIntegerオブジェクト |
java.lang.Long | 値0のLongオブジェクト |
java.lang.Float | 値0のFloatオブジェクト |
java.lang.Double | 値0のDoubleオブジェクト |
例
Accept-Language: ja
Accept-Language: es
Tomcat4.1ベースのServletサービスからの移行の場合、<welcome-file>でディレクトリ階層の異なるパス(途中に'/'を含むパス)を指定し、そのパスで示されるコンテンツから相対パスのリンクがあると、リンク先が意図したURIとならず、コンテンツが参照できない場合があります。以下のどちらかの対応を行ってください。
<welcome-file>でディレクトリ階層の異なるコンテンツを指定しない。
<welcome-file>で指定したページ中のリンクについて、コンテキストパスを含むパスとする。
例
<welcome-file>が「/jsp/welcome.jsp」、Webアプリケーション名が「sample」、JSPからのリンクが「../next.jsp」の場合、リンク先を、「/sample/next.jsp」とする。
動的コンテンツ(JSPやServlet)の場合は、以下のようにコンテキストパスを動的に取得することも可能です。(推奨)
リンク先を、request.getContextPath()+"/next.jsp" とする。
※実際には、必要に応じてHttpServletResponseのencodeURLメソッド等をあわせて使用してください。
仕様に従っていないアプリケーションの場合であり、記載のTomcat3.1ベース/Tomcat4.1ベースのServletサービスの動作が保障されるものではありません。
JSPのpageディレクティブでpageEncoding属性を指定している場合、または、contentType属性にcharsetを指定している場合も含まれます。
No.15が前提です。
setLocaleメソッドまたはsetContentTypeメソッド呼出しのレスポンスのエンコーディングへの反映
| Tomcat3.1ベースのServletサービス | Tomcat4.1ベースのServletサービス | Tomcat5.5ベースのServletサービス | ||||
---|---|---|---|---|---|---|---|
getWriterメソッド | レスポンスのコミット | Content-Typeヘッダのcharset属性 | データの書き出し | Content-Typeヘッダのcharset属性 | データの書き出し | Content-Typeヘッダのcharset属性 | データの書き出し |
呼出し前 | コミット前 | 反映される | 反映される | 反映される | 反映される | 反映される | 反映される |
コミット後 | 反映されない | 反映される | 反映されない | 反映されない | 反映されない | 反映されない | |
呼出し後 | コミット前 | 反映される | 反映されない | 反映される | 反映される | 反映されない | 反映されない |
コミット後 | 反映されない | 反映されない | 反映されない | 反映されない | 反映されない | 反映されない |