Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最大值<;jsp:include>;深度_Java_Jsp_Recursion_Weblogic_Jspinclude - Fatal编程技术网

Java 最大值<;jsp:include>;深度

Java 最大值<;jsp:include>;深度,java,jsp,recursion,weblogic,jspinclude,Java,Jsp,Recursion,Weblogic,Jspinclude,我们正在使用Weblogic Workshop 10.3构建应用程序,并在Weblogic server 10.3上运行。我试图使用递归调用jsp页面来显示数据树。我遇到的问题是,在大约3-4层之后,页面不再呈现。围绕JSP include的日志语句显示了执行后的前几行,但JSP实际上从未被包含。jsp文件开头的日志语句表明,在该点上jsp中没有一行到达。从技术上讲,限制取决于servletcontainer品牌和可用堆内存。如果你走得太远,你会得到一个堆栈溢出错误。如果您错过了,请再次检查特定

我们正在使用Weblogic Workshop 10.3构建应用程序,并在Weblogic server 10.3上运行。我试图使用
递归调用jsp页面来显示数据树。我遇到的问题是,在大约3-4层之后,页面不再呈现。围绕JSP include的日志语句显示了执行后的前几行,但JSP实际上从未被包含。jsp文件开头的日志语句表明,在该点上jsp中没有一行到达。

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

我使用了以下代码片段:

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>
<%@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 includes之后开始出错

为了解决这个问题,您需要一个迭代包含而不是递归包含。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>");
        }
    }
}
public void renderHTML(列表节点,StringBuilder输出){
output.append(“
  • ”+node.getContent()+“
  • ”); 用于(节点:节点){ if(node.hasChildren()){ 输出。追加(“
      ”); renderHTML(node.getChildren(),输出); 输出。追加(“
    ”); } } }
    也许您应该使用适当的树组件(Javascript树或标记库)???

    我在日志中搜索该错误,但在任何地方都看不到,这并不意味着它不存在。当然,我的问题只发生在3-4层而不是200层,我不认为我会很快就离开堆空间。再说一次,这并不意味着我不是。我认为我不可能用一个迭代的include来写我想写的东西,因为在我试图显示的树结构中有无限多的级别。我将进一步讨论这个问题,我将再次发表评论。递归通常是不明智的解决方案。如果有“树”结构数据,请考虑编写和/或使用树组件。