使用JSTL动态填充选择输入而不重复值

时间:2014-11-05 05:09:17

标签: jsp spring-mvc jstl

在我的名单" rooms"有一个对象集合,其中包含一个名为" floor"这是一个整数。

我正在尝试使用这些楼层的列表填充选择,但我无法弄清楚如何删除重复项。

我可以在循环中使用<c:if>,还是有其他方法可以确保没有重复?

到目前为止我所拥有的:

<select id="floorFilter">
    <option value=""></option>
    <c:forEach var="room" items="${rooms}">
        <c:if test="">
            <option value="${room.floor}">${room.floor}</option>
        </c:if>
    </c:forEach>
</select>

编辑:每个&#39;房间&#39;有一个地板&#39;用户在创建时分配给它的属性。没有地板的集合&#39;引用,因此无法从后端删除重复项。

1 个答案:

答案 0 :(得分:1)

我不建议您这样做,但这里有一些代码可以实现您的目标:

<select id="floorFilter">
    <option value=""></option>
    <c:forEach var="room" items="${rooms}" varStatus="status">
        <c:set var="floorAlreadyExists" value="${false}" />
        <c:if test="${(status.index - 1) > 0}">
            <c:forEach var="previousRoom" items="${rooms}" begin="0" end="${status.index - 1}" varStatus="inner">
                <c:if test="${room.floor == previousRoom.floor}">
                    <c:set var="floorAlreadyExists" value="${true}" />
                </c:if>
            </c:forEach>
        </c:if>
        <c:if test="${not floorAlreadyExists}">
            <option value="${room.floor}">${room.floor}</option>
        </c:if>
    </c:forEach>
</select>

此代码至少存在问题:

  1. 它冗长而且难以理解
  2. 值是您房间的楼层值,无论您拥有房间的顺序如何。我假设您希望地板按升序排列,而不是按照您从房间获得的顺序。您可以在JSP中以某种方式对它们进行排序,但这会添加许多其他代码,因此我们又回到了第1位。
  3. 我建议您做什么是@Alex建议的:在后端执行此操作。

      

    没有可供参考的“楼层”集合,因此无法从后端删除重复项。

    您无需专门处理域实体。您只能为视图构建其他辅助结构。穿过你的房间集合,建立一系列不同的楼层,对楼层进行排序,然后将forEach写在楼层的集合上,如下所示:

    <select id="floorFilter">
        <option value=""></option>
        <c:forEach var="floor" items="${floors}">
            <option value="${floor}">${floor}</option>
        </c:forEach>
    </select>
    

    这样JSP很容易理解,后端的代码将是Java,因此更简洁,更容易休闲。