使用 <form> 提交時,Servlet 通過 request.getParameter() 獲取到的商品 ID 全是第一條記錄的 ID,無法區分用戶點擊的是哪件商品。
JSP 中使用 <c:forEach> 遍歷商品列表,每行生成一個隱藏域 <input type="hidden" name="id" value="${goodslist.id}">。由於所有隱藏域 name 相同,表單提交時瀏覽器會發送多個同名參數,Servlet 默認取第一個值,導致始終獲得第一個商品的 ID。
<!-- JSP -->
<c:forEach items="${goodslist}" var="goods">
<tr>
<td>${goods.name}</td>
<td>
<input type="button" value="-" onclick="decrease(this)">
<input type="text" id="qty_${goods.id}" name="qty" value="1" size="3">
<input type="button" value="+" onclick="increase(this)">
</td>
<td>
<a href="javascript:addToCart('${goods.id}')">加入購物車</a>
</td>
</tr>
</c:forEach>
<script>
function addToCart(goodsId) {
var qty = $('#qty_' + goodsId).val();
$.get('shoppingcarServlet', {id: goodsId, num: qty}, function(resp){
alert('添加成功');
});
}
</script>
<c:forEach items="${goodslist}" var="goods">
<form action="shoppingcarServlet" method="post">
<input type="hidden" name="id" value="${goods.id}">
<input type="number" name="num" value="1" min="1">
<input type="submit" value="加入購物車">
</form>
</c:forEach>
String goodsId = request.getParameter("id");
int quantity = Integer.parseInt(request.getParameter("num"));
// 業務處理...