购物车实现逻辑【详解】

本文详细介绍了一款购物车系统的实现逻辑,包括定义模型、页面操作分析、功能函数实现及业务处理类接口与实现。通过解析Cart类和CartItem类,展示了如何通过添加、删除、更新商品及清空购物车等操作,实现用户购物体验的全流程管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

购物车实现逻辑详解


 想要实现这样的效果:



1、首先要定义其模型



2、分析页面操作



3、实现其功能函数(在fun包下新建)

Cart.java
/**
 * 购物车
 *  @author  Administrator
 *
 */
Public  class  Cart {
      private  int  totalCount  ; //购书数量
      private  float  totalPrice  ; //购书总价
      private  Map<Integer, CartItem>  map =  new  HashMap<>();//定义一个集合来存放购物项
     

      //得到书的数量,怎么得?→bookId
      public  int  getTotalCount() {
            int  totalCount=0;
            for (Integer bookId: map  .keySet()){
              totalCount+=  map .get(bookId).getCount();
          }
          
            return  totalCount;
     }
     
  /*API:public Set<K> keySet()返回此映射中所包含的键的 set 视图。    
       for(Integer bookId:map.keySet()) ,这里面定义了一个和map集合键同类型的变量bookId
       map.keySet()表示当前map集合中的所有的键的一个视图
         
   分解:map.get( bookid).getCount();
   map.get( bookid);→ 根据键获取值(CartItem)→(CartItem)对象调用getCount();
*/



     
      //得到书的总价?怎么得→bookId
      public  float  getTotalPrice() {
            float  totalPrice=0;
            for (Integer bookId: map  .keySet()){
              totalPrice+=  map .get(bookId).getItemPrice();
          }
            return  totalPrice;
     }

     
     
      public  Map<Integer, CartItem> getMap() {
            return  map  ;
     }
     
      public  void  setMap(Map<Integer, CartItem> map) {
            this . map  = map;
     }


      @Override
      public  String toString() {
            return  "Cart [totalCount="  +  totalCount  +  ", totalPrice="  +  totalPrice
                   +  ", map="  +  map  +  "]"  ;
     }
          
}



CartItem.java文件

/**
 * 购物项类
 *  @author  Administrator
 *
 */
public  class  CartItem {

      private  Book  book ;  //图书
      private  int  count  ; //当前购物项的图书数量
      public  CartItem() {
            super ();
     }

      public  CartItem(Book book,  int  count) {
            super ();
            this . book  = book;
            this . count  = count;
     }

      public  Book getBook() {
            return  book  ;
     }

      public  void  setBook(Book book) {
            this . book  = book;
     }

      public  int  getCount() {
            return  count  ;
     }

      public  void  setCount( int  count) {
            this . count  = count;
     }

      // 得到小计
      public  float  getItemPrice() {
            return  book  .getPrice() *  count ;
     }
      @Override
      public  String toString() {
            return  "CartItem [book="  +  book  +  ", count="  +  count  +  "]"  ;
     }
                   
}


4、编写逻辑处理类CartServlet

   大体思路:
     ①接收请求参数
     ②处理请求(谁来处理请求)
     ③转发请求
     
 先定义好CartServlet然后依次写出待实现的空方法

public  class  CartServlet  extends  BaseServlet {
      private  static  final  long  serialVersionUID  = 1L;
     CartService  cartService = new  CartServiceImpl();
     BookService  bookService = new  BookServiceImpl();
     
      protected  void  add(HttpServletRequest request, HttpServletResponse response)  throws  ServletException, IOException {
          System.  out .println( "add...."  );
          String bookid = request.getParameter(  "bookid" );
          Book book =  bookService .getBookById(bookid);
          Cart cart = WebUtils. getCart(request);
            cartService .add(book, cart);

          WebUtils. myForward(request, response,
                     "/client/BookClientServlet?method=getPageInCondition"  );

          
     }
     
