gpt4 book ai didi

java - 最大 depth

转载 作者:行者123 更新时间:2023-11-30 07:36:36 27 4
gpt4 key购买 nike

我们正在使用使用 Weblogic Workshop 10.3 构建并在 weblogic server 10.3 上运行的应用程序。我正在尝试使用 <jsp:include> 通过对 jsp 页面的递归调用来显示数据树.我遇到的问题是,在大约 3-4 层深之后,页面不再呈现。 JSP 周围的日志语句包括显示执行前后的行,但 jsp 从未真正包含在内。 jsp 文件开头的日志语句表明 jsp 中的任何一行都未到达该点。

最佳答案

从技术上讲,限制取决于 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 次包含后开始出错。

为了解决这个问题,您希望有一个迭代包含而不是递归包含。 JSTL c:forEach 可能对此有所帮助。


更新:我不确定 Weblogic,但 Tomcat 将 stderr 记录到与 stdout 不同的文件。至于深度,Weblogic 可能是一个重量级的服务器。在包含 JSP 之前可能有很多前面的方法调用。

如果迭代不是解决方案,那么您唯一的选择是 tail recursion .基本上,将结果作为方法参数传递而不是依赖(等待)方法的返回值,这样就可以保存堆栈。不幸的是,使用普通的 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>");
}
}
}

关于java - 最大 <jsp :include> depth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3440560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com