我正在尝试创建一个启动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模式。
答案 0 :(得分:0)
问题在于"/Start/*"
模式。它也会将/Start/Done.jspx
重定向/转发到servlet。这不会是你所期待的。
你应该制作两个不同的servlet,一个用于/Start
,另一个用于/Start/Restore
- 编辑 -
根据您的情况,您应该使用@WebServlet({"/Start", "/Start/Restore"})
代替。