粗略实现购物车系统

本文详细介绍了如何实现一个简单的购物车系统,包括JavaBean的编写规范、购物车业务组件的核心方法如添加、删除商品,以及ShoppingServlet和ShowProductServlet在商品显示和购物车操作中的作用。购物车系统通过Servlet进行请求处理,实现了商品的增删及总价计算,同时展示了商品信息的显示逻辑。
摘要由CSDN通过智能技术生成

粗略实现购物车系统

1.实现products的JavaBean:

javabean编写规范:

  • 1.属性私有,建议采用包装类型
  • 2.访问器公有,标准的setter/getter驼峰命名形式,故属性名应大于2个字母,不应出现首2字母为大写的情况
  • 3.有无参构造方法
  • 4.实现Serializable接口
  • 5.可以有多参或全参构造方法
  • 6.可以有toString等对象信息展示方法
//Product.java
package shoppingcart;

import java.io.Serializable;

/**
 * @author fhzheng
 * <h1>产品实体</h1>
 * <h1>javabean编写规范</h1>
 * <li> 1.属性私有,建议采用包装类型
 * <li> 2.访问器公有,标准的setter/getter驼峰命名形式,故属性名应大于2个字母,不应出现首2字母为大写的情况
 * <li> 3.有无参构造方法
 * <li> 4.实现Serializable接口
 * <li> 5.可以有多参或全参构造方法
 * <li> 6.可以有toString等对象信息展示方法
 */
public class Product implements Serializable {
   
   /**
    * <li>属性 
    */
   private static final long serialVersionUID = 1L;
   private String id;          //商品标识
   private String name;         //商品名称
   private String description;       //商品描述
   private double price;        //商品价格
   private int num;            //商品数量-即库存
   
   public Product(){ }
   
   public Product(
         String id,
         String name,
         String description,
         double price,
         int num){
      this.id=id;
      this.name=name;
      this.description=description;
      this.price=price;
      this.num=num;
   }
   
   public String getId() {
      return (this.id);
   }
   public void setId(String id) {
      this.id = id;
   }
   public String getName() {
      return (this.name);
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getDescription() {
      return (this.description);
   }
   public void setDescription(String description) {
      this.description = description;
   }
   public double getPrice() {
      return (this.price);
   }
   public void setPrice(double price) {
      this.price = price;
   }
   public int getNum() {
      return (this.num);
   }
   public void setNum(int num) {
      this.num = num;
   }

   @Override
   public String toString() {
      return "Product [id=" + id + ", name=" + name + ", description=" + description + ", price=" + price + ", num="
            + num + "]";
   }
   
   
}

2.购物车业务组件的编写:

package shoppingcart;

import java.util.*;

/**
 * @author fhzheng
 * <h1> 购物车业务组件 </h1>
 * <li> 1 购物车业务可以有多复杂呢?
 * <li> 2 购物车中的商品数量和库存数量之间是什么关系
 * <li> 3 加商品和移除商品时,有哪些动作要发生,业务才完整
 * <li> 4 如果是真实的业务,数据存在库中,这些操作又将如何完成呢?
 * <li> 5 业务组件是系统的核心
 * <li> 6 不要低估直实业务的复杂性,思考企业级应用的挑战性
 * 
 */
public class ShopCart {
   
   /**
    * <li>是一个List对象,存放商品
    * <li>相当于是模拟购物车本身
    * <li>用它的add和remove功能
    * <li>还有iterator功能实现遍历
    */
   private ArrayList<Product> cart=null;
   
   /**
    * <li>用构造函数初始化购物车
    */
   public ShopCart() {
      cart=new ArrayList<Product>();
   }
   
