@WebServlet("/products")
public class ProductServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
List list = productService.findAll(); // Service -> DAO -> DB
req.setAttribute("products", list);
req.getRequestDispatcher("/product_list.jsp").forward(req, resp);
}
}
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<table>
<c:forEach items="${products}" var="p">
<tr>
<td><img src="${p.imageUrl}" width="80"></td>
<td>${p.name}</td>
<td>¥${p.price}</td>
<td>
<form action="/cart/add" method="post">
<input type="hidden" name="productId" value="${p.id}">
<input type="number" name="quantity" value="1" min="1">
<button type="submit">加入購物車</button>
</form>
</td>
</tr>
</c:forEach>
</table>
@WebServlet("/cart/add")
public class AddToCartServlet extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
long productId = Long.parseLong(req.getParameter("productId"));
int qty = Integer.parseInt(req.getParameter("quantity"));
// 登入用戶:寫入資料表 cart_item (user_id, product_id, qty)
// 未登入:存入 Session Map
cartService.addItem(getCurrentUserId(req), productId, qty);
resp.sendRedirect(req.getHeader("Referer")); // 返回商品頁
}
}
// Servlet
List items = cartService.getItems(userId);
BigDecimal total = items.stream().map(i -> i.getPrice().multiply(BigDecimal.valueOf(i.getQty()))).reduce(BigDecimal.ZERO, BigDecimal::add);
req.setAttribute("items", items);
req.setAttribute("total", total);
forward("/cart.jsp");
<!-- cart.jsp -->
<c:forEach items="${items}" var="item">
${item.product.name} x ${item.qty} = ¥${item.subtotal}<br>
</c:forEach>
<h3>總計: ¥${total}</h3>
JSP 購物車 Demo 核心:**Servlet 查詢 → Request 屬性 → JSTL 迭代渲染 → 表單提交加入購物車 (寫 DB/Session) → 購物車頁後端算總價 → JSTL 顯示**。無需複雜框架,掌握 MVC 分層即可。