S_a_k_Uの日記みたいなDB

~サクゥーと呼ばないで~

RequestDispatcherの出所とforwardと絶対パスと相対パス

Servletでforwardする場合、RequestDispatcherオブジェクトを取得して転送するが、RequestDispatcherオブジェクトをServletContextまたはServletRequestから取得する際に、動作が異なり

ServletContextから取得 絶対パスのみOK
ServletRequestから取得 絶対パス相対パスがOK

となる。
Tomcat 6.0.13

public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    //RequestDispatcher rd = getServletContext().getRequestDispatcher("/test.html");  // OK
    //RequestDispatcher rd = getServletContext().getRequestDispatcher("test.html");   // NG
    //RequestDispatcher rd = arg0.getRequestDispatcher("/test.html");                 // OK
    //RequestDispatcher rd = arg0.getRequestDispatcher("test.html");                  // OK
    rd.forward(arg0, arg1);
}

ちなみにNGの場合のスタックトレースは以下の通り。(サーブレットtest.ForwardServletクラスにて確認)

java.lang.IllegalArgumentException: パス test.html が"/"文字で始まりません
  at org.apache.catalina.core.ApplicationContext.getRequestDispatcher(ApplicationContext.java:368)
  at org.apache.catalina.core.ApplicationContextFacade.getRequestDispatcher(ApplicationContextFacade.java:196)
  at test.ForwardServlet.service(ForwardServlet.java:24)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
  at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
  at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
  at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
  at java.lang.Thread.run(Thread.java:619)

■参考サイト
Javaの道:Servlet(7.include、forward)
サーブレット-TECHSCORE-