วนซ้ำไม่สิ้นสุดเมื่อส่งต่อคำขอใน Java Servlet

ฉันหวังว่าคุณจะสามารถช่วยฉันในการแก้ไขปัญหานี้:

ฉันสร้างเว็บแอปพลิเคชันอย่างง่ายโดยใช้ NetBeans ณ ตอนนี้ มันเป็นพื้นฐานมาก

  1. เซิร์ฟเล็ตได้รับการร้องขอในรูปแบบ /verificon/* url
  2. มันจะแยกสตริงใดก็ตามที่ตั้งไว้หลัง /verificon/ เช่น หาก url เป็น http://domain/context/verificon/blahblah มันจะแยก blahblah
  3. จะตรวจสอบว่าสตริงดังกล่าวเป็นสตริงที่รู้จักหรือไม่ และเพียงแสดง jsp พร้อมผลลัพธ์ (จริง / เท็จ)

อย่างไรก็ตาม อย่างง่ายๆ ก็คือ ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อเรียกใช้แอปพลิเคชันด้วยสตริงทดสอบ:

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 ธรรมดาที่มีแท็กประเภท def, 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