   /**
    * <li>向购物车中添加商品
    * @param product
    */
   public void addProductToCart(Product product){  
      boolean is = false;
      //是否第一次购买
      for(int i=0; i<cart.size(); i++){
         //如果已经存在该商品,肯定不是第一次购买
         if(cart.get(i).getId().equals(product.getId())){ // 已存在
            is = true;
            // 每次只添加一件,购物车中添加一件,库存就会少一件
            cart.get(i).setNum(cart.get(i).getNum()-1); //为何为-1?
            break;
         } 
      }
      //是第一次购买
      if(is == false){
         // 每次只添加一件
         // 动作1 库存同步
         product.setNum(99);    // 假设库存均为100件,首次添加购物车后,剩99件
         // 动作2 加购物车
         cart.add(product);
      }  
   }
   
   /**
    * <li>从购物车中删除一商品
    * @param productId
    */
   public void removeProductFromCart(String productId){  
      if(cart==null)
         return;
      //用迭代器遍历找商品
      Iterator it=cart.iterator();
      while(it.hasNext()){
         Product item=(Product)it.next();
         if(item.getId().equals(productId)){
            // 动作1,从购物车中去掉该商品
            it.remove();
            // 动作2,库恢复
            item.setNum(100);
            return;
         }  
      }
   }
   
   /**
    * <li>计算购物车中的商品总价格
    * @return
    */
   public double getAllProductPrice(){    
      if(cart==null)
         return 0;
      double totalPrice=0;
      // 购物车迭代器
      Iterator it=cart.iterator();
      while(it.hasNext()){
         Product item=(Product)it.next();
         //求的是之积之和,谁的积,谁的和?
         totalPrice += item.getPrice()*(100-item.getNum());
      }
      return totalPrice;
   }
   
   /**
    * 返回购物车所有产品信息
    * @return
    */
   public List getAllProductsFromCart(){
      return cart;
   }
}

其中核心部分讲解:

创建一个名为cart的列表,其目的在于将商品的属性直接添加进链表内,方便传参给其他类遍历购物车内的内容,比如实现增删。

private ArrayList<Product> cart=null;
shopcart()方法,为cart链表赋属性(product)
public ShopCart() {
   cart=new ArrayList<Product>();
}
addProductToCart方法(添加购物车)
public void addProductToCart(Product product){  
   boolean is = false;
   //是否第一次购买
   for(int i=0; i<cart.size(); i++){ //遍历cart链表中的元素
      //如果已经存在该商品,肯定不是第一次购买
      if(cart.get(i).getId().equals(product.getId())){ // 已存在 //cart.get(i) 获取下标的映射值
          //.getid()获取商品名 再判断和加入商品,此处名为product是否一致,一致则表明已经存在
         is = true;
         // 每次只添加一件,购物车中添加一件,库存就会少一件
         cart.get(i).setNum(cart.get(i).getNum()-1); //为何为-1? //下标为i对应的商品库存--
         break;
      } 
   }
   //是第一次购买
   if(is == false){
      // 每次只添加一件
      // 动作1 库存同步
      product.setNum(99);    // 假设库存均为100件,首次添加购物车后,剩99件
      // 动作2 加购物车
      cart.add(product); //由于第一次购买,需要添加product到链表中
   }  
}
removeProductFromCart购物车中删除
public void removeProductFromCart(String productId){  
      if(cart==null)
         return;
      //用迭代器遍历找商品
      Iterator it=cart.iterator();
      while(it.hasNext()){
         Product item=(Product)it.next();
         if(item.getId().equals(productId)){
            // 动作1,从购物车中去掉该商品
            it.remove();
            // 动作2,库恢复
            item.setNum(100);
            return;
         }  
      }
   }

3.ShoppingServlet编写

其中理解见注释

需要结合第四点,ShowProductServlet商品的显示理解。

//ShoppingServlet.java
package shoppingcart;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

/**
 * @author fhzheng
 * <h1> 交易控制器 </h1>
 * <li> 完成业务动作控制【路由】
 */
public class ShoppingServlet extends HttpServlet {

   // java常量的定义方式和规范
   private static final String CONTENT_TYPE = "text/html;charset=utf-8";

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

      response.setContentType(CONTENT_TYPE);
      // 方法中的局部变量
      ServletContext context = getServletContext();
       //cart获取服务器中已经存在的属性为shopcart的链表对象
      HttpSession session = request.getSession();
      ShopCart cart = (ShopCart) session.getAttribute("shopCart");

