getServletPath および getPathInfo メソッドでの振る舞いの変更を確認する

デフォルトのサーブレット・マッピングには、/ 文字のみのマッピングがあります。競合のアプリケーション・サーバーでは、 デフォルトのサーブレット・マッピングの javax.servlet.http.HttpServletRequest.getServletPath メソッドへの呼び出しは リクエスト URI からコンテキスト・パスを引いた値を返し、 javax.servlet.http.HttpServletRequest.getPathInfo メソッドへの呼び出しはヌルを返します。 WebSphere traditional では、デフォルトのサーブレット・マッピングの getServletPath への呼び出しは空ストリングを返し、 getPathInfo メソッドへの呼び出しは、/ 文字を返します。 同様に、Liberty にマイグレーション時に Servlet 3.0 または 3.1 のフィーチャー実装環境を使用している場合は、デフォルトのサーブレット・マッピングの getServletPath への呼び出しは空ストリングを返し、getPathInfo メソッドへの呼び出しは / 文字を返します。

例えば、次のコードについて考えてみます。

< span class="Code"> @WebServlet("/")
public class TestServlet extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res) {
System.out.println("getServletPath: " + req.getServletPath());
System.out.println("getPathInfo: " + req.getPathInfo());
}
}

競合のアプリケーション・サーバーでは、このコードは以下の出力となります。

< span class="Code"> getServletパス: /some/path/to/servlet
getPathInfo: null

ただし、WebSphere traditional と Servlet 3.0 または 3.1 のある Liberty では、コーディングは以下のような出力になります。

< span class="Code"> getServletパス:
getPathInfo: /

WebSphere Liberty にマイグレーションしていて、Servlet 3.0 または 3.1 実装環境を使用している場合は、<webContainer servletPathForDefaultMapping="true"/> エレメントを server.xml 構成ファイルに追加します。このエレメントを追加すると、getServletPath メソッドおよび   getPathInfo メソッドは競合のアプリケーション・サーバーでの振る舞いと同様の振る舞いをします。 Servlet 4.0 実装環境を使用している場合は、変更は不要です。Servlet 4.0 実装環境の getServletPath および getPathInfo は、競合のアプリケーション・サーバーと同様の振る舞いとなります。

WebSphere traditional にマイグレーションしている場合は、WebContainer com.ibm.ws.webcontainer.EnableDefaultServletRequestPathElements プロパティーを true に設定します。 このプロパティーを設定すると、getServletPath メソッドおよび getPathInfo メソッド は競合のアプリケーション・サーバーでの振る舞いと同様の振る舞いをします。

追加情報については、以下を参照してください。