Servlet 在调用 request.getRequestDispatcher 时陷入无限循环

问题描述 投票:0回答:1

我正在尝试创建一个启动 servlet (Start.java),它是我非常简单的网站的入口点。目前我有两个用于此启动 servlet 的映射:

@WebServlet({"/Start", "/Start/*"})

当用户首次加载页面时(调用 http://localhost:8080/MyApp/Start 时),会加载一个表单页面 (Form.jspx) 供他们填写(表单的详细信息并不重要)我遇到的问题)。我想要做的是当用户加载此页面时加载另一个 jsp 页面(Done.jspx):http://localhost:8080/MyApp/Start/Restore。当调用此页面时,我使用解组器将一些数据从 XML 文件恢复到我的数据库中。 Done.jspx 页面仅显示从 XML 文件插入了多少行,但我再次认为这对我的问题并不重要。

我遇到的问题是在我的 doGet 方法中,我正在检查 Restore 是否在 URI 中。如果不是,我将加载默认页面 Form.jspx。如果它在 URI 中,我将调用请求调度程序以转发到 Done.jspx。这导致了无限循环,因为当我在 Done.jspx 上调用调度程序时,它会加载 http://localhost:8080/MyApp/Start/Done.jspx ,它与上面的映射 (/Start/*) 匹配并导致 servlet在我加载 Form.jspx 页面(见下文)的行进入无限循环,最终导致堆栈溢出。

以下是我的doGet方法

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String URI = req.getRequestURI();
    System.out.println("URI: " + URI);

    if (URI.endsWith("Restore")) {
        String filename = this.getServletContext().getRealPath("/export/backup.xml");
        model.setPath(this.getServletContext().getRealPath("/export"));
        try {
            int n = model.importXML(filename);
            req.setAttribute("numInserted", n);
            req.getRequestDispatcher("Done.jspx").forward(req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }                                                           //load default form page
    else {
        req.getRequestDispatcher("Form.jspx").forward(req, resp);
    }
}

我对 Java EE 和 servlet 还很陌生,所以我可能以错误的方式解决这个问题。我想知道是否有办法解决这个问题,或者我是否错误地处理了不同的 URI 模式。

servlets stack-overflow infinite-loop
1个回答
1
投票

问题出在

"/Start/*"
模式上。它也会将
/Start/Done.jspx
重定向/转发到 servlet。这并不是您所期望的。

您应该制作两个不同的 servlet,一个用于

/Start
,另一个用于
/Start/Restore

--已编辑--

根据您的情况,您应该使用

@WebServlet({"/Start", "/Start/Restore"})
代替。

© www.soinside.com 2019 - 2024. All rights reserved.