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)