      protected  void  delete(HttpServletRequest request, HttpServletResponse response)  throws  ServletException, IOException {
          System.  out .println( "delete..."  );
          String bookid = request.getParameter(  "bookid" );
          Cart cart = WebUtils. getCart(request);
            cartService .deleteItem(Integer.parseInt(bookid), cart);
          WebUtils. myForward(request, response,  "/client/book/cart.jsp"  );
          
     }
      protected  void  update(HttpServletRequest request, HttpServletResponse response)  throws  ServletException, IOException {
          System.  out .println( "update...."  );
          String count = request.getParameter(  "count" );
          String bookId = request.getParameter(  "bookId" );
          
            cartService .updateCount(Integer.parseInt(bookId),
                   Integer. parseInt(count), WebUtils.getCart(request));
          
          WebUtils. myForward(request, response,  "/client/book/cart.jsp"  );
          
          
     }
     
      protected  void  clear(HttpServletRequest request, HttpServletResponse response)  throws  ServletException, IOException {
          
          System.  out .println( "clear....."  ); 
            cartService .clear(WebUtils.getCart(request));
          
          WebUtils. myForward(request, response,  "/client/book/cart.jsp"  );
          
          
     }

}


5、编写业务处理类接口


/**
 * 处理购物车相关业务的接口
 *  @author  Administrator
 *
 */
public  interface  CartService {
     
      //向购物车中添加书,书→book 购物车→cart
      public  void  add(Book book ,Cart cart);
      //删除一个购物项 ,在购物车中找到要删除的购物项的bookId
      public  void  deleteItem(Integer BookId,Cart cart);
      //更新购物车中书的数量
      public  void  updateCount( int  BookId, int  count,Cart cart);
      //清空购物车
      public  void  clear(Cart cart);
     
          
}

6、编写业务处理接口的实现类

/**
 *  处理购物车相关业务的实现类
 *  @author  Administrator
 *
 */
public  class  CartServiceImpl  implements  CartService {

      /**
      * 包含购物车中有书和没有书两种情况
      */
      @Override
      public  void  add(Book book, Cart cart) {
          Integer bookId = book.getBookId();
          CartItem cartItem = cart.getMap().get(bookId);
            if (cartItem== null ){ //如果购物车为空的话
              cartItem =  new  CartItem(book,1); //创建一个购物项
              cart.getMap().put(bookId, cartItem);
          }  else { // 不为空的话
              cartItem.setCount(cartItem.getCount()+1);
              
          }

     }

      @Override
      public  void  deleteItem(Integer BookId, Cart cart) {
          cart.getMap().remove(BookId);

     }

      @Override
      public  void  updateCount( int  BookId,  int  count, Cart cart) {
          cart.getMap().get(BookId).setCount(count);

     }

      @Override
      public  void  clear(Cart cart) {
          cart.getMap().clear();

     }

}


6、页面访问(bookList.jsp)


数据来源: bookid= ${book.bookId}  &bookName=  ${book.bookName}

以上来自于: <  li > 书名:  < a  href = "client/ BookClientServlet?method=getBook
★返回的是一个book对象,EL表达式可以获取book对象里面的属性.比如${book.bookId}


分析页面:
★页面上会显示三种状态:
         
                 ●当没有书的时候:显示→购物车中暂时还没有一本书
              ●当点击其他分类的时候:显示→您的购物车中有1本书, 查看购物车
              ●当添加一本书的时候:显示→android添加到了购物车, 购物车中有1本书, 查看购物车
              
如何实现呢??


 < tr>
                    < td class= "centerTd" colspan = "2">
                         < c:choose>
                              < c:when test= " ${empty CART || empty CART.map}" >
                                  购物车中暂时还没有一本书
                            </ c:when>

                              < c:when test= " ${empty param.bookName} ">
                                  您的购物车中有${CART.totalCount}本书, < a href ="client/book/cart.jsp?1=1" >查看购物车 </ a>
                              </ c:when>

                              < c:otherwise>
                                  将 < font color ="red" >${param.bookName } </ font> 添加到了购物车, 购物车中有${CART.totalCount}本书,
                                             < a href ="client/book/cart.jsp?1=1" >查看购物车 </ a>
                              </ c:otherwise>
                         </ c:choose>
     
                    </ td>
  </  tr >



