繁体   English   中英

最大值 <jsp:include> 深度

[英]Maximum <jsp:include> depth

我们正在使用通过Weblogic Workshop 10.3构建的应用程序,并在weblogic服务器10.3上运行。 我正在尝试使用<jsp:include>递归调用jsp页面来显示数据树。 我遇到的问题是,在大约3-4层深度之后,页面不再呈现。 JSP周围的日志语句在执行之后显示了一行,但实际上从未包含过jsp。 jsp文件开始处的日志语句表明,此时尚未到达jsp内部的任何一行。

从技术上讲,限制取决于servlet容器的制造商和可用的堆内存。 如果距离太远,则会收到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>

包含〜200后,默认最大堆内存为64MB的标准Tomcat 6.0.24安装程序开始出错。

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


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

如果迭代不是解决方案,那么您唯一的办法就是尾递归 基本上,将结果作为方法参数传递,而不是依赖(等待)方法的返回值,这样可以节省堆栈。 不幸的是,使用纯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树或标记库)?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM