RequestDispatcher#forward不只是呈现页面?

时间:2012-05-18 04:07:51

标签: jsp java-ee servlets rendering

在我的web.xml中,我设置了一个像

这样的servlet
<servlet>
    <servlet-name>forward</servlet-name>
    <servlet-class>test.Forward</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>forward</servlet-name>
    <url-pattern>/f/*</url-pattern>
</servlet-mapping>

test.Forward#doGet实现为

protected void doGet(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
    req.getRequestDispatcher("target.jsp").forward(req, resp);
}

访问 localhost:8080 / project / f / anypath 时,服务器因堆栈溢出错误而崩溃。

似乎RequestDispatcher#forward /f/target.jsp 设置了另一个请求,然后再次调用test.Forward#doGet,然后再次调用RequestDispatcher#forward。我以某种方式误解了{{1}},我认为它只是渲染一个页面。

那么,有没有只提供JSP的方法?

1 个答案:

答案 0 :(得分:1)

您的servlet路径是/ f / *,并且您正在重定向到该路径上的文件,很可能是无意中:

/f/target.jsp

因此,当您的servlet不断地一次又一次地调用自身时,这会创建一个无限循环。

如果你想重定向到JSP,我假设它位于另一个文件夹,如/jsp/target.jsp位置?如果是这样,那么请确保包含完整路径:

req.getRequestDispatcher("/jsp/target.jsp").forward(req, resp);

当您遗漏/时,请求会相对于当前的requestURI转发。