购物车

工程结构:

index.jsp:

<%@page import="com.atguigu.app.ajax.beans.Book"%>
<%@page import="com.atguigu.app.ajax.util.ShoppingCart"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>CheckUserName_Ajax</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    
    <script type="text/javascript"
            src="<%=basePath%>scripts/jquery-1.3.1.js"></script>
    <script type="text/javascript">
        $(function() {
            // 如果没有购物车, 就隐藏提示
            var isHasCart = <%=session.getAttribute("cart") == null %>;
            if (isHasCart) {
                $("#message").hide();    
            } else {
                $("#message").show();
                $("#bookName").text("${sessionScope.cart.bookName}");
                $("#bookNumber").text("${sessionScope.cart.bookNumber}");
                $("#totalMoney").text("${sessionScope.cart.totalMoney}");
            }
            
            $("a").click(function() {
                $("#message").show();    // 显示购买信息
                
                var url = this.href;
                var args = {"time": new Date()};
                
                $.getJSON(url, args, function(data) {
                    $("#bookName").text(data.bookName);
                    $("#bookNumber").text(data.bookNumber);
                    $("#totalMoney").text(data.totalMoney);
                });
                
                return false;
            });
        });
    </script>
  </head>
 
  <body>
      <h2 id="message">
    您已将 <span id="bookName" style="color: blue;"></span> 加入购物中,
    购物车中共 <span id="bookNumber" style="color: blue;"></span> 本书,
    总价: ¥<span id="totalMoney" style="color: blue;"></span> 元
    </h2>
    <hr size="3px" color="blue">
    <ol>
        <li>
            Java <a href="<%=basePath%>addToCart?bookName=Java&price=100">加入购物车</a><br><br>
        </li>
        <li>
            Oracle <a href="<%=basePath%>addToCart?bookName=Oracle&price=200">加入购物车</a><br><br>
        </li>
        <li>
            Struts2 <a href="<%=basePath%>addToCart?bookName=Struts2&price=300">加入购物车</a><br><br>
        </li>
    </ol>
  </body>
</html>
web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <servlet>
    <servlet-name>AddToCartServlet</servlet-name>
    <servlet-class>com.atguigu.app.ajax.servlet.AddToCartServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AddToCartServlet</servlet-name>
    <url-pattern>/addToCart</url-pattern>
  </servlet-mapping>
</web-app>

Book.java:

package com.atguigu.app.ajax.beans;

public class Book {
    private String bookName;    // 书名
    private double price;        // 单价
    private int totalNumber;    // 数量
    
    public String getBookName() {
        return bookName;
    }
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    public int getTotalNumber() {
        return totalNumber;
    }
    public void setTotalNumber(int totalNumber) {
        this.totalNumber = totalNumber;
    }
}
ShoppingCart.java:

package com.atguigu.app.ajax.util;

import java.util.HashMap;
import java.util.Map;

import com.atguigu.app.ajax.beans.Book;

public class ShoppingCart {
    // 声明一个购物车集合
    private Map<String, Book> booksMap = new HashMap<>();
    
    // 添加到购物车
    public void addToCart(String bookName, double price) {
        
        // 先看看购物车集合中是否存在该书, 如果有, 则数量+1, 否则, 数量=1
        if (booksMap.containsKey(bookName)) {
            // 如果包含该书, 就从购物车集合中取出这本书
            Book book = booksMap.get(bookName);
            
            // 定义书的信息[数量]
            book.setTotalNumber(book.getTotalNumber() + 1);
        } else {
            // 如果不包含该书, 那么创建一本书并把书添加到购物车集合中
            Book book = new Book();
            book.setBookName(bookName);
            book.setPrice(price);
            book.setTotalNumber(1);
            
            booksMap.put(bookName, book);
        }
    }
    
    // 因为要计算总价, 所以要获取购物车集合中对应书本的数量
    public int getTotalBookNumber() {
        int totalNumber = 0;
        
        // 遍历找到该书应的购买数量
        for (Book book : booksMap.values()) {
            totalNumber += book.getTotalNumber();
        }    
        
        return totalNumber;
    }
    
    // 计算书的总价
    public double getTotalMoney() {
        double totalMoney = 0.0;
        
        // 遍历找到该书应的购买数量
        for (Book book : booksMap.values()) {
            totalMoney += book.getTotalNumber() * book.getPrice();
        }
        
        return totalMoney;
    }
}
AddToCartServlet.java:

package com.atguigu.app.ajax.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.atguigu.app.ajax.util.ShoppingCart;

@SuppressWarnings("serial")
public class AddToCartServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        this.doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        // 获取JSP传递过来的参数: bookName, price
        String bookName = request.getParameter("bookName");
        double price = Double.parseDouble(request.getParameter("price"));
        
        // 用户第一次访问, session中购物车不存在, 需要创建一个购物车对象放入session
        HttpSession session = request.getSession();
        ShoppingCart cart = (ShoppingCart) session.getAttribute("cart");
        
        // session中不存在购物车对象
        if (cart == null) {
            cart = new ShoppingCart();
            session.setAttribute("cart", cart);
        }
        
        // 如果session中存在购物车对象, 就把书放入购物车
        cart.addToCart(bookName, price);
        
        // 拼接操作, 返回目标JSON数据
        // 目标JSON数据: {"bookName": "Java", "bookNumber": 10, "totalMoney": 2000.0}
        StringBuffer bookJSON = new StringBuffer();
        bookJSON.append("{")
                .append("\"bookName\": \"" + bookName + "\"")
                .append(",")
                .append("\"bookNumber\": ")
                .append(cart.getTotalBookNumber())
                .append(",")
                .append("\"totalMoney\": ")
                .append(cart.getTotalMoney())
                .append("}");
        
        // 返回JSON数据
        response.setContentType("text/javascript;charset=UTF-8");
        response.getWriter().print(bookJSON.toString());
    }

}

----------------------------------------------------------------------------

测试:

 

posted @ 2017-03-11 14:14  半生戎马,共话桑麻、  阅读(178)  评论(0)    收藏  举报
levels of contents