★详细解答页面显示的三种状态★


◆判断购物车为空和判断购物车集合为空有什么区别?
<c:when test="${empty CART || empty CART.map } ">

解答:这是两种情况,要分别写上
<!-- CART==null  CART.map.size()==0 -->


◆第二个和第三个条件类似都是查看购物车有几本书,那么如何区分呢?
  解:区分标准就是看有没有点击链接(图书信息中的“加入购物车”)
 
 ◇那么,点没点击链接到底有什么区别嗯?
  解:看第二个条件有一个显示效果,将 android 添加到了购物车 , 购物车中有 1本书, 查看购物车
 
 ◇那么,如何动态的显示添加的书名呢?
  解:★妙招:将
  <li><a href="client/CartServlet?method=add&bookid= ${book.bookId}"> 加入购物车</a></li>
  该链接的后面加上 &bookName=${book.bookName} ,也即是:
  <li><a href="client/CartServlet?method=add&bookid= ${book.bookId}&bookName=${book.bookName} ">加入购物车 </a></li>
 
  好处:只要点击该链接就会携带该参数,既可以用以显示书名,还可以用于标识到底该执行哪个条件(第二个、第三个)
            
                
 ◇那么,★在第二个条件中 <a href="client/book/cart.jsp?1=1" 1=1是什么作用??
 
    如果不加的话:会报一个路径错误 /BookStore/client/book/cart.jsp&cateId=&minPrice=&maxPrice=
    设想:要让所有的连接至少携带一个参数,这样才能保证是一个正确的路径
    解:设置一个没有用的参数,此时请求地址发送变化
    http://localhost:8989/BookStore/client/book/cart.jsp?1=1&cateId=&minPrice=&maxPrice=
    这个时候就能正常访问了
        
 ◇那么,如何理解 ${CART.totalCount}

    我的理解:CART 是存在于session 中的代表Cart 的对象,因此可以调用    getTotalCount()方法,在 EL表达式中要将 T转为小写
    


 ◆ 点击:加入购物车 后···
<  li >< a  href = "client/CartServlet?method=add&bookid= ${book.bookId}  &bookName=  ${book.bookName} " >  加入购物车  </ a ></  li >

 ◇分析:${ empty  CART ||  empty  CART.map}
   →数据来源于session,那么session中是什么时候设置进去呢?
  在webUtils.java 中
/**
      * 从请求的session中获取购物车对象
      *  @param  request
      *  @return
      */
      public  static  Cart getCart(HttpServletRequest request) {
          HttpSession session = request.getSession();
     //从session中获取cart对象,不一定有,当为空的时候在创建
          Cart cart = (Cart) session.getAttribute(  "CART" );
            if (cart== null  ){ //如果获取不到就新 创建
              cart =  new  Cart(); //新建一个购物车
              session.setAttribute(  "CART" ,cart); //将购物车设置进session中
          }
            return  cart;
          
     }

什么时候用它的呢?

◇CartServlet中
protected  void  add(HttpServletRequest request, HttpServletResponse response)  throws  ServletException, IOException {
          System.  out .println( "add...."  );
          String bookid = request.getParameter(  "bookid" );
          Book book =  bookService .getBookById(bookid);
          Cart cart = WebUtils.getCart(request);//从session中获取购物车对象
            cartService .add(book, cart); //将书添加到购物车中国

          WebUtils. myForward(request, response,
                     "/client/BookClientServlet?method=getPageInCondition"  );          
     }



7、显示页面Cart.jsp


◇点击  → android 添加到了购物车, 购物车中有1本书,  查看购物车    →Cart.jsp


