代码之家  ›  专栏  ›  技术社区  ›  Blunti

Java Servlet在调用请求时运行到无限循环中。getRequestDispatcher

  •  0
  • Blunti  · 技术社区  · 7 年前

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

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

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

    我遇到的问题是在我的doGet方法中,我正在检查Restore是否在URI中。如果不是,则加载默认页面,即表单。jspx。如果它在URI中,我调用请求调度器转发到Done。jspx。这导致了一个无限循环,因为当我调用dispatcher on Done时。it加载的jspx http://localhost:8080/MyApp/Start/Done.jspx 这与上面的映射(/Start/*)匹配,并导致servlet在加载表单的行进入无限循环。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和servlets仍然很陌生,所以我可能以错误的方式处理这个问题。我想知道是否有办法解决这个问题,或者我是否错误地处理了不同的URI模式。

    1 回复  |  直到 7 年前
        1
  •  0
  •   John    7 年前

    问题在于 "/Start/*" 图案它将重定向/转发 /Start/Done.jspx 到servlet。这并不是你所期望的。

    您应该创建两个不同的servlet,一个用于 /Start ,另一个用于 /Start/Restore

    --已编辑--

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