4

我对 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>

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

4

1 回答 1

4

从 ServletRequest#getRequestDispatcher javadoc

指定的路径名​​可以是相对的,尽管它不能扩展到当前 servlet 上下文之外。如果路径以“/”开头,则将其解释为相对于当前上下文根。如果 servlet 容器无法返回 RequestDispatcher,则此方法返回 null。

在您的代码中,您以这种方式构建 url:

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

因此,正如 javadoc 还说的:

该方法与 ServletContext#getRequestDispatcher 的区别在于该方法可以走相对路径。

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

如果您需要转发到WEB-INF目录中的资源,请以“/”开头您的 URI,因此路径将相对于上下文根。

于 2012-11-04T05:25:20.400 回答