JSP 从一个选项值中获取 2 个变量

JSP Getting 2 variables from one option value

我有一个表格可以从数据库中打印出食物的名称和价格

<select name="food" multiple="multiple" size="10" >
    <% for (int i = 0; i < name.size(); ++i) {
    %>
    <option 
        value="<%out.println(name.get(i));%>">
        <% out.println(name.get(i) + "-------- $" + price.get(i));%>
    </option> 
    <%
        }
    %>
</select>

当我把它放入一个数组时,它会给我食物和价格

 String[] list = request.getParameterValues("food");`foodarray = list;
 application.setAttribute("sessfood", foodarray); 

我正在使用

String[] ceiArray =  (String[])application.getAttribute("sessfood");

从上一个 jsp 页面获取名称。所以,我可以将它检索到其他网页,但它只有 returns 名称而不是价格,无论如何我也可以检索价格吗?

将食物视为领域对象,也就是说,它代表了您的问题领域的一部分。食物有属性、名称、价格等——因为它有价格,也许称它为产品会更好。

随着时间的推移,名称或价格可能会发生变化,因此您应该为您的产品分配一个唯一代码,以便随着时间的推移识别它。正是这个唯一代码应该用于您在表单中的值。然后您可以使用代码查找 Product 域对象以访问其他属性,例如价格。

顺便说一句,由于代码唯一标识了您的域对象,因此它也应该用在您的 equalshashCode 方法中,以确保代表相同域对象的 2 个实例正常运行。

首先,<% scriptlets %> 在 JSP 中已弃用,因此请考虑切换到 JSP EL。我用它来展示它的使用是多么简单。

要在另一个 JSP 中检索 price,您也必须传递它。目前,您的 <select> 显示 nameprice,但只显示 name。所以,JSP 代码应该看起来像

<c:set var="names" value="<%= name %>" />
<c:set var="prices" value="<%= price %>" />

<select name="food" multiple="multiple" size="10" >
  <c:forEach items="${names}" var="name" varStatus="loop">
    <option value="${name}=${prices[loop.index]}">
        ${name}-------- $${prices[loop.index]}
    </option> 
  </c:forEach>
</select>

在您的目标 servlet 中,您可以检索 name=price 映射,并以更便于 JSP 从中检索值的方式存储它。我将这些值存储在 Map 中。

String[] selection = request.getParameterValues("food");

Map<String, String> foodPrices = new HashMap<String, String>(selection.length);
for (String option: selection) {
    String[] foodPrice = option.split("=");
    foodPrices.put(foodPrice[0], foodPrice[1]);
}

application.setAttribute("foodMap", foodPrices);

现在,在您的 JSP 中,您可以访问价格

<c:forEach items="${foodMap}" var="entry">
    <li>Price of ${entry.key} = $${entry.value}</li>
</c:forEach>

顺便说一下,我不确定您是否应该将用户的食物选择存储到 application 范围内,因为它由您的应用程序的所有用户共享。如果这不是您想要的,请改用 session 范围。