新增四張資料表支撐購物流程:
透過 Hibernate 逆向工程生成對應 POJO,建立雙向關聯(Forder 1:N Sorder、User 1:N Forder、Status 1:N Forder)。
public interface SorderService extends BaseService<Sorder> {
Forder addSorder(Forder forder, Product product); // 加入購物車主邏輯
Sorder productToSorder(Product product); // 商品轉購物項
}
@Service("sorderService")
public class SorderServiceImpl extends BaseServiceImpl<Sorder> implements SorderService {
@Override
public Sorder productToSorder(Product product) {
Sorder sorder = new Sorder();
sorder.setName(product.getName());
sorder.setPrice(product.getPrice());
sorder.setNumber(1);
sorder.setProduct(product);
return sorder;
}
@Override
public Forder addSorder(Forder forder, Product product) {
Sorder newSorder = productToSorder(product);
boolean existed = false;
// 檢查購物車內是否已有同商品
for (Sorder existing : forder.getSorders()) {
if (existing.getProduct().getId().equals(newSorder.getProduct().getId())) {
existing.setNumber(existing.getNumber() + 1);
existed = true;
break;
}
}
if (!existed) {
forder.getSorders().add(newSorder);
}
return forder;
}
}
public interface ForderService extends BaseService<Forder> {
double calculateTotal(Forder forder);
}
@Service("forderService")
public class ForderServiceImpl extends BaseServiceImpl<Forder> implements ForderService {
@Override
public double calculateTotal(Forder forder) {
double total = 0.0;
for (Sorder item : forder.getSorders()) {
total += item.getNumber() * item.getPrice();
}
return total;
}
}
將 Service 注入 BaseAction,供子 Action 使用:
@Controller("baseAction")
@Scope("prototype")
public class BaseAction<T> extends ActionSupport implements ... {
@Resource protected ForderService forderService;
@Resource protected SorderService sorderService;
// ...
}
@Controller
@Scope("prototype")
public class SorderAction extends BaseAction<Sorder> {
public String addSorder() {
// 1. 取得商品
Product product = productService.get(model.getProduct().getId());
// 2. Session 無購物車則新建
if (session.get("forder") == null) {
session.put("forder", new Forder(new HashSet<>()));
}
// 3. 加入購物車並計算總價
Forder forder = (Forder) session.get("forder");
forder = sorderService.addSorder(forder, product);
forder.setTotal(forderService.calculateTotal(forder));
// 4. 更新 Session
session.put("forder", forder);
return "showCart";
}
}
<action name="sorder_*" class="sorderAction" method="{1}">
<result name="showCart">/showCart.jsp</result>
</action>
前台 detail.jsp「加入購物車」連結指向 sorder_addSorder.action?id=#{product.id} 即可。
SorderAction.addSorder() 取得商品、檢查/建立購物車SorderService.addSorder() 合併同商品或新增明細ForderService.calculateTotal() 重算總價showCart.jsp 顯示購物車內容本文完整實作購物車核心功能:資料表設計、Service 業務邏輯(去重加量、總價計算)、Action 流程控制與前頁串接,為後續結帳、訂單流程奠定基礎。