      // 控制器动作判别 获取html中用户的操作,action为button的属性
      String action = request.getParameter("action"); 
      if ("remove".equals(action)) { // 从购物车中移走一件产品
         String removeId = request.getParameter("removeId"); 
          注意此处的removeId来自于以下页面上的传参
          /*out.println("<td><a href=\""+response.encodeURL("./shopping?action=remove&removeId=")+productItem.getId()+"\">删除</a>"*/
         cart.removeProductFromCart(removeId);
      } else if ("add".equals(action)) { // 添加
         String[] productIds = request.getParameterValues("productId");// 获取当前用户选择的产品ID 见第四点传入
         Map products = (Map) context.getAttribute("products"); // 从ServletContext对象中提取产品信息
          //product
         if (cart == null) {
            cart = new ShopCart(); // 创建一个购物车对象
            session.setAttribute("shopCart", cart);
         }
         if (productIds == null) {
            productIds = new String[0];
         }
         for (int i = 0; i < productIds.length; i++) { // 将用户选择的产品添加到购物车中
            Product product = (Product) products.get(productIds[i]);
            cart.addProductToCart(product);
         }
      }
      RequestDispatcher rd = request.getRequestDispatcher("/showcart");
      rd.forward(request, response); // 转向购物车显示的Servlet--showcartservlet
   }

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

4.ShowProductServlet 商品显示理解

package shoppingcart;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
/**
 * @author fhzheng
 * <h1> 产品显示控制器 </h1>
 * 
 */
public class ShowProductServlet extends HttpServlet {

   private static final String CONTENT_TYPE="text/html;charset=utf-8";
   private Map products;  //映射对象 products
     //下文中的操作 将5件商品按序号顺序存入map中,之后通过set定义productidset对象为键值对形式,用迭代器it来遍历里面的“键”
   /*Set productIdSet=products.keySet();
      Iterator it=productIdSet.iterator();*/
 
   public void init() throws ServletException{
      // 用HashMap来做商店,初始化各种商品,供所有用户来购买
      // 初始时,商品库存数量均为100个
      products=new HashMap(); //hashmap
      products.put("001",new Product("001","海信电视机","58英寸,LED液晶显示,安卓操作系统,2014年上市",6999.00,100));
      products.put("002",new Product("002","海尔洗衣机","洗涤容量6Kg,滚筒式,LED显示屏,内筒材料为不锈钢",3999.00,100));
      products.put("003",new Product("003","格力空调","三级变频,壁式挂机,超静音,超长质保,强力除湿",3269.00,100));
      products.put("004",new Product("004","海尔热水器","横式,专利金刚三层胆,专利金刚三层胆,60L",2780.00,100));
      products.put("005",new Product("005","西门子冰箱","三门冰箱,电脑控温,总容积为231-280L,能效等级为一级",5780.00,100));
      ServletContext context=getServletContext();
      // 商店置于APP全局中,所有人共享可用,买走1份少1份
      context.setAttribute("products",products);
   }
   
   public void doGet(
         HttpServletRequest request,
         HttpServletResponse response) throws ServletException,IOException {
   
      response.setContentType(CONTENT_TYPE);
      PrintWriter out=response.getWriter();
      out.println("<html>");
      out.println("<head><title>ShowProductServlet</title></head>");
      out.println("<body bgcolor=\"#ffffff\">");
      out.println("<h1>商品显示</h1>");
      out.println("<a href=\""+response.encodeUrl("./showcart")+"\">查看购物车</a>");
      out.println("<form name=\"productForm\" action=\"./shopping\"method=\"post\">");
      out.println("<input type=\"hidden\" name=\"action\" value=\"add\"/>");
      out.println("<table border=\"1\" cellspacing=\"0\">");
      out.println("<tr bgcolor=\"#cccccc\">");
      out.println("<tr bgcolor=\"#cccccc\"><td>序号</td><td>商品名称</td><td>商品描述</td><td>商品价格(元)</td><td>库存数量</td><td>添至购物车</td></tr>");
       //见上文
      Set productIdSet=products.keySet();
      Iterator it=productIdSet.iterator();
      int number=1;
      while(it.hasNext()){
         String id=(String)it.next();
         Product product=(Product)products.get(id);
         out.println("<tr><td>"+number+++"</td>");
         out.println("<td>"+product.getName()+"</td>");
         out.println("<td>"+product.getDescription()+"</td>");
         out.println("<td>"+product.getPrice()+"</td>");
         out.println("<td>"+product.getNum()+"</td>");
         out.println("<td><input type=\"checkbox\" name=\"productId\" value=\""
         +product.getId()+"\"></td></tr>");
      }
      out.println("</table><p><input type=\"submit\" value=\"确定\"/>");
      out.println("<input type=\"reset\" value=\"重置\"/></p>");
      out.println("</form></body></html>");
      out.close();
   }
   
