Java Servlet RequestDispatcher没有转发url

时间:2012-11-04 04:47:22

标签: java servlets requestdispatcher

我在Java Servlet中遇到RequestDispatcher的问题,如果servlet路径不在根路径中,它没有转发到特定的URL

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String userPath=request.getServletPath();
    String view = null;

    if(userPath.equals("/admin")) //it's okay, forwarded
    {
            view="admin";
    }
    else if(userPath.equals("/admin/tambahArtikel")) //it's not forwarded
    {
        view="tambahArtikel";
    }
    else if(userPath.equals("/kategori")) //it's okay, forwarded
    {
        view="kategori";
    }
    String url="WEB-INF/view/"+ view +".jsp";

   request.getRequestDispatcher(url).forward(request, response);
}

这是我的web.xml

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
    <servlet-name>ServletController</servlet-name>
    <servlet-class>com.agung.webhakakses.servlet.ServletController</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletController</servlet-name>
    <url-pattern>/admin</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ServletController</servlet-name>
    <url-pattern>/admin/tambahArtikel</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ServletController</servlet-name>
    <url-pattern>/kategori</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>

我认为问题出在路径上,但我不确定

1 个答案:

答案 0 :(得分:4)

来自ServletRequest#getRequestDispatcher javadoc

  

指定的路径名​​可能是相对的,但不能扩展   在当前servlet上下文之外。如果路径以“/”开头   被解释为相对于当前上下文根。这种方法   如果servlet容器无法返回a,则返回null   RequestDispatcher的。

在您的代码中,您可以通过以下方式构建网址:

String url="WEB-INF/view/"+ view +".jsp";

所以,正如javadoc也说:

  

这种方法与之间的区别   ServletContext#getRequestDispatcher是这个方法可以采取的   相对路径。

因此,如果您的请求URI为"/admin/tambahArtikel"且您的转发URI未以"/"开头,那么它将是相对的,因此转发将被发送至"/admin/" + "WEB-INF/view/"+ view +".jsp"

如果您需要转发到WEB-INF目录中的资源,请使用“/”启动您的URI,以便路径相对于上下文根。