Бесконечный цикл при пересылке запроса в сервлете Java

Я надеюсь, что вы можете помочь мне с этой проблемой, с которой я столкнулся:

Я создал простое веб-приложение с помощью NetBeans. На данный момент это очень просто.

  1. Сервлет получает запросы по шаблону URL-адреса /verificon/*.
  2. Он извлекает любую строку, установленную после /verificon/, то есть, если URL-адрес был http://domain/context/verificon/blahblah, он извлекает blahblah.
  3. Он проверяет, является ли такая строка известной строкой, и просто отображает jsp с результатом (true/false).

Однако, как бы просто это ни было, я получаю следующую ошибку при запуске приложения с тестовой строкой:

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)
    ...

Потом это просто повторяется.

Метод моего сервлета 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: Строка 51 сервлета — это вызов rd.forward() в конце метода processRequest, а строка 70 — просто вызов processRequest() из метода doGet. Примечание 2. Все работает, как и ожидалось, если я прокомментирую раздел пересылки и раскомментирую раздел PrintWriter. Примечание 3: resultado.jsp — это обычная HTML-страница с правильными тегами doctype, html, head и body, а также это: <%boolean valido = (boolean)request.getAttribute("valido");%> ... <% if(valido) {%> <p>Válido</p> <% } else {%> <p>Inválido</p> <% }%>


person ahpoblete    schedule 01.09.2011    source источник


Ответы (1)


Смотри сюда,

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

Вы пересылаете по относительному пути. Он перенаправляется на http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp, который снова соответствует сервлету. Он, в свою очередь, использует относительный путь к http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp/WEB-INF/jsp/resultado.jsp, который снова соответствует сервлету. И так далее. Было бы намного понятнее, если бы вы отладили/записали URI входящего запроса.

Вместо этого вам нужно перенаправить, используя абсолютный путь. Добавьте префикс /.

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

Не связанный с конкретной проблемой способ проверки значения в JSP очень неуклюжий и устаревший. Просто используйте EL (которые существуют уже более десяти лет, убедитесь, что вы читаете правильные книги/учебники JSP/Servlet) :

<p>${valido ? 'Válido' : 'Inválido'}</p>
person BalusC    schedule 01.09.2011
comment
Пфф, не могу поверить, что пропустил это! Спасибо, что помогли мне с этим!. Кроме того, спасибо за предложение EL, я продолжу. - person ahpoblete; 01.09.2011