我们正在使用使用 Weblogic Workshop 10.3 构建并在 weblogic server 10.3 上运行的应用程序。我正在尝试使用对 jsp 页面的递归调用来显示数据树<jsp:include>
。我遇到的问题是,在大约 3-4 层深之后,页面不再呈现。围绕 JSP 的日志语句包括在它执行之后显示之前的行,但 jsp 从未真正被包括在内。jsp 文件开头的日志语句表明在该点没有到达 jsp 内的任何一行。
问问题
1821 次
2 回答
4
从技术上讲,该限制取决于 servletcontainer 的品牌和可用的堆内存。如果你走得太远,你会得到一个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 回答