1. 概要

このクイックチュートリアルでは、 HttpServletRequestクラスのgetRequestURI() getPathInfo()の違いについて説明します。

2. getRequestURI() getPathInfo()の違い

関数 getRequestURI() 要求された完全なURIを返します。 これには、デプロイメントフォルダとサーブレットマッピング文字列が含まれます。 また、すべての追加のパス情報を返します。

関数getPathInfo() は、サーブレットに渡されたパスのみを返します。 追加のパス情報が渡されない場合、この関数はnullを返します。

つまり、アプリケーションをWebサーバーのルートにデプロイし、「/」にマップされたサーブレットを要求すると、getRequestURI()とgetPathInfo()の両方が同じstringを返します。 それ以外の場合は、異なる値を取得します。

3. リクエストの例

HttpServletRequest メソッドをよりよく理解するために、次のURLからアクセスできるサーブレットがあるとします。

http://localhost:8080/deploy-folder/servlet-mapping

このリクエストは、「deploy-folder」内にデプロイされたWebアプリケーションの「servlet-mapping」サーブレットにヒットします。 したがって、このリクエストに対して getRequestURI() getPathInfo()を呼び出すと、異なる文字列が返されます。

簡単なdoGet()サーブレットメソッドを作成しましょう。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
    PrintWriter writer = response.getWriter();
    if ("getPathInfo".equals(request.getParameter("function")) {
        writer.println(request.getPathInfo());
    } else if ("getRequestURI".equals(request.getParameter("function")) {
        writer.println(request.getRequestURI());
    }
    writer.flush();
}

まず、curlコマンドによってフェッチされたgetRequestURIリクエストのサーブレットの出力を見てみましょう。

curl http://localhost:8080/deploy-folder/servlet-mapping/request-path?function=getRequestURI
/deploy-folder/servlet-mapping/request-path

同様に、getPathInfoのサーブレットの出力を見てみましょう。

curl http://localhost:8080/deploy-folder/servlet-mapping/request-path?function=getPathInfo
/request-path

4. 結論

この記事では、HttpServletRequest のgetRequestURI()とgetPathInfo()のの違いについて説明しました。 また、サーブレットとリクエストの例を使用してデモを行いました。

いつものように、これらすべての機能をテストするために実装されたサーブレットは、Github利用できます。