2

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

4

2 回答 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 回答