首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最大<jsp:include>深度

最大<jsp:include>深度
EN

Stack Overflow用户
提问于 2010-08-09 21:40:56
回答 2查看 1.8K关注 0票数 2

我们正在使用一个使用Weblogic Works10.3的应用程序构建,并在weblogic服务器10.3上运行。我正在尝试使用<jsp:include>递归调用jsp页面来显示数据树。我遇到的问题是,在大约3-4层深度之后,页面不再被渲染。围绕JSP的日志语句包括显示在执行之前和之后的行,但是jsp实际上从未被包括在内。jsp文件开头的日志语句表明,在该点上jsp中的任何一行都不会到达。

EN

回答 2

Stack Overflow用户

发布于 2010-08-09 22:03:22

从技术上讲,限制取决于servletcontainer和可用的堆内存。如果你走得太远,你会得到一个StackOverflowError。为了避免错过它,请再次检查特定于服务器的错误日志。

我使用以下代码片段解决了这个问题:

test.jsp

代码语言:javascript
复制
<!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

代码语言:javascript
复制
<%@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将标准错误记录到一个不同于标准输出的文件中。至于深度,Weblogic可能是一个重量级服务器。在包含JSP之前,可能会有很多前面的方法调用。

如果迭代不是一种解决方案,那么您唯一的选择就是。基本上,将结果作为方法参数传递,而不是依赖(等待)方法的返回值,这样就可以保存堆栈。不幸的是,使用普通的jsp:include无法做到这一点。你想写一个tagfile和/或一个helper类。

它的工作原理基本如下:

代码语言:javascript
复制
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>");
        }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2010-09-15 21:20:50

也许您应该使用合适的树组件(Javascript树或标记库)?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3440560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档