2010-08-09 61 views
2

我們使用的是使用Weblogic Workshop 10.3並在weblogic服務器10.3上運行的應用程序構建。我試圖使用<jsp:include>遞歸調用jsp頁面來顯示數據樹。我遇到的問題是,大約3-4層後,頁面不再呈現。 JSP周圍的日誌語句包括在執行之後顯示行,但jsp從未實際包含。 jsp文件開始處的日誌語句表明j​​sp中沒有單一行到達該點。最大值<jsp:include>深度

+0

http://blogs.msdn.com/b/oldnewthing/archive/2007/03/01/1775759.aspx – kazanaki 2010-09-15 13:19:28

+0

遞歸通常是一個不明智的解決方案。如果您有「樹」結構化數據,請考慮編寫和/或使用樹組件。 – DwB 2010-11-18 13:34:38

回答

4

從技術上講,限制取決於servletcontainer make和可用堆內存。如果你太過分了,你會得到一個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> 

標準的Tomcat 6.0.24設置有64MB的默認最大堆內存開始〜200包括後出錯。

爲了解決這個問題,你希望有一個迭代包含而不是遞歸包含。 JSTL c:forEach可能會對此有所幫助。


更新:我不知道有關的Weblogic,Tomcat的,但日誌錯誤輸出到不同的文件比標準輸出。至於深度,Weblogic可能是一個重量級服務器。在包含JSP之前,可能會有很多前面的方法調用。

如果迭代不是解決方案,那麼你唯一的度假村是tail recursion。基本上,將結果作爲方法參數傳遞,而不是依賴(等待)方法的返回值,這樣可以保存堆棧。很遺憾,使用普通的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>"); 
     } 
    } 
} 
+0

我在我的日誌中搜索這個錯誤,並沒有在任何地方看到它,這並不意味着它不存在。當然,我的問題只發生在3-4層而不是200層,我不認爲我很快就會離開堆空間。再一次,這並不意味着我不是。我不認爲我可以用迭代包含來編寫我想寫的東西,因爲我試圖展示的樹結構中有無數個層次。我打算再玩一次,我會再次發表評論。 – jrlambs 2010-08-09 21:00:49

+0

查看答案更新。 – BalusC 2010-08-09 21:47:59

0

也許你應該使用合適的樹組件(使用Javascript樹或標籤庫)???