如何维护jsp中select标签中的select选项?

时间:2019-05-05 15:06:18

标签: jsp el

我已经阅读了有关上述问题的许多解决方案,但是我的特定问题有些复杂。我有一个select标记,它的选项使用JSTL forEach标记填充了1-20个选项,我希望当用户重新访问页面时可以自动选择以前选择的选项。 select标记位于列表类型属性中项目的另一个forEach内,因此select 1-20在页面上重复多次。

Image of the page

enter image description here

该页面用于选择要添加到购物车的物品,而选择1-20用于数量。我希望用户提交表单后重新访问页面时,此数量保持一致。由于对另一个建议使用paramValues建议stream()的问题的回答,我已经完成了类似的工作,其中每个项目的复选框在再次访问时都保持选中状态。

我尝试对选择1-20使用类似的方法,但是没有用。我考虑过使用javascript,但经验很少,但是由于我的选择名称(由于使用EL分配给页面上每个项目的唯一ID)而不必要,因此这很复杂。

这是原样的代码,无法保留先前选择的数量,但成功地保留了先前选择的项目:

<c:forEach var="item" items="${items}">
    <c:if test="${item.category == 'Burger'}">
        <tr>
            <td><input type="checkbox" name="itemID" value="${item.itemID}" ${paramValues.itemID.stream().anyMatch(v->v == item.itemID).get() ? 'checked' : ''}></td>
            <td>
                <select name="${item.itemID}">
                    <c:forEach var="i" begin="1" end="20">
                        <option value="${i}">${i}</option>
                    </c:forEach>
                </select>
            </td>
            <td>${item.name}</td>
            <td><fmt:formatNumber value="${item.price}" type="currency"/></td>
        </tr>
    </c:if>
</c:forEach>

我对选择1-20使用stream()的尝试失败:

<c:forEach var="i" begin="1" end="20">
    <option value="${i}" ${paramValues.item.itemID.stream().anyMatch(v->v == i).get() ? 'selected' : ''}>${i}</option>
</c:forEach>

以上解决方案取自How can I retain HTML form field values in JSP after submitting form to Servlet?,其中给出的示例代码来自答案:

<select name="boo" multiple>
    <option value="a" ${paramValues.boo.stream().anyMatch(v->v == 'a').get() ? 'selected' : ''}>label a</option>
    <option value="b" ${paramValues.boo.stream().anyMatch(v->v == 'b').get() ? 'selected' : ''}>label b</option>
    <option value="c" ${paramValues.boo.stream().anyMatch(v->v == 'c').get() ? 'selected' : ''}>label c</option>
</select>

当我尝试将其插入代码以进行测试时,它甚至都无法正常工作,甚至没有forEach等的复杂性。我不确定为什么,因为相同的解决方案适用于我的复选框,如我的第一段代码所示。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

这是因为您为HTML元素使用了动态名称:

<select name="${item.itemID}">

并且您在检查参数值时使用的是硬编码名称:

${paramValues.item.itemID}

这基本上是用文字名称“ item”查找请求参数值,然后尝试将其视为javabean以便获取文字属性名称“ itemID”。在幕后,它的作用与request.getParameterValues("item").getItemID()相同。这是不正确的。您需要查找具有动态名称${item.itemID}的请求参数值。您基本上希望得到与request.getParameterValues(item.getItemID())相同的效果。

${paramValues[item.itemID]}

换句话说,这必须对您有用:

<option value="${i}" ${paramValues[item.itemID].stream().anyMatch(v->v == i).get() ? 'selected' : ''}>${i}</option>

另请参见: