servlets – 在Java Servlet中转发请求时的无限循环
我希望你能帮助我解决我面临的这个问题:
我使用NetBeans创建了一个简单的Web应用程序. > servlet接收/ verificon / * url模式的请求. 但是,尽管很简单,但在使用测试字符串运行应用程序时出现以下错误: javax.servlet.ServletException: The server side component of the HTTP Monitor has detected a java.lang.StackOverflowError. This happens when there is an infinite loop in the web module. Correct the cause of the infinite loop before running the web module again. org.netbeans.modules.web.monitor.server.MonitorFilter.rethrow(MonitorFilter.java:1648) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:473) mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51) mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51) mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:621) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) mx.tegu.kdor.web.iu.ServletVerificon.processRequest(ServletVerificon.java:51) mx.tegu.kdor.web.iu.ServletVerificon.doGet(ServletVerificon.java:70) ... 然后它不断重复自己. 我的servlet的processRequest方法如下. TestData只是一个辅助类,如果字符串已知则返回Mapeo对象,如果不知道则返回null. protected void processRequest(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { request.setCharacterEncoding("UTF-8"); String h = request.getRequestURI().replaceFirst(request.getContextPath() + "/verificon/",""); TestData td = TestData.getInstance(); Mapeo m = td.getMapeo(h); boolean valido = false; if(m != null) { valido = true; } request.setAttribute("valido",valido); /* PrintWriter out = response.getWriter(); out.write("Válido?: " + valido); out.close(); */ String respuesta = "WEB-INF/jsp/resultado.jsp"; // Como regla general,forward se utiliza para los GET y sendRedirect para los POST RequestDispatcher rd = request.getRequestDispatcher(respuesta); rd.forward(request,response); } 任何帮助都非常感谢. 如果您需要了解任何其他信息,请告诉我. 谢谢! 注1:servlet的第51行是在processRequest方法结束时对rd.forward()的调用,第70行只是从doGet方法调用processRequest(). 解决方法
看这里,
String respuesta = "WEB-INF/jsp/resultado.jsp"; RequestDispatcher rd = request.getRequestDispatcher(respuesta); // ... 您使用相对路径转发.它转发到http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp,它再次与servlet匹配.然后使用相对路径转发到http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp/WEB-INF/jsp/resultado.jsp,它再次匹配servlet.等等.如果您已调试/记录传入的请求URI,它会使一切变得更加清晰. 您需要使用绝对路径转发.用/前缀. String respuesta = "/WEB-INF/jsp/resultado.jsp"; // ... 与具体问题无关,你在JSP中检查值的方式非常笨拙和老派.只需使用EL(已存在十多年,确保您正在阅读正确的JSP / Servlet书籍/教程): <p>${valido ? 'Válido' : 'Inválido'}</p> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |