我在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>
我认为问题出在路径上,但我不确定
答案 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,以便路径相对于上下文根。