2011-09-01 18 views
6

में एक अनुरोध भेजने मुझे आशा है कि तुम मुझे इस समस्या का सामना करना पड़ रहा हूँ के साथ मदद कर सकते हैं:अनंत लूप जब एक जावा सर्वलेट

मैं NetBeans का उपयोग कर एक सरल वेब अनुप्रयोग बनाया। अभी तक, यह बहुत बुनियादी है।

  1. एक सर्वलेट /verificon/* यूआरएल पैटर्न पर अनुरोध प्राप्त करता है।
  2. यह /verificon/ के बाद जो भी स्ट्रिंग सेट किया गया है, यह निष्कर्ष निकाला जाता है, यानी यदि यूआरएल 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) 
    ... 

तो यह सिर्फ अपने आप को दोहरा रहता है।

मेरी सर्वलेट की प्रक्रियाRequest विधि निम्नानुसार है। 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() के लिए कॉल है। अनुरोध विधि, और लाइन 70 केवल doGet विधि से प्रक्रिया Request() को कॉल करने के लिए कॉल है। नोट 2: अगर मैं आगे अनुभाग पर टिप्पणी करता हूं और प्रिंटवाइटर सेक्शन को अनदेखा करता हूं तो सब कुछ अपेक्षित काम करता है। नोट 3: resultado.jsp उचित doctype डीईएफ़, एचटीएमएल, सिर और शरीर टैग और इस के साथ एक सादे HTML पृष्ठ है: <%boolean valido = (boolean)request.getAttribute("valido");%> ... <% if(valido) {%> <p>Válido</p> <% } else {%> <p>Inválido</p> <% }%>

उत्तर

9

यहाँ देखो,

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 के सापेक्ष पथ का उपयोग कर अग्रेषण कर रहा है जो सर्वलेट से दोबारा मेल खाता है। आदि। अगर आपने आने वाले अनुरोध यूआरआई को डीबग/लॉग किया है तो इससे सबकुछ अधिक स्पष्ट हो जाता।

आपको इसके बजाय एक पूर्ण पथ का उपयोग करने की आवश्यकता है। / के साथ इसे उपसर्ग करें।

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

असंबंधित ठोस समस्या, जिस तरह से आप कैसे JSP में मूल्य की जाँच कर रहे करने के लिए बहुत अनाड़ी और पुराने स्कूल है।बस EL का उपयोग करें (जो पहले से ही एक दशक से अधिक मौजूद हैं, यह सुनिश्चित करें कि आप उचित JSP/Servlet किताबें/ट्यूटोरियल पढ़ रहे हैं):

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

Pff, मैं विश्वास नहीं कर सकता मुझे लगता है कि याद किया! इस के साथ मेरी मदद करने के लिए धन्यवाद! इसके अलावा, ईएल का सुझाव देने के लिए धन्यवाद, मैं इसके साथ मिल जाऊंगा। – ahpoblete

+0

आपका स्वागत है। – BalusC

संबंधित मुद्दे