2011-09-01 29 views
6

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.

  1. Un servlet recibe solicitudes en el patrón de url /verificon/*.
  2. Extrae cualquier cadena que se establezca después de /verificon/, es decir, si la url era http://domain/context/verificon/blahblah, extrae blahblah.
  3. 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> <% }%>

Respuesta

9

mira aquí,

String respuesta = "WEB-INF/jsp/resultado.jsp"; 
RequestDispatcher rd = request.getRequestDispatcher(respuesta); 
// ... 

Estás expedición con una ruta relativa . Se está reenviando al http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp que coincide con el servlet nuevamente. A su vez, se reenvía usando una ruta relativa a http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp/WEB-INF/jsp/resultado.jsp que coincide con el servlet nuevamente. Etcétera Hubiera dejado todo mucho más claro si ha depurado/registrado el URI de solicitud entrante.

En su lugar, debe reenviar utilizando una ruta absoluta. Prefíjelo con /.

String respuesta = "/WEB-INF/jsp/resultado.jsp"; 
// ... 

Sin relación al problema concreto, la manera cómo se está comprobando el valor en JSP es muy torpe y vieja escuela.Sólo tiene que utilizar EL (que ya existe más de una década, asegúrese de que usted está leyendo los libros adecuados JSP/servlet/tutoriales):

<p>${valido ? 'Válido' : 'Inválido'}</p> 
+0

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

+0

De nada. – BalusC

Cuestiones relacionadas