◆进入我的购物车之后有两种可能:购物车中有书、没有书
     ◇没有书:则显示没有书并跳转到购书页面(需要经过 BookClientServlet
      < c:when  test = " ${ empty  CART ||  empty  CART.map} " >
     购物车中没有一本书, 立即去  < a  href = "client/BookClientServlet?method=getPageInCondition"  > 购物  </ a >                 
    </ c:when >

  ◇有书则显示列表 
<body>
	<center>
			
		<h2>我的购物车</h2>
		
			<c:choose>
				<c:when test="${empty CART || empty CART.map}">
					购物车中没有一本书, 立即去<a href="client/BookClientServlet?method=getPageInCondition">购物</a>				
				</c:when>
				<c:otherwise>
					<table border="1" cellpadding="10" cellspacing="0">
						<tr>
							<td>书名</td>
							<td>单价</td>
							<td>数量</td>
							<td>小计</td>
							<td>操作</td>
						</tr>
						<!-- (bookid, CartItem) -->
						<c:forEach items="${CART.map}" var="entry">
							<tr>
								<td>${entry.value.book.bookName}</td>
								<td>${entry.value.book.price}</td>
								<td>
									<button class="decrease" ${entry.value.count<=1 ? 'disabled="false"' : ''}>-</button>
									<input id="${entry.key}" class="count" type="text" value="${entry.value.count}" style="width: 30px;"/>
									<button class="increase">+</button>
								</td>
								<td>${entry.value.itemPrice}</td>
								<td><a class="delete" href="client/CartServlet?method=delete&bookid=${entry.key}">删除</a></td>
							</tr>						
						</c:forEach>
						
			
						<tr>
							<td><a id="clear" href="client/CartServlet?method=clear" >清空购物车</a></td>
							<td><a
								href="client/BookClientServlet?method=getPageInCondition">继续购物</a></td>
							<td>共${CART.totalCount}本书</td>
							<td>总价:${CART.totalPrice}元</td>
							<td><a href="#">去结算</a></td>
						</tr>
					</table>
				</c:otherwise>
			</c:choose>
	</center>
</body>


8、清空购物车


点击:  < td>< a id =  "clear"  href = "client/CartServlet?method=clear"   > 清空购物车   </ a></ td >

进入 CartServlet
protected  void  clear(HttpServletRequest request, HttpServletResponse response)  throws  ServletException, IOException { 
          System.  out .println( "clear...."  );
            cartService .clear(WebUtils.getCart(request));
          WebUtils. myForward(request, response,  "/client/book/cart.jsp"  );    
}

9、给所有删除链接添加点击事件

< script  type =  "text/javascript" >
     $( function (){
            //给所有删除链接添加点击事件
          $(  ".delete" ).click( function  (){
                if (!window.confirm( "你确认删除吗?"  )) {
                     return  false  ; //不让链接提交请求
              }
          });
     });
</ script >


10、给所有显示书的数量的输入框添加失去焦点的事件

就是这个:<input id="${entry.key}" class="count" type="text" value="${entry.value.count}" style="width: 30px;"/>

$( ".count" ).blur(  function (){
                //得到输入框的值
                var  count =  this  .value;
                if (isNaN(count)) {
                   count = 1;
              }
              count = count*1;  //转为number类型
                if (count<=0) {
                   count = 1;
              }
              
                //书的id
                var  bookId =  this .id;
                //请求
              window.location.href =  "${pageContext.request.contextPath}/client/CartServlet?method=update&count="  +count+ "&bookId="  +bookId;
          });



11、给<button>+</button>添加点击事件


$( ".increase" ).click(  function (){
                //得到数量
                var  $countEle = $( this ).parent().find( "input"  );
                var  count = $countEle.val(); //链式调用
              count = count*1+1;
              alert(count);
              
                //书的id
                var  bookId = $countEle.attr( "id"  );
                //请求
              window.location.href =  "${pageContext.request.contextPath}/client/CartServlet?method=update&count="  +count+ "&bookId="  +bookId;
          });


12、给<button>-</button>添加点击事件


$( ".decrease" ).click(  function (){
                //得到数量
                var  $countEle = $( this ).parent().find( "input"  );
                var  count = $countEle.val(); //链式调用
              count = count*1-1;
              alert(count);
              
                //书的id
                var  bookId = $countEle.attr( "id"  );
                //请求
              window.location.href =  "${pageContext.request.contextPath}/client/CartServlet?method=update&count="  +count+ "&bookId="  +bookId;
          });


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值