JSP中的JSTL循环用于嵌套的未编译列表

Vla*_*mir 3 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
    }
Run Code Online (Sandbox Code Playgroud)

此类表示类别/子类别(如果parentCategory字段为null,则它是顶级类别).具有相同父级的类别是其子类别,并且它们将映射到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>
Run Code Online (Sandbox Code Playgroud)

我不知道如何在JSP中遍历此列表.它可能应该使用不同的JSTL循环或JSP scriptlet的某种组合来完成,也许是一些递归.感谢任何帮助.

obo*_*ain 5

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

在前一个响应中使用与Loc相同的模型,您必须定义一个名为jsp的页面menuitem.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>
Run Code Online (Sandbox Code Playgroud)

在我们的主JSP页面中,初始化变量menuitem并包含jsp.

<c:set var="menuitem" value="${rootMenu}" scope="request" />
<jsp:include page="menuitem.jsp" />
Run Code Online (Sandbox Code Playgroud)