admin 管理员组

文章数量: 1184232

粗略实现购物车系统

文章目录

  • 粗略实现购物车系统
    • 1.实现products的JavaBean:
    • 2.购物车业务组件的编写:
      • 其中核心部分讲解:
        • shopcart()方法,为cart链表赋属性(product)
        • addProductToCart方法(添加购物车)
        • removeProductFromCart购物车中删除
    • 3.ShoppingServlet编写
    • 4.ShowProductServlet 商品显示理解
    • 5.购物车显示ShowCartServlet

粗略实现购物车系统

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;}@Overridepublic 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对象中提取产品信息//productif (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(); //hashmapproducts.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);
}
}


本文标签: 粗略实现购物车系统