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 域对象以访问其他属性,例如价格。
顺便说一句,由于代码唯一标识了您的域对象,因此它也应该用在您的 equals
和 hashCode
方法中,以确保代表相同域对象的 2 个实例正常运行。
首先,<% scriptlets %>
在 JSP 中已弃用,因此请考虑切换到 JSP EL。我用它来展示它的使用是多么简单。
要在另一个 JSP 中检索 price
,您也必须传递它。目前,您的 <select>
显示 name
和 price
,但只显示 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
范围。
我有一个表格可以从数据库中打印出食物的名称和价格
<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 域对象以访问其他属性,例如价格。
顺便说一句,由于代码唯一标识了您的域对象,因此它也应该用在您的 equals
和 hashCode
方法中,以确保代表相同域对象的 2 个实例正常运行。
首先,<% scriptlets %>
在 JSP 中已弃用,因此请考虑切换到 JSP EL。我用它来展示它的使用是多么简单。
要在另一个 JSP 中检索 price
,您也必须传递它。目前,您的 <select>
显示 name
和 price
,但只显示 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
范围。