Loop tak terbatas saat meneruskan permintaan di Java Servlet

Saya harap Anda dapat membantu saya dengan masalah yang saya hadapi ini:

Saya membuat aplikasi web sederhana menggunakan NetBeans. Untuk saat ini, ini adalah hal yang sangat mendasar.

  1. Sebuah servlet menerima permintaan pada pola url /verificon/*.
  2. Ini mengekstrak string apa pun yang disetel setelah /verificon/, yaitu jika urlnya http://domain/context/verificon/blahblah, ia mengekstrak blahblah.
  3. Ia memeriksa apakah string tersebut adalah string yang dikenal, dan hanya menampilkan jsp dengan hasilnya (benar/salah).

Namun, sesederhana itu, saya mendapatkan kesalahan berikut saat menjalankan aplikasi dengan string pengujian:

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

Lalu hal itu terus terulang kembali.

Metode processRequest servlet saya adalah sebagai berikut. TestData tidak lain adalah kelas pembantu yang mengembalikan objek Mapeo jika stringnya diketahui atau null jika tidak.

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

}

Bantuan apa pun sangat dihargai.

Jika ada informasi tambahan yang perlu Anda ketahui, tolong beri tahu saya.

Terima kasih!

Catatan 1: Baris 51 dari servlet adalah panggilan ke rd.forward() di akhir metode processRequest, dan baris 70 hanyalah panggilan ke processRequest() dari metode doGet. Catatan 2: Semuanya berfungsi seperti yang diharapkan jika saya mengomentari bagian penerusan dan menghapus komentar pada bagian PrintWriter. Catatan 3: resultado.jsp adalah halaman HTML biasa dengan tag doctype def, html, head dan body yang tepat dan ini: <%boolean valido = (boolean)request.getAttribute("valido");%> ... <% if(valido) {%> <p>Válido</p> <% } else {%> <p>Inválido</p> <% }%>


person ahpoblete    schedule 01.09.2011    source sumber


Jawaban (1)


Lihat disini,

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

Anda meneruskan menggunakan jalur relatif. Itu diteruskan ke http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp yang cocok dengan servlet lagi. Hal ini pada gilirannya meneruskan menggunakan jalur relatif ke http://domain/context/verificon/blahblah/WEB-INF/jsp/resultado.jsp/WEB-INF/jsp/resultado.jsp yang cocok dengan servlet lagi. Dan sebagainya. Itu akan membuat segalanya lebih jelas jika Anda telah men-debug/mencatat URI permintaan masuk.

Anda harus meneruskan menggunakan jalur absolut. Awali dengan /.

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

Tidak ada hubungannya dengan masalah nyata, cara Anda memeriksa nilai di JSP sangat kikuk dan kuno. Cukup gunakan EL (yang sudah ada lebih dari satu dekade, pastikan Anda membaca buku/tutorial JSP/Servlet yang tepat) :

<p>${valido ? 'Válido' : 'Inválido'}</p>
person BalusC    schedule 01.09.2011
comment
Pff, aku tidak percaya aku melewatkannya! Terima kasih telah membantu saya dengan yang satu ini!. Juga, terima kasih telah menyarankan EL, saya akan melanjutkannya. - person ahpoblete; 01.09.2011