我正在尝试创建一个启动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模式。