Java JSP中用于嵌套未排序列表的JSTL循环

Java JSP中用于嵌套未排序列表的JSTL循环,java,jsp,servlets,jstl,Java,Jsp,Servlets,Jstl,MVC-servlet将请求转发给JSP。 在servlet中,我创建了类别列表(java.util.list),将该列表附加到servlet上下文,并将请求转发到JSP页面: public class Category{ private Integer id; private String name; private Category parentCategory; ... //getters and setters

MVC-servlet将请求转发给JSP。 在servlet中,我创建了类别列表(java.util.list),将该列表附加到servlet上下文,并将请求转发到JSP页面:

public class Category{
       private Integer id;
       private String name;
       private Category parentCategory;
       ...
       //getters and setters
    }
此类表示类别/子类别(如果parentCategory字段为空,则为顶级类别)。 具有相同父级的类别是其子类别,它们映射到JSP中嵌套的无序列表。 示例:结果应类似于下一个HTML代码:

<ul class="droprightMenu">  
            <li><a href="#">Category 1</a>
                <ul class="droprightMenu">
                    <li><a href="#">Category 1.1</a></li>
                    <li><a href="#">Category 1.2</a></li>
                    <li><a href="#">Category 1.3</a></li>
                          <ul class="droprightMenu">
                                <li><a href="#">Category 1.3.1</a></li>
                                <li><a href="#">Category 1.3.2</a></li>
                                <li><a href="#">Category 1.3.3</a></li>
                                <li><a href="#">Category 1.3.4</a></li>
                          </ul> 
                    <li><a href="#">Category 1.4</a></li>
                </ul>
            </li>
            <li><a href="#">Category 2</a></li>
            <li><a href="#">Category 3</a></li>
                <ul class="droprightMenu">
                    <li><a href="#">Category 3.1</a></li>
                    <li><a href="#">Category 3.2</a></li>
                          <ul class="droprightMenu">
                                <li><a href="#">Category 3.2.1</a></li>
                                <li><a href="#">Category 3.2.2</a></li>
                          </ul> 
                    <li><a href="#">Category 3.3</a></li>
                    <li><a href="#">Category 3.4</a></li>
                </ul>
            <li><a href="#">Category 4</a></li>
    </ul>
我不知道如何在JSP中循环浏览这个列表。它可能应该通过不同的JSTL循环或JSP脚本的一些组合来完成,也可能是一些递归。
感谢您的帮助。

您需要这样填充您的模型:

public class Category{
   private Integer id;
   private String name;
   private Category parentCategory;

   private List<Category> subCategories;

   ...
   //getters and setters
}
公共类类别{
私有整数id;
私有字符串名称;
私人类;
私有列表子类别;
...
//接球手和接球手
}
在Servlet中,您需要有类别级别1的列表(父级为NULL)

List rootCategories=getAllCategoriesLevel1();
setAttribute(“根类别”,根类别);
在JSP中(需要3个循环或4,5个循环)


// ...
// ...
// ...  
// ...
// ...

如果您不知道类别树的深度,仍然可以使用递归生成菜单

使用与前面响应中的Loc相同的模型,您必须定义一个名为
menuitem.jsp
的jsp页面,该页面将被递归调用:

<li>
   <a href="#">${menuitem.name}</a>
   <c:if test="${fn:length(menuitem.subCategories) gt 0}">
      <ul class="droprightMenu">
         <c:forEach var="menuitem" items="${menuitem.subCategories}">
           <c:set var="menuitem" value="${menuitem}" scope="request" />
           <jsp:include page="menuitem.jsp" />
         </c:forEach>
      </ul>
   </c:if>
</li>
  • 在我们的主JSP页面中,初始化变量menuitem并包含JSP

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

    我将子类别级别限制为3级。 下面是servlet中的代码:

    // findAll() - returns all categories in database, as a list
    List<Category> categories = categoryDao.findAll(); 
    ServletContext servletContext = getServletContext();
    servletContext.setAttribute("categories", categories); 
    
    //findAll()-以列表形式返回数据库中的所有类别
    List categories=categoryDao.findAll();
    ServletContext=getServletContext();
    setAttribute(“categories”,categories);
    
    这些是JSP页面中的循环,我从列表中提取数据并生成html标记:

            <li><a href="#">Categories</a>
                <ul class="droprightMenu">
                    <li><a href="#">All</a>
                        <ul class="droprightMenu">
    
                            <!-- first loop, extracting categories level 1  -->
                            <c:forEach items="${categories }" var="catLevel1">
    
                                <c:if test="${catLevel1.getParentCategory()==null }">
                                    <li><a href="#">${catLevel1.getName() }</a> 
    
                                    <!-- second loop, extracting categories level 2  -->
                                        <ul class="droprightMenu">
                                            <c:forEach items="${categories }" var="catLevel2">
    
                                                <c:if test="${catLevel2.getParentCategory().getId()==catLevel1.getId() }">
                                                    <li><a href="#">${catLevel2.getName() }</a> 
    
                                                    <!-- third loop, categories level 3  -->
                                                        <ul class="droprightMenu">
                                                            <c:forEach items="${categories }" var="catLevel3">
    
                                                                <c:if test="${catLevel3.getParentCategory().getId()==catLevel2.getId() }">
                                                                    <li><a href="#">${catLevel3.getName() }</a></li>
                                                                </c:if>
    
                                                            </c:forEach>
                                                        </ul></li>
                                                </c:if>
    
                                            </c:forEach>
                                        </ul></li>
                                </c:if>
                            </c:forEach>
    
                        </ul></li>
                </ul></li>
    
  • 
    ${subCategory.subCategory name}
    
    可以使用包装c:forEach语句。你必须限制你的最高水平。假设最大级别为5,JSP中有5个循环。因为您已经使用了OK,所以假设在类类别中有一个子类别列表(或一组子类别)。但是,再一次,我不知道子类别到底有多深,每个嵌套循环有多少个。所以,应该如何看待一些JSTL循环模式,它将覆盖所有子类别,而不仅仅是直到特定级别?谢谢回复。我不知道如何递归地实现这一点,所以我将类别深度级别限制为三个(参见我的答案)。但现在,我会考虑你的选择。
    // findAll() - returns all categories in database, as a list
    List<Category> categories = categoryDao.findAll(); 
    ServletContext servletContext = getServletContext();
    servletContext.setAttribute("categories", categories); 
    
            <li><a href="#">Categories</a>
                <ul class="droprightMenu">
                    <li><a href="#">All</a>
                        <ul class="droprightMenu">
    
                            <!-- first loop, extracting categories level 1  -->
                            <c:forEach items="${categories }" var="catLevel1">
    
                                <c:if test="${catLevel1.getParentCategory()==null }">
                                    <li><a href="#">${catLevel1.getName() }</a> 
    
                                    <!-- second loop, extracting categories level 2  -->
                                        <ul class="droprightMenu">
                                            <c:forEach items="${categories }" var="catLevel2">
    
                                                <c:if test="${catLevel2.getParentCategory().getId()==catLevel1.getId() }">
                                                    <li><a href="#">${catLevel2.getName() }</a> 
    
                                                    <!-- third loop, categories level 3  -->
                                                        <ul class="droprightMenu">
                                                            <c:forEach items="${categories }" var="catLevel3">
    
                                                                <c:if test="${catLevel3.getParentCategory().getId()==catLevel2.getId() }">
                                                                    <li><a href="#">${catLevel3.getName() }</a></li>
                                                                </c:if>
    
                                                            </c:forEach>
                                                        </ul></li>
                                                </c:if>
    
                                            </c:forEach>
                                        </ul></li>
                                </c:if>
                            </c:forEach>
    
                        </ul></li>
                </ul></li>
    
    <c:forEach var="rootCategory" items="${allCategories}" varStatus="rootCategoryLoop">
        <c:if test="${rootCategory.rootCategoryId eq product.rootCategoryId}">
            <c:forEach var="category" items="${rootCategory.categories}" varStatus="categoryLoop">
                <c:if test="${category.categoryId eq product.categoryId}">
                    <c:forEach var="subCategory" items="${category.subCategories}" varStatus="subCategoryLoop">
                        <c:choose>
                            <c:when test="${subCategory.subCategoryId eq product.subCategoryId}">
                                <div>${subCategory.subCategoryName}</option>
                            </c:when>
                            <c:otherwise>
                                <div}">${subCategory.subCategoryName}</option>
                            </c:otherwise>
                        </c:choose>  
                    </c:forEach>
                </c:if> 
            </c:forEach>
        </c:if>
    </c:forEach>