espero que usted me puede ayudar con este problema que estoy enfrentando:bucle infinito cuando la transmisión de una solicitud en un servlet de Java
he creado una sencilla aplicación web utilizando NetBeans. A partir de ahora, es muy básico.
- Un servlet recibe solicitudes en el patrón de url
/verificon/*
. - Extrae cualquier cadena que se establezca después de
/verificon/
, es decir, si la url erahttp://domain/context/verificon/blahblah
, extraeblahblah
. - Comprueba si dicha cadena es una cadena conocida, y simplemente muestra una jsp con el resultado (verdadero/falso).
Sin embargo, tan simple como es, me sale el siguiente error al ejecutar la aplicación con una cadena de prueba:
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)
...
Entonces, sólo sigue repitiéndose.
El método processRequest de mi servlet es el siguiente. TestData
no es más que una clase auxiliar que devuelve un objeto Mapeo
si la cadena es conocida o null
si no lo es.
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);
}
Cualquier ayuda es muy apreciada.
Si hay alguna información adicional que necesita saber, por favor dígame.
¡Gracias!
Nota 1: la línea 51 del servlet es la llamada a rd.forward() al final del método processRequest, y la línea 70 es simplemente la llamada a processRequest() desde el método doGet. Nota 2: Todo funciona como se espera si comento la sección de reenvío y elimino el comentario de la sección PrintWriter. Nota 3: resultado.jsp es una página HTML plano con DOCTYPE adecuado def, html, etiquetas de la cabeza y el cuerpo y esto: <%boolean valido = (boolean)request.getAttribute("valido");%> ... <% if(valido) {%> <p>Válido</p> <% } else {%> <p>Inválido</p> <% }%>
Pff, no puedo creer que me perdí! Gracias por ayudarme con esto !. Además, gracias por sugerir a EL, voy a continuar con eso. – ahpoblete
De nada. – BalusC