Java 最大值<;jsp:include>;深度
我们正在使用Weblogic Workshop 10.3构建应用程序,并在Weblogic server 10.3上运行。我试图使用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品牌和可用堆内存。如果你走得太远,你会得到一个堆栈溢出错误。如果您错过了,请再次检查特定
递归调用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之后开始出错
为了解决这个问题,您需要一个迭代包含而不是递归包含。JSTLc: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来写我想写的东西,因为在我试图显示的树结构中有无限多的级别。我将进一步讨论这个问题,我将再次发表评论。递归通常是不明智的解决方案。如果有“树”结构数据,请考虑编写和/或使用树组件。