2

Weblogic Workshop 10.3 を使用してビルドされたアプリケーションを使用し、weblogic サーバー 10.3 で実行しています。を使用してjspページへの再帰呼び出しを使用して、データのツリーを表示しようとしています<jsp:include>。私が抱えている問題は、約3〜4層の深さでページがレンダリングされなくなることです。JSP インクルードに関するログ ステートメントには、実行前と実行後の行が表示されますが、jsp は実際にはインクルードされません。jsp ファイルの先頭にあるログ ステートメントは、その時点で jsp 内の 1 行にも到達していないことを示しています。

4

2 に答える 2

4

技術的には、制限は servletcontainer の make と利用可能なヒープ メモリによって異なります。行き過ぎるとStackOverflowError. 見逃した可能性があるため、サーバー固有のエラー ログをもう一度確認してください。

次のスニペットを使用して遊んでみました。

test.jsp:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>SO question 3440560</title>
    </head>
    <body>
        <jsp:include page="include.jsp?count=${param.count}" />
    </body>
</html>

include.jsp:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if test="${param.count > 0}">
    <p>include ${param.count}</p>
    <jsp:include page="include.jsp?count=${param.count - 1}" />
</c:if>

デフォルトの最大ヒープ メモリが 64MB の標準的な Tomcat 6.0.24 セットアップでは、~200 個のインクルード後にエラーが発生し始めました。

これを回避するには、再帰的なインクルードではなく反復的なインクルードが必要です。これには JSTLc:forEachが役立つ場合があります。


更新: Weblogic についてはよくわかりませんが、Tomcat は stderr を stdout とは別のファイルに記録します。深さに関しては、Weblogic は重量級のサーバーかもしれません。JSP を組み込む前に、先行するメソッド呼び出しが多数ある場合があります。

反復が解決策でない場合、唯一の手段は末尾再帰です。基本的に、メソッドの戻り値に依存する (待機する) のではなく、メソッドの引数として結果を渡します。このようにして、スタックを保存します。残念ながら、これは plain を使用して行うことはできませんjsp:include。タグファイルやヘルパー クラスを書きたいとします。

基本的には次のように機能します。

public void renderHTML(List<Node> nodes, StringBuilder output) { 
    output.append("<li>" + node.getContent() + "</li>"); 
    for (Node node : nodes) {
        if (node.hasChildren()) {
            output.append("<ul>");
            renderHTML(node.getChildren(), output);
            output.append("</ul>");
        }
    }
}
于 2010-08-09T14:03:21.727 に答える
0

おそらく、適切なツリー コンポーネント (Javascript ツリーまたはタグ ライブラリ) を使用する必要があります。

于 2010-09-15T13:20:50.337 に答える