调用request.getRequestDispatcher时,Java Servlet运行进入无限循环

时间:2018-04-02 01:47:50

标签: java servlets java-ee stack-overflow infinite-loop

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

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

当用户首次加载页面时(调用http://localhost:8080/MyApp/Start时),表单页面被加载(Form.jspx)供他们填写(表单的详细信息对于问题我来说并不重要)具有)。我想要做的是在用户加载此页面时加载另一个jsp页面(Done.jspx):http://localhost:8080/MyApp/Start/Restore。调用此页面时,我使用unmarshaller将一些数据从XML文件恢复到我的数据库中。 Done.jspx页面只显示从XML文件中插入的行数,但我不认为这对我的问题很重要。

我遇到的问题是在我的doGet方法中,我正在检查Restore是否在URI中。如果不是,我加载默认页面,即Form.jspx。如果它在URI中,我调用请求调度程序转发到Done.jspx。这导致无限循环,因为当我在Done.jspx上调用调度程序时,它加载http://localhost:8080/MyApp/Start/Done.jspx,它匹配上面的映射(/ Start / *)并导致servlet进入我所在行的无限循环m加载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模式。

1 个答案:

答案 0 :(得分:0)

问题在于"/Start/*"模式。它也会将/Start/Done.jspx重定向/转发到servlet。这不会是你所期待的。

你应该制作两个不同的servlet,一个用于/Start,另一个用于/Start/Restore

- 编辑 -

根据您的情况,您应该使用@WebServlet({"/Start", "/Start/Restore"})代替。