HttpServletRequestオブジェクトのURL解析機能

サーブレット側で受け取ったリクエストをHttpServletRequestオブジェクトから簡単に解析することができる。この例を示す。

import java.util.stream.*;

import javax.servlet.http.*;

/**
 * httpリクエストを要素に分解して表示する。
 * 
 * <h2>URLパターンが"/user/*"の場合</h2>
 * 
 * <h3>コンテキストパス無し(ルートコンテキスト)の場合</h3>
 * <p>
 * つまり、サーブレットコンテナ側で"/"が指定されている場合。
 * </p>
 * <pre>
 * http://localhost:8080/user/1/2?query=1
 * </pre>
 * 以下になる。
 * <pre>
 * scheme:http, serverName:localhost, serverPort:8080, 
 * contextPath:, servletPath:/user, pathInfo:/1/2, params:query=1
 * </pre>
 * 
 * <h3>コンテキストパスが設定されている場合</h3>
 * <p>
 * コンテキストパスが"/test"だとすると。
 * </p>
 * <pre>
 * http://localhost:8080/test/user/1/2?query=1
 * </pre>
 * これは以下になる
 * <pre>
 * scheme:http, serverName:localhost, serverPort:8080, 
 * contextPath:/test, servletPath:/user, pathInfo:/1/2, params:query=1
 * </pre>
 *
 * <h2>URLパターンに"/user"も含めた場合</h2>
 * <pre>
 * http://localhost:8080/test/user?query=1
 * </pre>
 * 上の結果は
 * <pre>
 * scheme:http, serverName:localhost, serverPort:8080, 
 * contextPath:/test, servletPath:/user, pathInfo:null, params:query=1
 * </pre>
 * 
 * @author ysugimura
 */
public class RequestElements {
  public static void show(HttpServletRequest r) {
    System.out.println(
      "scheme:" + r.getScheme() + 
      ", serverName:" + r.getServerName() + 
      ", serverPort:" + r.getServerPort() +
      ", contextPath:" + r.getContextPath() + 
      ", servletPath:" + r.getServletPath() + 
      ", pathInfo:" + r.getPathInfo() +
      ", params:" + r.getParameterMap().entrySet().stream() 
      .map(e->e.getKey() + "=" + e.getValue()[0]).collect(Collectors.joining(","))
    );
  }
}

参考