Weblogic Workshop 10.3 を使用してビルドされたアプリケーションを使用し、weblogic サーバー 10.3 で実行しています。を使用してjspページへの再帰呼び出しを使用して、データのツリーを表示しようとしています<jsp:include>
。私が抱えている問題は、約3〜4層の深さでページがレンダリングされなくなることです。JSP インクルードに関するログ ステートメントには、実行前と実行後の行が表示されますが、jsp は実際にはインクルードされません。jsp ファイルの先頭にあるログ ステートメントは、その時点で jsp 内の 1 行にも到達していないことを示しています。
2 に答える
技術的には、制限は 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>");
}
}
}
おそらく、適切なツリー コンポーネント (Javascript ツリーまたはタグ ライブラリ) を使用する必要があります。