2

サーベットJSPから提供するファイルで次のコードを使用しています。AppEngine

<script type="text/javascript" >
    var role = <%= request.getAttribute("role") %>;
</script>

変数はServlet次を使用して設定されます。

req.setAttribute("role", role );
req.getRequestDispatcher("index.jsp").forward(req, resp);

コードは AppEngine の本番環境では問題なく動作しますが、ローカルの開発サーバーではすぐに次の結果が得られます。

Problem accessing /. Reason:

INTERNAL_SERVER_ERROR
Caused by:

java.lang.StackOverflowError
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.setAttribute(Dispatcher.java:438)
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.setAttribute(Dispatcher.java:438)
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.setAttribute(Dispatcher.java:438)
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.setAttribute(Dispatcher.java:438)
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.setAttribute(Dispatcher.java:438)
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.setAttribute(Dispatcher.java:438)
at org.mortbay.jetty.servlet.Dispatcher$ForwardAttributes.setAttribute(Dispatcher.java:438)

これは永遠のように続きます。デバッグ中に、サーブレット コードが無限に呼び出されていることも確認できます。

AppEngine の運用に関する同様の問題への参照がいくつか見つかりましたが、AppEngine 開発サーバーで実行可能な修正は見つかりませんでした。

何か案が ??

4

2 に答える 2

4

変数を明示的に設定することなく、Google App Engine を使用してサーブレットから JSP に転送するときに、同様の問題に遭遇しました。

req.getRequestDispatcher("game.jsp").forward(req, resp);

私の場合、web.xmlに次の行があったため、それが判明しました(キャッチオールURLパターンに注意してください:

<servlet-mapping>
    <servlet-name>GameServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

これも JSP パスをキャッチしていたため、ループしていたと思います。私がそれを変更すると、キャッチオールではなくなります。次のように:

<servlet-mapping>
    <servlet-name>GameServlet</servlet-name>
    <url-pattern>/game</url-pattern>
</servlet-mapping>
于 2015-09-09T01:06:07.640 に答える
0

応答で属性を設定していますか?

req.setAttribute("role", role );

送信する応答ではなく、サーブレットに着信した要求に設定しているようです。

于 2012-07-15T20:59:08.377 に答える