目標:l 掌握購物車的資訊如何儲存;l 掌握購物車常用功能的實現。主要內容:l 首先分析使用者上網購物的一般過程;l 介紹採用什麼樣的資料結構儲存購物資訊;l 編寫購物介面;l 完成向購物車添加物品的功能。1、 使用者上網購物的一般過程在瀏覽物品的過程中如果對某件物品感興趣,會添加到購物車(購物籃)中,隨時可以查看購物車中的資訊,如果不想要某件物品的話,可以刪除,或者修改某種物品的數量,或者整個清空購物車,可以繼續選擇物品向購物車中添加。最後使用者可以購物這些物品,經過輸入個人的寄送地址資訊和設定交易方式之後,可以產生訂單。網站的管理員可以對訂單進行管理。本執行個體類比這個過程,但是進行了簡化:只能在物品列表中選擇物品向購物車中添加。確定購買後,不需要設定交易方式以及付款等。實際處理過程,可以使用我們前面介紹的功能完成。2、 購物車資訊組織因為在使用者訪問網站的整個過程中都可以訪問購物車資訊,所以購物車對象應該存放在session中。因為使用者購買的物品的種類和數量都不確定,所以需要使用一個合適的資料結構儲存,我們選擇ArrayList。每一種物品都涉及數量,需要進行封裝,把物品和數量封裝成購物項,使用Item,每個Item對應一種物品以及該種物品的數量。需要編寫物品類表示物品的基本資料。參考代碼如下:2.1 物品類 該類中包含兩個與分頁顯示相關的方法。其中用到的DBBean是前面介紹的。package javabean; import java.util.ArrayList;import java.sql.*; public class Goods{ private String goodsid; private String goodsname; private float price; // 物品編號 public void setGoodsid(String goodsid) { this.goodsid = goodsid; } public String getGoodsid() { return goodsid; } // 物品名稱 public void setGoodsname(String goodsname) { this.goodsname = goodsname; } public String getGoodsname() { return goodsname; } // 物品價格 public void setPrice(float price) { this.price = price; } public float getPrice() { return price; } public ArrayList getGoodsByPage(int pageNo) { int number = 10; // 每一頁顯示的記錄數 int begin = (pageNo * number) - 9; int end = pageNo * number; int index = 1; DBBean db = new DBBean(); // 要返回的結果對象 ArrayList goods = new ArrayList(); String sql = "select * from goods"; ResultSet rs; try{ rs = db.executeQuery(sql,null); while (rs.next()) { // 在begin之前的記錄是不顯示的 if (index < begin) { index++; continue; } // 在end之後的記錄也不顯示 if (index > end) break; index++; String goodsid = rs.getString(1); String goodsname = rs.getString(2); float price = rs.getFloat(3); Goods g = new Goods(); g.setGoodsid(goodsid); g.setGoodsname(goodsname); g.setPrice(price); goods.add(g); } }catch(Exception e){ e.printStackTrace(); }finally{ db.close(); } return goods; } public Goods findGoodsById(String goodsid) { try { // 編寫查詢資料庫資訊的SQL語句 String sql = "select * from goods where goodsid=?"; DBBean db = new DBBean(); ArrayList params = new ArrayList(); params.add(goodsid); ResultSet rs = db.executeQuery(sql,params); if(rs.next()) { //String goodsid =rs.getString(1); String goodsname = rs.getString(2); float price = rs.getFloat(3); Goods temp = new Goods(); temp.setGoodsid(goodsid); temp.setGoodsname(goodsname); temp.setPrice(price); db.close(); return temp; }else{ return null; } } catch (Exception e) { System.out.println(e.toString()); return null; } } public int getPageCount() { try { // 編寫查詢資料庫資訊的SQL語句 String sql = "select count(*) from goods"; DBBean db = new DBBean(); ResultSet rs=db.executeQuery(sql,null); int number=0; if(rs.next()) number = rs.getInt(1); db.close(); return (number - 1) / 10 + 1; } catch (Exception e) { return 0; } }}2.2 Item類package javabean; // 購物項public class Item{ private Goods goods; private int quantity; public Item(Goods d,int quantity) { this.goods = d; this.quantity = quantity; } public void setGoods(Goods goods){ this.goods = goods; } public Goods getGoods() { return goods; } public void setQuantity(int quantity) { this.quantity = quantity; } public int getQuantity() { return quantity; }}3、 物品資訊顯示功能採用MVC模式,考慮視圖部分,不需要輸入介面,只需要顯示資訊的介面。模型部分,在前面的代碼中已經實現。控制器部分,需要編寫GetAllGoods.java。參考代碼分別如下:3.1 介面代碼檔案名稱:goodslist.jsp<%@ page contentType="text/html;charset=gb2312"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:if test="${pageNo!=1}"> <a href="getAllGoods?pageNo=1">第一頁</a> <a href="getAllGoods?pageNo=${pageNo-1}">上一頁</a></c:if><c:if test="${pageNo!=pageCounter}"> <a href="getAllGoods?pageNo=${pageNo+1}">下一頁</a> <a href="getAllGoods?pageNo=${pageCounter}">最後一頁</a></c:if><br><table width="200" border="1" height="56"> <tbody> <tr> <td> 物品編號 </td> <td> 物品名稱 </td> <td> 物品價格 </td> </tr> <c:forEach var="g" items="${goods}"> <tr> <td> ${g.goodsid} </td> <td> ${g.goodsname} </td> <td> ${g.price} </td> <td> <a href="addToCart?goodsid=${g.goodsid}">添加到購物車</a> </td> </tr> </c:forEach> </tbody></table>3.2 控制器代package servlet;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import javabean.*;import java.util.*; public class GetAllGoods extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { //response.setContentType("text/html;charset=gb2312"); //PrintWriter out = response.getWriter(); // 第一步:擷取使用者的輸入資訊 String pageNo=request.getParameter("pageNo"); int iPageNo=1; if(pageNo!=null) { iPageNo = Integer.parseInt(pageNo); } // 第二步:調用JavaBean Goods g = new Goods(); ArrayList goods=null; goods = g.getGoodsByPage(iPageNo); int pageCount=g.getPageCount(); // out.println("記錄數:"+users.size()); // out.println("當前頁碼:"+iPageNo); // out.println("總頁碼:"+pageCount); // 第三步:傳值 request.setAttribute("goods",goods); request.setAttribute("pageNo",new Integer(iPageNo)); request.setAttribute("pageCounter",new Integer(pageCount)); // 第四步:選擇一個介面對使用者進行響應 String forward="goodslist.jsp"; RequestDispatcher rd = request.getRequestDispatcher(forward); rd.forward(request,response); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { doGet(request,response); }}4、 顯示購物車中資訊該功能直接從session中擷取購物車資訊,所以不需要控制器和模型部分,只需要編寫顯示購物車資訊的JSP檔案即可,檔案名稱為cart.jsp,參考代碼如下:<%@ page contentType="text/html;charset=gb2312"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 購物車中的資訊<br><table border=1> <tr> <td>物品編號</td> <td>物品名稱</td> <td>價格</td> <td>數量</td> </tr><c:forEach var="item" items="${cart}"> <tr> <td>${item.goods.goodsid}</td> <td>${item.goods.goodsname}</td> <td>${item.goods.price}</td> <td>${item.quantity}</td></c:forEach></table>5、 向購物車中添加物品採用MVC模式。首先考慮輸入和輸出,添加物品的輸入就是物品資訊列表介面,輸出應該是添加後的購物車資訊介面(也可以重新回到物品資訊介面),這兩個介面都不需要編寫。考慮模型部分,需要編寫購物車管理JavaBean,完成處理。考慮控制器部分,需要擷取使用者選擇的物品,然後添加到調用購物車管理Bean,完成添加。下面是參考代碼。5.1 模型部分檔案名稱CartManager.javapackage javabean; import java.util.ArrayList; public class CartManager{ // 表示購物車 private ArrayList cart; public void setCart(ArrayList cart) { this.cart = cart; } public ArrayList getCart() { return cart; } // 添加的物品&數量 public ArrayList addToCart(Goods g,int quantity) { if(cart==null){ // 執行個體化購物車對象 cart=new ArrayList(); // 添加到購物車 Item item = new Item(g,quantity); cart.add(item); } else { // 轉換成數組 Object items[] = cart.toArray(); boolean find=false; // 表示是否尋找到 for(int i=0;i<items.length;i++) { Item temp = (Item)items[i]; // 判斷購物車中是否存在要添加的物品 if(temp.getGoods().getGoodsid().equals(g.getGoodsid())) { temp.setQuantity(temp.getQuantity()+quantity); find=true; break; } } if(!find) { // 添加到購物車 Item item = new Item(g,quantity); cart.add(item); } } return cart; }}5.2 控制器部分檔案名稱:AddToCart.javapackage servlet; import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import javabean.*;import java.util.*; public class AddToCart extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {// response.setContentType("text/html;charset=gb2312");// PrintWriter out = response.getWriter(); try{ // 得到要添加的物品的編號 String goodsid = request.getParameter("goodsid"); // 建立JavaBean對象 CartManager cartManager=new CartManager(); // 得到session對象 HttpSession session = request.getSession(true); // 得到購物車對象 ArrayList cart = (ArrayList)session.getAttribute("cart"); // 用cart初始化cartManager cartManager.setCart(cart); // 構造物品對象 Goods g = new Goods(); g = g.findGoodsById(goodsid); // out.println(g.getGoodsid()); cartManager.addToCart(g,1); // 先把購物車重新存到session session.setAttribute("cart",cartManager.getCart()); }catch(Exception e){ // out.println(e.toString()); } response.sendRedirect("cart.jsp"); } public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { doGet(request,response); }}6、 Servlet的配置web.xml檔案內容如下:<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>getAllGoods</servlet-name> <servlet-class>servlet.GetAllGoods</servlet-class></servlet> <servlet-mapping> <servlet-name>getAllGoods</servlet-name> <url-pattern>/getAllGoods</url-pattern></servlet-mapping> <servlet> <servlet-name>addToCart</servlet-name> <servlet-class>servlet.AddToCart</servlet-class></servlet> <servlet-mapping> <servlet-name>addToCart</servlet-name> <url-pattern>/addToCart</url-pattern></servlet-mapping></web-app>7、 運行編譯所有檔案,然後先訪問getAllGoods Servlet,然後在物品資訊介面上選擇物品添加到購物車,之後就可以看到購物車中的資訊了。
參考教材:《Java Web程式設計基礎教程》