繁体   English   中英

JSTL-在JSP中动态创建下拉菜单/下拉菜单,从列表中提取数据(java.util.List)

[英]JSTL - Dynamic dropdown/dropright menu creation in JSP, extracting data from a list (java.util.List)

MVC模式:Servlet + JSP页面。 我有一个(基本)外观的类Category

public class Category{
   private Integer id;
   private String name;
   private Category parentCategory;
   ...
   //getters and setters
}

此类应表示类别-子类别概念:一个类别可以具有多个子类别,类别不需要具有父项(顶级类别,parentCategory字段为null),如果它是子类别,则其parentCategory字段代表其父项。

在servlet中,我将所有类别从数据库提取到java.util.List对象。 然后,我将此列表附加到应用程序范围(servlet上下文),并将其转发到JSP页面。

List<Category> categories = categoryDao.findAll();
ServletContext servletContext = getServletContext();
servletContext.setAttribute("categories", categories);

现在,在JSP页面中,我有一个导航菜单,您可以在这里看到它: http : //jsfiddle.net/vvozar/tMz9A/1/see menu look in jsfiddle link )下拉菜单是HTML中简单的无序列表,并且它的子菜单是某些菜单项下的嵌套无序列表。 示例(静态):

<nav>
            <!-- Navigation -->
            <ul class="dropdownMenu">
                <li><a href="#">Home</a></li>

                <li><a href="#">Categories</a>
                    <ul class="droprightMenu">
                        <li><a href="#">All</a>
                            <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>
                                        <li><a href="#">Category 1.4</a></li>
                                    </ul></li>
                                <li><a href="#">Category 2</a></li>
                                <li><a href="#">Category 3</a></li>
                                <li><a href="#">Category 4</a></li>
                            </ul></li>
                        <li><a href="#">Manage</a></li>
                    </ul></li>

                <li><a href="#">Profile</a>
                    <ul class="droprightMenu">
                        <li><a href="#">Login</a></li>
                        <li><a href="#">Register</a></li>
                        <li><a href="#">Edit Profile</a></li>
                        <li><a href="#">My Posts</a></li>
                        <li><a href="#">Logout</a></li>
                    </ul></li>

                <li><a href="#">Help</a></li>
            </ul>
        </nav>

我想通过从列表中按照类别层次结构读取类别/子类别来(动态)创建这些菜单和子菜单。(具有相同父类别的类别属于相同的下拉菜单)。

JSTL循环应如何创建类别菜单?

您知道子菜单的最高级别吗?

我认为您应该尝试使用Scriplets和递归

我将子类别的深度级别限制为3。因此,JSTL循环是:

        <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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM