Java JSP中用于嵌套未排序列表的JSTL循环
MVC-servlet将请求转发给JSP。 在servlet中,我创建了类别列表(java.util.list),将该列表附加到servlet上下文,并将请求转发到JSP页面: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
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>