   public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
      doGet(request,response);
   }
   
   public void destroy(){ }
}

5.购物车显示ShowCartServlet

//ShowCartServlet.java
package shoppingcart;

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

/**
 * @author fhzheng
 * <h1> 显示控制器 </h1>
 * <li> 完成界面的渲染和数据组装
 */
public class ShowCartServlet extends HttpServlet{
   
   private static final String CONTENT_TYPE="text/html;charset=utf-8";
   
   public void doGet(
         HttpServletRequest request,
         HttpServletResponse response) throws ServletException,IOException {
      
      response.setContentType(CONTENT_TYPE);
      PrintWriter out=response.getWriter();
      HttpSession session=request.getSession();
      
      ShopCart shopcart=(ShopCart)session.getAttribute("shopCart");
      List products=null;
      
      if(shopcart==null||(products=shopcart.getAllProductsFromCart())==null){
         out.println("<html>");
         out.println("<head><title>ShowCartServlet</title></head>");
         out.println("<body bgcolor=\"#ffffff\">");
         out.println("<p><h1>你目前没有购买任何商品</h1></p>");
         out.println("<p><a href=\""+response.encodeUrl("./show")+"\">返回产品显示页</a></p>");
         out.println("</body></html>");
         out.close();
      } else {
         Iterator it=products.iterator();
         out.println("<html>");
         out.println("<head><title>ShowCartServlet</title></head>");
         out.println("<body bgcolor=\"#ffffff\">");
         out.println("<p><h1>你目前购买的商品为:</h1></p>");
         out.println("<table border=\"1\" cellspacing=\"0\">");
         out.println("<tr bgcolor=\"#cccccc\"><td>商品名称</td><td>商品描述</td><td>价格</td><td>购买数量</td><td>操作</td></tr>");
         while(it.hasNext()){
            Product productItem=(Product)it.next();
            out.println("<tr><td>"+productItem.getName()+"</td>");
            out.println("<td>"+productItem.getDescription()+"</td>");
            out.println("<td>"+productItem.getPrice()+"</td>");
            out.println("<td>"+(100-productItem.getNum())+"</td>");
            out.println("<td><a href=\""+response.encodeURL("./shopping?action=remove&removeId=")+productItem.getId()+"\">删除</a>"); //删除后将跳转到shoppingservle组件中,进行删除操作后又将回到此页面故会发现商品已经被删除
         }
         out.println("</table>");
         out.println("<p>目前您购物车的总价格为:"+shopcart.getAllProductPrice()+"元人民币。</p>");
         out.println("<p></br><a href=\""+response.encodeURL("./show")+"\">返回产品显示页</a></p>");
         out.println("</body></html>");
         out.close();
      }
   }
   
   public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
      doGet(request,response);
   }
}

进行删除操作后又将回到此页面故会发现商品已经被删除
}
out.println(“”);
out.println(“

目前您购物车的总价格为:”+shopcart.getAllProductPrice()+“元人民币。

”);
out.println(“

<a href=”“+response.encodeURL(”./show")+“”>返回产品显示页

“);
out.println(”");
out.close();
}
}

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值