2011-09-01 17 views
6

を要求を転送するとき、私はあなたが私が直面しています。この問題で私を助けることを願って:無限ループJavaサーブレットで

私は、NetBeansを使用して簡単なWebアプリケーションを作成しました。 今のところ、非常に基本的です。

  1. サーブレットは、/verificon/* URLパターンでリクエストを受信します。
  2. /verificon/の後に設定された文字列を抽出します。つまり、URLがhttp://domain/context/verificon/blahblahの場合、blahblahが抽出されます。
  3. このような文字列が既知の文字列かどうかを確認し、結果がtrueまたはfalseの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行目はprocessRequestメソッドの最後にrd.forward()を呼び出し、70行目は単にdoGetメソッドからprocessRequest()を呼び出すだけです。注2:前方セクションにコメントし、PrintWriterセクションのコメントを外すと、すべてが正常に機能します。 注3:resultado.jspは適切なデフDOCTYPE、htmlの、頭と体のタグとプレーンな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への相対パスを使用して順方向に転送されます。 Etcetera。入ってくるリクエストURIをデバッグ/ロギングしていれば、はるかに明確になりました。

代わりに絶対パスを使用して転送する必要があります。プレフィックスは/です。具体的な問題へ

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

無関係、あなたはJSPに値をチェックしているどのような方法は非常に不器用な、古い学校です。ただ、EL使用(十年間ですでに存在して、あなたは適切なJSP /サーブレット書籍/チュートリアルを読んでいることを確認してください):

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

PFFは、私はそれを逃した信じることができません!これで私を助けてくれてありがとう!また、ELの提案に感謝します。 – ahpoblete

+0

ようこそ。 – BalusC