victory的博客

长安一片月,万户捣衣声

0%

基于JavaWeb的网上购物商城 | 购物车

购物车

实现功能:
用户在登录状态下可以将商品加入购物车(如下图所示)。

product_info.jsp
(1)给购物车按钮增加onclick属性。

<div style="margin: 20px 0 10px 0;; text-align: center;">
    <a href="#"> <input
        style="background: url('./images/product.gif') no-repeat scroll 0 -600px rgba(0, 0, 0, 0); height: 36px; width: 127px;"
        value="加入购物车" type="button" onclick="cart()">
    </a> &nbsp;收藏商品
</div>

(2)使用js编写cart()

<script type="text/javascript">
    function cart(){
        location.href="${pageContext.request.contextPath}/product?method=cart&pid=${p.pid}&proNumber="+$("#quantity").val();
    }
</script>

CartItem.java
一个购物项(由一个商品、数量、小计构成)

package com.oracle.bean;

public class CartItem {
    private Product pro = new Product();
    private double subTotal;
    private int count;
    public CartItem() {
        super();
        // TODO Auto-generated constructor stub
    }
    public CartItem(Product pro, double subTotal, int count) {
        super();
        this.pro = pro;
        this.subTotal = subTotal;
        this.count = count;
    }
    public Product getPro() {
        return pro;
    }
    public void setPro(Product pro) {
        this.pro = pro;
    }
    public double getSubTotal() {
        return subTotal;
    }
    public void setSubTotal(double subTotal) {
        this.subTotal = subTotal;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    
}

Cart.java
购物车(由一个存储许多购物项的Map集合、总计金额构成)

package com.oracle.bean;

import java.util.HashMap;
import java.util.List;

public class Cart {
    private HashMap<String, CartItem> map = new HashMap<>();
    private double subMoney;
    public Cart() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Cart(HashMap<String, CartItem> map, double subMoney) {
        super();
        this.map = map;
        this.subMoney = subMoney;
    }
    public HashMap<String, CartItem> getMap() {
        return map;
    }
    public void setMap(HashMap<String, CartItem> map) {
        this.map = map;
    }
    public double getSubMoney() {
        return subMoney;
    }
    public void setSubMoney(double subMoney) {
        this.subMoney = subMoney;
    }
    
}

ProductServlet.java
在ProductServlet的doGet方法中添加购物车的判断并完成cart方法。

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String method = request.getParameter("method");
    if("getProById".equals(method)) {
        getProById(request, response);
    }else if("findListByCate".equals(method)) {
        findListByCate(request, response);
    }else if("cart".equals(method)) {
        cart(request, response);
    }
}

public void cart(HttpServletRequest request, HttpServletResponse response) {
    // TODO Auto-generated method stub
    //接收前台参数
    try {
        String pid = request.getParameter("pid");
        String pn = request.getParameter("proNumber");
        int proNumber = Integer.parseInt(pn);
        //查询商品信息
        ProductService ps = new ProductService();
        Product pro = ps.getProById(pid);
        
        //从session中获取购物车
        HttpSession session = request.getSession();
        Cart cart = (Cart)session.getAttribute("cart");
        //判断用户是否登录
        User user = (User)session.getAttribute("user");
        if(user==null) {
            //跳转到首页
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
        
        //判断购物车是否为空
        if(cart==null) {
            //创建一个新的购物车
            cart = new Cart();
        }
        //否则有数据    有数据的话添加商品
        HashMap<String, CartItem> map = cart.getMap();
        if(map.containsKey(pid)) {
            //购物车中已经存在当前要购买的商品
            //获取购物车中商品的数量
            CartItem ci = map.get(pid);
            //获取购物车中商品的数量
            int count = ci.getCount();
            //购物车商品数量+需要购买的商品的数量=总数
            int newCount = count+proNumber;
            //商品小计
            double subTotal = newCount * pro.getShop_price();
            
            ci.setCount(newCount);
            ci.setSubTotal(subTotal);
            map.put(pid, ci);
        }else {
            //购物车中不存在购买的商品
            CartItem ca = new CartItem();
            ca.setPro(pro);
            ca.setCount(proNumber);
            ca.setSubTotal(proNumber*pro.getShop_price());
            map.put(pid, ca);
        }
        //定义变量存储总计
        double totalMoney=0.0;
        Set<String> keySet = map.keySet();
        for(String key:keySet) {
            CartItem cc = map.get(key);
            totalMoney+=cc.getSubTotal();
        }
        cart.setSubMoney(totalMoney);
        cart.setMap(map);
        
        //把购物车放入session中
        session.setAttribute("cart", cart);
        
        //请求转发到购物车页面解析
        request.getRequestDispatcher("/cart.jsp").forward(request, response);
        
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String method = request.getParameter("method");
    if("getProById".equals(method)) {
        getProById(request, response);
    }else if("findListByCate".equals(method)) {
        findListByCate(request, response);
    }else if("cart".equals(method)) {
        cart(request, response);
    }
}

public void cart(HttpServletRequest request, HttpServletResponse response) {
    // TODO Auto-generated method stub
    //接收前台参数
    try {
        String pid = request.getParameter("pid");
        String pn = request.getParameter("proNumber");
        int proNumber = Integer.parseInt(pn);
        //查询商品信息
        ProductService ps = new ProductService();
        Product pro = ps.getProById(pid);
        
        //从session中获取购物车
        HttpSession session = request.getSession();
        Cart cart = (Cart)session.getAttribute("cart");
        //判断用户是否登录
        User user = (User)session.getAttribute("user");
        if(user==null) {
            //跳转到首页
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
        
        //判断购物车是否为空
        if(cart==null) {
            //创建一个新的购物车
            cart = new Cart();
        }
        //否则有数据    有数据的话添加商品
        HashMap<String, CartItem> map = cart.getMap();
        if(map.containsKey(pid)) {
            //购物车中已经存在当前要购买的商品
            //获取购物车中商品的数量
            CartItem ci = map.get(pid);
            //获取购物车中商品的数量
            int count = ci.getCount();
            //购物车商品数量+需要购买的商品的数量=总数
            int newCount = count+proNumber;
            //商品小计
            double subTotal = newCount * pro.getShop_price();
            
            ci.setCount(newCount);
            ci.setSubTotal(subTotal);
            map.put(pid, ci);
        }else {
            //购物车中不存在购买的商品
            CartItem ca = new CartItem();
            ca.setPro(pro);
            ca.setCount(proNumber);
            ca.setSubTotal(proNumber*pro.getShop_price());
            map.put(pid, ca);
        }
        //定义变量存储总计
        double totalMoney=0.0;
        Set<String> keySet = map.keySet();
        for(String key:keySet) {
            CartItem cc = map.get(key);
            totalMoney+=cc.getSubTotal();
        }
        cart.setSubMoney(totalMoney);
        cart.setMap(map);
        
        //把购物车放入session中
        session.setAttribute("cart", cart);
        
        //请求转发到购物车页面解析
        request.getRequestDispatcher("/cart.jsp").forward(request, response);
        
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}