首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >呈现父子视图会导致StackOverflow异常

呈现父子视图会导致StackOverflow异常
EN

Stack Overflow用户
提问于 2017-10-18 11:04:23
回答 2查看 221关注 0票数 0

我无法在jsp页面中呈现嵌套的父级子树结构。造成堆叠流错误的原因是

代码语言:javascript
复制
 <code><jsp:include page=""/></code>

我的数据库:

代码语言:javascript
复制
 Id ||  Name  ||  Parentid  ||
 1  ||  animal||  0         ||  
 2  ||  Dog   ||  1         ||    etc.

模型类:

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

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

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

代码语言:javascript
复制
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项目中,我测试了类似的代码并得到了后续字符串结果:

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

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

代码语言:javascript
复制
<%@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递归中的新成员,请忽略我的错误。我在这里呆了几天。例外:

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-30 04:29:07

最后,我用这样的方式解决了这个问题:

tree.jsp:

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

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

希望它能帮到别人。

票数 0
EN

Stack Overflow用户

发布于 2017-10-18 11:38:23

menuitem.jsp

代码语言:javascript
复制
 <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。我相信您当前一直在将相同的对象传递到您的子菜单中,从而导致无限循环。

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

https://stackoverflow.com/questions/46808718

复制
相关文章

相似问题

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