首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

基於 XML 的購物車 Java 實現:XMLCart JavaBean 完整源碼與操作指南

     編輯:Java 程式設計入門

設計動機

  • 傳統購物車僅服務端渲染,客戶端無法提取數據進行業務處理
  • XML 賦予數據自描述能力,支援多樣式渲染 (XSLT)、跨系統集成
  • 核心類 XMLCart 封裝 DOM 操作,暴露高級業務 API

XML 數據結構


<?xml version="1.0" encoding="gb2312"?>
<cart>
  <total>1250.00</total>
  <item id="P001">
    <name>筆記本電腦</name>
    <price>5000.00</price>
    <quantity>1</quantity>
  </item>
  <item id="P002">
    <name>無線滑鼠</name>
    <price>150.00</price>
    <quantity>5</quantity>
  </item>
</cart>
  • 根元素 <cart>
  • <total>:總金額 (冗余存儲,避免重複計算)
  • <item>:id 屬性為主鍵,子元素可擴展

XMLCart 核心類


public class XMLCart {
    private Document myCart; // 全局 DOM 文檔

    // 輔助:字符串解析為 Document
    private Document parseString(String xml) throws IOException, SAXException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        return builder.parse(new ByteArrayInputStream(xml.getBytes("gb2312")));
    }

    // 輔助:計算總價
    private void computeTotal() {
        double total = 0;
        NodeList items = myCart.getElementsByTagName("item");
        for (int i = 0; i < items.getLength(); i++) {
            Element item = (Element) items.item(i);
            double price = Double.parseDouble(getChildText(item, "price"));
            int qty = Integer.parseInt(getChildText(item, "quantity"));
            total += price * qty;
        }
        // 更新 total 節點
        Element totalElem = (Element) myCart.getElementsByTagName("total").item(0);
        totalElem.setTextContent(String.format("%.2f", total));
    }

    private String getChildText(Element parent, String tagName) {
        NodeList nl = parent.getElementsByTagName(tagName);
        return (nl.getLength() > 0) ? nl.item(0).getTextContent() : "";
    }

    // 1. 清空購物車
    public void emptyCart() throws IOException, SAXException {
        String xml = "0";
        myCart = parseString(xml);
    }

    // 2. 添加商品
    public void addItemToCart(String itemXml) throws IOException, SAXException {
        Document itemDoc = parseString(itemXml);
        NodeList itemList = itemDoc.getElementsByTagName("item");
        if (itemList.getLength() == 0) return;
        Node newItem = itemList.item(0).cloneNode(true); // 深克隆

        if (isCartEmpty()) emptyCart();

        if (!isItemExist(newItem)) {
            Element cartRoot = myCart.getDocumentElement();
            cartRoot.appendChild(myCart.importNode(newItem, true)); // 跨文檔導入
            computeTotal();
        }
    }

    private boolean isCartEmpty() {
        return myCart == null || myCart.getDocumentElement() == null;
    }

    private boolean isItemExist(Node item) {
        String id = item.getAttributes().getNamedItem("id").getNodeValue();
        NodeList items = myCart.getElementsByTagName("item");
        for (int i = 0; i < items.getLength(); i++) {
            Element e = (Element) items.item(i);
            if (id.equals(e.getAttribute("id"))) return true;
        }
        return false;
    }

    // 3. 刪除商品
    public void removeItemFromCart(String itemId) {
        NodeList items = myCart.getElementsByTagName("item");
        Element cartRoot = myCart.getDocumentElement();
        for (int i = 0; i < items.getLength(); i++) {
            Element item = (Element) items.item(i);
            if (itemId.equals(item.getAttribute("id"))) {
                cartRoot.removeChild(item);
                break;
            }
        }
        computeTotal();
    }

    // 4. 修改數量
    public void updateQuantity(String itemId, int newQty) {
        NodeList items = myCart.getElementsByTagName("item");
        for (int i = 0; i < items.getLength(); i++) {
            Element item = (Element) items.item(i);
            if (itemId.equals(item.getAttribute("id"))) {
                Element qtyElem = (Element) item.getElementsByTagName("quantity").item(0);
                qtyElem.setTextContent(String.valueOf(newQty));
                break;
            }
        }
        computeTotal();
    }

    // 5. 獲取 XML 字符串 (供前端渲染/傳輸)
    public String toXmlString() throws TransformerException {
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
        StringWriter writer = new StringWriter();
        transformer.transform(new DOMSource(myCart), new StreamResult(writer));
        return writer.toString();
    }
}

前端集成示例 (JSP + XSLT)


<%-- 獲取購物車 XML --%>
<%
    XMLCart cart = (XMLCart) session.getAttribute("cart");
    String cartXml = cart.toXmlString();
%>
<%-- 應用 XSLT 生成 HTML --%>

擴展方向

  • 持久化:序列化 XML 存入數據庫 BLOB/文本列,或會話序列化
  • 優惠/稅費:<discount>、<tax> 子元素,computeTotal() 擴展邏輯
  • Schema 驗證:XSD 定義結構,解析時啟用 setValidating(true)
  • 並發安全:XMLCart 非線程安全,Web 環境下存入 Session (單線程訪問) 或加鎖

XML 購物車 = 結構化數據 + 標準化交換 + 多渠道渲染。Java DOM API 雖顯冗長,但標準、穩定、無依賴,是輕量級方案的不二之選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved