2017-10-18 85 views
0

我无法在jsp页面中呈现嵌套的父子树结构。由于这是由呈现父子视图导致StackOverflow异常

<code><jsp:include page=""/></code> 

引起stackover流量误差我的DB:

Id || Name || Parentid || 
1 || animal|| 0   || 
2 || Dog || 1   || etc. 

模型类:

public class Node { 
    private int id; 
    private String name; 
    private int parentId; 
    private List<Node> children; 

    public Node() { 
    } 

    public Node(String name, int parentId, List<Node> children) { 
     this.name = name; 
     this.parentId = parentId; 
     this.children = children; 
    } 

DAO类:

@Override 
    public List<Node> nodelist() { 

     String sql = "select * from tree"; 
     List<Node> listNode = jdbcTemplate.query(sql, new RowMapper<Node>() { 

      @Override 
      public Node mapRow(ResultSet rs, int rowNum) throws SQLException { 
       Node node = new Node(); 
        node.setId(rs.getInt("id")); 
       node.setName(rs.getString("name")); 
       node.setParentId(rs.getInt("parent_id")); 

       return node; 


      } 

     }); 

     return listNode; 
    } 

在控制器我如下绑定对象:

List<Node> rootNodes; 

@Autowired 
    TreeDao treeDao; 


    @RequestMapping(value = "/node", method = RequestMethod.GET) 
    public ModelAndView getallnodes(ModelAndView model) throws IOException { 

     //menuObj = menuDao.listCategory(); 
     List<Node> listnode = treeDao.nodelist(); 

     getInfiniteTree(listnode); 
     model.addObject("rootNodes",rootNodes); 
     model.setViewName("tree"); 

     return model; 
    } 

    public List<Node> getInfiniteTree(List<Node> nodes) { 
     return findRootNodes(nodes); 
    } 

    private List<Node> findRootNodes(List<Node> nodes) { 
     rootNodes = new ArrayList<Node>(); 
     for (Node node : nodes) { 
      if (node.getParentId() == 0) { 
       rootNodes.add(node); 
       findChildNodes(node, nodes); 
      } 
     } 



System.out.println("rootnodes "+rootNodes); 


    Gson gson = new Gson(); 
    System.out.println(gson.toJson(rootNodes)); 
    //I got the correct json format data here. 
     //Collections.sort(rootNodes); 
     return rootNodes; 
    } 



    private void findChildNodes(Node parentNode, List<Node> nodes) { 
     List<Node> children = new ArrayList<Node>(); 
     parentNode.setChildren(children); 
     for (Node node : nodes) { 
      if (node.getParentId() == parentNode.getId()) { 
       children.add(node); 
       findChildNodes(node, nodes); 
      } 
     } 

     //Collections.sort(children); 
    } 

在另一个Java Swing项目时我测试类似的代码,并得到follwing字符串结果:

nodes [Node{id=1, name=供应链部, parentId=0, sort=3, children=[Node{id=5, name=物流部, parentId=1, sort=1, children=[]}, Node{id=6, name=采购部, parentId=1, sort=2, children=[]}]}, Node{id=2, name=技术部, parentId=0, sort=1, children=[Node{id=7, name=开发部, parentId=2, sort=2, children=[Node{id=12, name=后端部, parentId=7, sort=2, children=[]}, Node{id=13, name=前端部, parentId=7, sort=2, children=[Node{id=14, name=diee, parentId=13, sort=2, children=[]}, Node{id=15, name=diee, parentId=13, sort=2, children=[]}]}]}, Node{id=8, name=测试部, parentId=2, sort=1, children=[]}, Node{id=9, name=运维部, parentId=2, sort=3, children=[]}]}, Node{id=3, name=行政部, parentId=0, sort=2, children=[Node{id=10, name=招聘部, parentId=3, sort=1, children=[]}, Node{id=11, name=人事部, parentId=3, sort=2, children=[]}]}, Node{id=4, name=公关部, parentId=0, sort=4, children=[]}] 

的问题是使用JSP递归我不能显示它,我想下面的代码:

tree.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 

    </head> 
    <body> 
     <c:set var="menuitem" value="${rootNodes}" scope="request" /> 
     <jsp:include page="menuitem.jsp" /> 
    </body> 
</html> 

menuitem.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<ul> 
    <c:forEach var ="menuitems" items="${menuitem}"> 
     <li><a href="#">${menuitems.name}</a></li> 
     <ul> 
    <c:if test="${fn:length(menuitems.children) gt 0}"> 
     <li class="droprightMenu"> 
      <c:out value="Has children"></c:out> 
     <c:forEach var="menuitemc" items="${menuitems.children}"> 
      <c:set var="menuitem" value="${menuitemc}" scope="request" /> 
      <%--<jsp:include page="menuitem.jsp" />--%> 
     </c:forEach> 
     </li> 
    </c:if> 
     </ul> 
     </c:forEach> 
</ul> 

它不包括通过无限儿童的页面,因为我是一个新的JSP递归请忽略我的错误。我在这里呆了几天。 例外:

Don't know how to iterate over supplied "items" in &lt;forEach&gt; 
org.apache.jasper.JasperException: An exception occurred processing JSP page /WEB-INF/views/menuitem.jsp at line 14 

11: 
12: 
13: <ul> 
14:  <c:forEach var ="menuitems" items="${menuitem}"> 
15:   <li><a href="#">${menuitems.name}</a></li> 
16:   <ul> 
17: <c:if test="${fn:length(menuitems.children) gt 0}"> 

回答

0

最后我解决它以这样的方式

tree.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 

    </head> 
    <body> 



     <c:set var="menuitem" value="${rootNodes}" scope="request" /> 
     <jsp:include page="menuitem.jsp" /> 
    </body> 
</html> 

而且在menuitem.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> 




<ul> 
    <c:forEach var ="menuitems" items="${menuitem}"> 
     <li><a href="#">${menuitems.name}</a></li> 
     <ul> 
    <c:if test="${fn:length(menuitems.children) gt 0}"> 
     <li class="droprightMenu"> 
      <c:out value="Has children"></c:out> 
     <%--<c:forEach var="menuitemc" items="${menuitems.children}">--%> 
      <c:set var="menuitem" value="${menuitems.children}" scope="request" /> 
      <jsp:include page="menuitem.jsp" /> 
     <%--</c:forEach>--%> 
     </li> 
    </c:if> 
     </ul> 
     </c:forEach> 
</ul> 

希望它会帮助别人。

1

menuitem.jsp

<c:forEach var="menuitem" items="${menuitem.children}"> 
    <li><a href="#" id="${menuitem.id}"><i class="fa fa-circle-o"></i> <span>${menuitem.name} </span></a></li> 
    <c:set var="menuitem" value="${menuitem}" scope="request" /> 
    <jsp:include page="/WEB-INF/views/menuitem.jsp" /> 
</c:forEach> 

我认为问题就出在这里。尝试将var="menuitem"重命名为var="childmenuitem。 我相信你现在继续传递相同的对象到你的子菜单,导致无限循环。

+0

的标签? – RidwanulHaque