可以试试hashtable 书名或书编号做key 书类做value 里面加一个数量的属性,当hashtable里有重复的key时,书类的数量加1

解决方案 »

  1.   

    用vector也能实现。
    这里有一些例子,你可以看看。
    Cart.jsp 
    〈%@ page session="true" import="java.util.*, shopping.CD" %>
    〈%
    Vector buylist = (Vector) session.getValue("shopping.shoppingcart");
    if (buylist != null && (buylist.size() > 0)) {
    %>
    〈center>
    〈table border="0" cellpadding="0" width="100%" bgcolor="#FFFFFF">
    〈tr>
    〈td>〈b>ALBUM〈/b>〈/td>
    〈td>〈b>ARTIST〈/b>〈/td>
    〈td>〈b>COUNTRY〈/b>〈/td>
    〈td>〈b>PRICE〈/b>〈/td>
    〈td>〈b>QUANTITY〈/b>〈/td>
    〈td>〈/td>
    〈/tr>
    〈%
    for (int index=0; index 〈 buylist.size();index++) {
    CD anOrder = (CD) buylist.elementAt(index);
    %>
    〈tr>
    〈td>〈b>〈%= anOrder.getAlbum() %>〈/b>〈/td>
    〈td>〈b>〈%= anOrder.getArtist() %>〈/b>〈/td>
    〈td>〈b>〈%= anOrder.getCountry() %>〈/b>〈/td>
    〈td>〈b>〈%= anOrder.getPrice() %>〈/b>〈/td>
    〈td>〈b>〈%= anOrder.getQuantity() %>〈/b>〈/td>
    〈td>
    〈form name="deleteForm"
    action="/examples/servlet/ShoppingServlet"
    method="POST">
    〈input type="submit" value="Delete">
    〈input type="hidden" name= "delindex" value=´〈%= index %>´>
    〈input type="hidden" name="action" value="DELETE">
    〈/form> 
    〈/td>
    〈/tr> 
    〈% } %>
    〈/table>
    〈p>
    〈form name="checkoutForm"
    action="/examples/servlet/ShoppingServlet"
    method="POST">
    〈input type="hidden" name="action" value="CHECKOUT">
    〈input type="submit" name="Checkout" value="Checkout">
    〈/form>
    〈/center>
    〈% } %>
    这里,Cart.jsp按照MVC的模式1处理基于SESSION的购物车的表现。请看Cart.jsp开始处的代码:
    〈%
    Vector buylist = (Vector) session.getValue("shopping.shoppingcart");
    if (buylist != null && (buylist.size() > 0)) {
    %>
    本质上,这段代码从SESSION中取出“购物车”。如果“购物车”为空或者没有被创建,它就什么也不显示。
    如果“购物车”不为空,用户选择的商品从车中取出,依次显示在页面上:
    〈%
    for (int index=0; index 〈 buylist.size(); index++) {
    CD anOrder = (CD) buylist.elementAt(index);
    %>
    一旦生成一个物品的说明,就使用JSP按照事先设定的模板将其插入静态HTML页面。下图显示了用户选购一些物品后的界面:
      

  2.   

    需要注意的一个重要的地方是所有关于Eshop.jsp,Cart.jsp的处理有一个控制SERVLET ShoppingServlet.java 代码如下:
    import java.util.*;
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import shopping.CD;
    public class ShoppingServlet extends HttpServlet {
    public void init(ServletConfig conf) throws ServletException {
    super.init(conf);
    }
    public void doPost (HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    HttpSession session = req.getSession(false);
    if (session == null) {
    res.sendRedirect("http://localhost:8080/error.html");
    }
    Vector buylist=(Vector)session.getValue("shopping.shoppingcart");
    String action = req.getParameter("action");
    if (!action.equals("CHECKOUT")) {
    if (action.equals("DELETE")) {
    String del = req.getParameter("delindex");
    int d = (new Integer(del)).intValue();
    buylist.removeElementAt(d);
    } else if (action.equals("ADD")) {
    //any previous buys of same cd?
    boolean match=false;
    CD aCD = getCD(req);
    if (buylist==null) {
    //将不重复的商品放到vector中=====================================================
    buylist = new Vector(); //first order
    buylist.addElement(aCD);

    else { // 对于重复的商品进行累加处理=============================================
    for (int i=0; i〈 buylist.size(); i++) {
    CD cd = (CD) buylist.elementAt(i);
    if (cd.getAlbum().equals(aCD.getAlbum())) {
    cd.setQuantity(cd.getQuantity()+aCD.getQuantity());
    buylist.setElementAt(cd,i);
    match = true;
    } //end of if name matches
    } // end of for
    if (!match) 
    buylist.addElement(aCD);
    }
    }
    session.putValue("shopping.shoppingcart", buylist);
    String url="/jsp/shopping/EShop.jsp";
    ServletContext sc = getServletContext();
    RequestDispatcher rd = sc.getRequestDispatcher(url);
    rd.forward(req, res);
    } else if (action.equals("CHECKOUT")) {
    float total =0;
    for (int i=0; i〈 buylist.size();i++) {
    CD anOrder = (CD) buylist.elementAt(i);
    float price= anOrder.getPrice();
    int qty = anOrder.getQuantity();
    total += (price * qty);
    }
    total += 0.005;
    String amount = new Float(total).toString();
    int n = amount.indexOf(´.´);
    amount = amount.substring(0,n+3);
    req.setAttribute("amount",amount);
    String url="/jsp/shopping/Checkout.jsp";
    ServletContext sc = getServletContext();
    RequestDispatcher rd = sc.getRequestDispatcher(url);
    rd.forward(req,res);
    }
    }
    private CD getCD(HttpServletRequest req) {
    //imagine if all this was in a scriptlet...ugly, eh?
    String myCd = req.getParameter("CD");
    String qty = req.getParameter("qty");
    StringTokenizer t = new StringTokenizer(myCd,"|");
    String album= t.nextToken();
    String artist = t.nextToken();
    String country = t.nextToken();
    String price = t.nextToken();
    price = price.replace(´$´,´ ´).trim();
    CD cd = new CD();
    cd.setAlbum(album);
    cd.setArtist(artist);
    cd.setCountry(country);
    cd.setPrice((new Float(price)).floatValue());
    cd.setQuantity((new Integer(qty)).intValue());
    return cd;
    }
    }
    你只要看关于vector的就可以了,通过session.putValue()和session.getValue()来实现向购物车里放东西和取东西。以及代码中用“========================”注释的那些代码
    每次用户用Eshop.jsp增加一个商品,页面就请求控制SERVLET。控制SERVLET决定进一步的行动,并处理增加的商品。接着,控制SERVLET实例化一个新的BEAN CD代表选定的商品,并在返回SESSION前更新购物车对象。
      

  3.   

    CD.java package shopping;
    public class CD {
    String album;
    String artist;
    String country;
    float price;
    int quantity;
    public CD() {
    album="";
    artist="";
    country="";
    price=0;
    quantity=0;
    }
    public void setAlbum(String title) {
    album=title;
    }
    public String getAlbum() {
    return album;
    }
    public void setArtist(String group) {
    artist=group;
    }
    public String getArtist() {
    return artist;
    }
    public void setCountry(String cty) {
    country=cty;
    }
    public String getCountry() {
    return country;
    }
    public void setPrice(float p) {
    price=p;
    }
    public float getPrice() {
    return price;
    }
    public void setQuantity(int q) {
    quantity=q;
    }
    public int getQuantity() {
    return quantity;
    }
    }
    注意,SERVLET中具有附加的智能,如果一个物品被重复选择,不会增加新的记录,而是在以前的记录上更新计数。控制SERVLET也响应Cart.jsp中的行为,如修改数量,删除商品,还有结帐。如果结帐,控制通过下述语句转向Checkout.jsp页面(源程序5):String url="/jsp/shopping/Checkout.jsp";
    ServletContext sc = getServletContext();
    RequestDispatcher rd = sc.getRequestDispatcher(url);
    rd.forward(req,res);Listing 5:
    Checkout.jsp 〈%@ page session="true" import="java.util.*, shopping.CD" %>
    〈html>
    〈head>
    〈title>Music Without Borders Checkout〈/title>
    〈/head>
    〈body bgcolor="#33CCFF">
    〈font face="Times New Roman,Times" size=+3>
    Music Without Borders Checkout
    〈/font>
    〈hr>〈p>
    〈center>
    〈table border="0" cellpadding="0" width="100%" bgcolor="#FFFFFF">
    〈tr>
    〈td>〈b>ALBUM〈/b>〈/td>
    〈td>〈b>ARTIST〈/b>〈/td>
    〈td>〈b>COUNTRY〈/b>〈/td>
    〈td>〈b>PRICE〈/b>〈/td>
    〈td>〈b>QUANTITY〈/b>〈/td>
    〈td>〈/td>
    〈/tr>
    〈%
    Vector buylist = (Vector) session.getValue("shopping.shoppingcart");
    String amount = (String) request.getAttribute("amount");
    for (int i=0; i 〈 buylist.size();i++) {
    CD anOrder = (CD) buylist.elementAt(i);
    %>
    〈tr>
    〈td>〈b>〈%= anOrder.getAlbum() %>〈/b>〈/td>
    〈td>〈b>〈%= anOrder.getArtist() %>〈/b>〈/td>
    〈td>〈b>〈%= anOrder.getCountry() %>〈/b>〈/td>
    〈td>〈b>〈%= anOrder.getPrice() %>〈/b>〈/td>
    〈td>〈b>〈%= anOrder.getQuantity() %>〈/b>〈/td>
    〈/tr>
    〈%
    }
    session.invalidate();
    %>
    〈tr>
    〈td> 〈/td>
    〈td> 〈/td>
    〈td>〈b>TOTAL〈/b>〈/td>
    〈td>〈b>$〈%= amount %>〈/b>〈/td>
    〈td> 〈/td>
    〈/tr>
    〈/table>
    〈p>
    〈a href="/examples/jsp/shopping/EShop.jsp">Shop some more!〈/a>
    〈/center>
    〈/body>
    〈/html>
    结帐页面简单地从SESSION中取出购物车,然后显示每个物品和总金额。这里的关键是要结束SESSION,因此在页面中有一个session.invalidate()调用。这一处理有两个原因。首先,如果不结束SESSION,用户的购物车不会被初始化,如果用户要继续购买,车中会保留他已经支付过的商品。另外,如果用户不结帐就离开了,则SESSION会继续占用有效的资源直到过期。过期时间一般是30分钟,在一个大的站点上,这样的情况会很快导致资源耗尽。当然,这是我们不愿看到的。
    注意,所有的资源分配在这个例子中是基于SESSION的。所以,你必须确保控制SERVLET不被用户访问,即使是意外的访问也不允许。这可以在控制检查到一个非法访问时用一个简单的重定向错误页面来处理。
    error.html
    〈html>
    〈body>
    〈h1>
    Sorry, there was an unrecoverable error! Please try 〈a href="/examples/jsp/shopping/EShop.jsp">again〈/a>.
    〈/h1>
    〈/body>
    〈/html>