【问题标题】:How do I maintain the selected option from select tag in a jsp?如何从 jsp 中的选择标记中维护选定的选项?
【发布时间】:2019-05-05 15:06:18
【问题描述】:

我已经阅读了上述问题的许多解决方案,但我的具体问题有些复杂。我有一个选择标记,其选项使用 JSTL forEach 标记填充 1-20,并且我希望在用户重新访问页面时自动选择先前选择的选项。对于列表类型属性中的项目,选择标记位于另一个 forEach 中,因此选择 1-20 在页面上重复了很多次。

Image of the page

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

我尝试对选择 1-20 使用类似的方法,但没有奏效。我考虑过使用 JavaScript,但我的经验很少,但这很复杂,因为我选择的名称,出于必要,是页面上每个项目的唯一 ID,使用 EL 分配。

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

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

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

<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 等一起使用的复杂性。我不确定为什么,因为相同的解决方案适用于我的复选框,如我的第一个代码块所示。

非常感谢您的帮助。

【问题讨论】:

    标签: jsp el


    【解决方案1】:

    这是因为您为 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>
    

    另见:

    【讨论】:

    • 啊,这很有道理;谢谢你。但是,这会产生 500 异常,“java.lang.Integer 无法转换为 java.lang.String”。现在,item.itemID 是一个 int,但我不太明白这个错误是如何发生的,就像我理解 stream() 的方式一样,它将它视为一个对象。
    • 然后将其转换为字符串为${item.itemID.toString()}
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2012-09-23
    • 2018-07-12
    • 2019-09-30
    • 2019-09-23
    • 2023-03-30
    • 2023-04-08
    相关资源
    最近更新 更多