JavaWeb09(购物车操作)

news2025/1/15 6:53:07

目录

一.购物车实现方式

1.Cookie方式.

2.session方式.

3数据库方式.

二.效果预览 

2.1 未登录提示

 2.2 已登录提示

 2.3 查看"我的购物车"

 三.实现思路

3.1 分清楚商品 订单项  订单的关系

①商品:包含基本信息

 ②订单项:除了商品的基本信息外还包含购买数量和价格小计

③订单:由多个订单项组成 

3.2 表的设计

 3.3 实现登录与否的提示

3.4 订单项的构成

 3.5 形成订单项集合,存到session中

3.6 购物车界面绑值

3.7 解决两个问题

3.7.1 覆盖问题,永远只有一个

3.7.2 加同一商品重复问题

如何不跳转购物车界面?只提示成功但加入到了购物车中?

out.print("");替换之前的跳转

3.8 合计总价格

3.9 实现删除 和修改(从session中)

3.9.1 删除

3.9.2 实现修改

3.10 细节处理

3.10.1 已登录,但购物车为空时

 3.10.2 未登录,点击"我的购物车"【建议参考淘宝】


一.购物车实现方式

1.Cookie方式.

  • 优点: Cookie是存储在客户端的,占用很少的资源,可以减轻服务器的压力。

  • 缺点: 基于Cookie开发的购物车要求用户浏览器必须支持并设置为启用cookie,否则购物车则失效, 如果换一台机器再去登录的话,就会丢失购物车信息。


2.session方式.

  • 优点:session可以与客户端保持同步,不依赖于客户端的设置,它是存储在服务器端的信息,因此比较安全。

  • 缺点:session会占用服务器资源,加大服务器的负荷, 会话具有时效性,一旦超时,购物车中商品信息会丢失。


3数据库方式.

  • 优点:持久化存储,可以分析用户购买行为。

  • 缺点:购物车需要实时操作,数据库的访问量一旦大了,就容易导致发生并发或者直接崩溃,维护成本会增加。


二.效果预览 

2.1 未登录提示

 2.2 已登录提示

 2.3 查看"我的购物车"

 三.实现思路

3.1 分清楚商品 订单项  订单的关系

①商品:包含基本信息

 ②订单项:除了商品的基本信息外还包含购买数量和价格小计

③订单:由多个订单项组成 

3.2 表的设计

 3.3 实现登录与否的提示

<a href="javascript:myf('${g.gid}','${user}')"><i class="bi bi-cart-check"></i></a>

<script type="text/javascript">
            function myf(gid,user) {
                if(user){//有值 登录了
                    alert("亲,已成功加入购物车");
                    //location.href="addCart.do?gid="+gid;       
                }
                else{//没有值  没有登录
                    alert("亲,你还没有登录,请先登录");
                    //location.href="login.jsp";
                }
            }
        </script>

3.4 订单项的构成

 3.5 形成订单项集合,存到session中

//形成订单项集合
List<OrderItem> ls =(List<OrderItem>)session.getAttribute("mycart");
 //接收参数gid
 String gid=req.getParameter("gid");

//实例化一个订单项【缺少ooid和oid!!!】
 OrderItem item = new OrderItem();

 //给其赋值
  item.setGoods(goods);
  item.setOinum(1);//购买数量
 item.calcxj();//计算计算价格的方法
//把订单项加入到集合中
ls.add(item);        
//把这个集合存到session
session.setAttribute("mycart", ls);//键  值
//跳转到购物车界面绑值
resp.sendRedirect("cart.jsp?index=5");
        

3.6 购物车界面绑值

  <!--绑定购物车的值  -->
     <c:forEach items="${mycart}" var="oi">
     <th scope="row">${oi.goods.gname}</th><-- 特别注意:间接取值 -->
     <td>&yen;${oi.goods.gprice}</td>
     <td><img width="80px" src="${oi.goods.gpath}"></td>
     <td><span id="aa${oi.goods.gid}" class="xx">${oi.oiprice}</span>元</td>
  <a οnclick="return confirm('你确定从购物车移除嘛?')" href="deleteCart.do?gid=${oi.goods.gid}"><i class="bi bi-trash3-fill"></i> </a>
  </tr>
             </c:forEach> 

3.7 解决两个问题

3.7.1 覆盖问题,永远只有一个

//先拿购物车
  List<OrderItem> ls =(List<OrderItem>)session.getAttribute("mycart");
 //为空=拿不到
  if(ls==null) {

//没拿到就创建一个新的订单项集合【new一个】 拿到了就用拿到的那个进行装订单项
   ls = new ArrayList<OrderItem>();
    }

3.7.2 加同一商品重复问题

//假设法
        boolean f = false;//假设不存在
        //遍历目前的购物车集合
        for (OrderItem oi : ls) {
            //根据商品编号惊喜判断
            if(oi.getGoods().getGid()==Integer.parseInt(gid)) {
                //改数量 如果存在 在原来的基础上进行增加1
                oi.setOinum(oi.getOinum()+1);
                //改价格小计 c重新计算小计
                oi.calcxj();

                //改变f的状态
                f=true;

                //终止提高性能
                break;
            }
            
        }

        //全部遍历完了 确实不存在
        if(f==false) {
    //实例化一个订单项【缺少ooid和oid!!!】
            OrderItem item = new OrderItem();
         //给其赋值
            item.setGoods(goods);
            item.setOinum(1);//购买数量
            item.calcxj();//计算小计
            //把订单项加入到集合中
            ls.add(item);
        }

如何不跳转购物车界面?只提示成功但加入到了购物车中?

out.print("<script>history.go(-1);</script>");替换之前的跳转

3.8 合计总价格

$(function(){
        //统计价格
            var sum = 0.0;
            //遍历
            $(".xx").each(function(i,v){//下标  值
            //累计求和
            sum+=parseFloat(v.innerHTML);
            });
            //保留1位小数
            sum=sum.toFixed(2);
            //给span标签赋值
            $("#sums").html(sum);
        })
   

//如果仍然出现很多位小数  则采用以下方法保留1位小数

String ss = String.format("%.1f",this.oiprice);
this.oiprice  = Double.parseDouble(ss);  

Sysstem.out.printIn(this.oiprice)

3.9 实现删除 和修改(从session中)

3.9.1 删除

<a onclick="return confirm('你确定从购物车删除嘛?')" href="deleteCart.do?gid=${oi.goods.gid}"><i class="bi bi-trash3-fill"></i> </a>

//接收参数gid
        String gid=req.getParameter("gid");
     //先拿购物车
        List<OrderItem> ls =(List<OrderItem>)session.getAttribute("mycart");
        //遍历目前的购物车集合
        for (OrderItem oi : ls) {
            //找到对应的订单项
            if(oi.getGoods().getGid()==Integer.parseInt(gid)) {
                //将其从集合中移除
                ls.remove(oi);
                break;
            }
        }

        //跳转到购物车界面绑值
        resp.sendRedirect("cart.jsp?index=5");

        

3.9.2 实现修改

//给文本框添加失焦事件  同时取id为当前商品的gid  确保唯一且方便取值

<input id="${oi.goods.gid}  οnblur="mys('${oi.goods.gid}') value="${oi.oiprice}"/> 

 //即要拿id 就直接把id设置成gid
function myf(gid,type) {
//拿文本框的数量
var num=$("#"+gid).val();
 //跳转到servlet
location.href="updateCart.do?gid="+gid+"&num="+num;

        //先拿订单项集合
        List<OrderItem> ls =(List<OrderItem>)session.getAttribute("mycart");
        //遍历目前的购物车集合
        for (OrderItem oi : ls) {
            //找到对应的订单项
            if(oi.getGoods().getGid()==Integer.parseInt(gid)) {
                //修改数量
                oi.setOinum(Integer.parseInt(num));
               //重新结束小计

                oi.calc();
                break;
            }
        }
        
        //跳转到购物车界面绑值
        //resp.sendRedirect("cart.jsp?index=5");

3.10 细节处理

3.10.1 已登录,但购物车为空时

 3.10.2 未登录,点击"我的购物车"【建议参考淘宝】

 <!-- 购物车未登录 -->
                    <c:if test="${empty user}">
                        <li class="nav-item ${param.index==5?'active':''}">
                                <a class="nav-link" href="login.jsp">我的购物车</a>
                            </li>

<!--购物车登录了  -->
                    <c:if test="${not empty user}">
                     <li class="nav-item ${param.index==5?'active':''}">
                         <a class="nav-link" href="cart.jsp?index=5">我的购物车</a>
                       </li>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python_hashlib解密

Python Hashlib 解密 在计算机编程中&#xff0c;哈希函数是一种将任意大小的数据映射为固定大小值的函数。哈希函数通常用于加密和数据完整性校验。哈希函数可由多种算法实现&#xff0c;其中包括Python hashlib模块。本文将介绍Python中的hashlib模块以及如何使用它来进行哈…

甘特图控件DHTMLX Gantt教程:dhtmlxGantt 与PHP: Laravel(下)

DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求&#xff0c;具备完善的甘特图图表库&#xff0c;功能强大&#xff0c;价格便宜&#xff0c;提供丰富而灵活的JavaScript API接口&#xff0c;与各种服务器端技术&am…

实在智能魅力抢眼!携超自动化解决方案和校企合作新范式点燃第七届世界智能大会

为深入实施创新驱动发展战略&#xff0c;推动智能科技赋能经济社会发展&#xff0c;促进校企双方交换需求清单&#xff0c;全方位搭建校企握手通道&#xff0c;5月18日&#xff0c;由国家发展和改革委员会、科学技术部、国家广播电视总局、中国科学院等联合主办的第七届世界智能…

通过九点选择CRM系统

众所周知&#xff0c;CRM系统对于企业的发展至关重要。它可以帮助企业增强市场竞争力&#xff0c;拓展新的市场机会&#xff0c;提升品牌形象和口碑&#xff0c;提高客户满意度和忠诚度&#xff0c;实现业绩的大幅增长。那么选型时&#xff0c;CRM系统哪家好&#xff1f;看准这…

企业如何利用方舟低代码平台快速构建营销系统?

前言 国家在十四五规划中明确将“加快发展现代产业体系、推动经济体系优化”作为数字化转型的重要指导方针 &#xff0c;数字化转型已经成为企业的主要工作&#xff0c;在传统的方式下先采购产品后进行定制改造的模式已经很难适应快速多变的市场&#xff0c;为了应对市场或自主…

广告商业该如何突破重围

广告商业也算是 我们日常生活中不可 缺少的商业渠道 但是广告商业太广了 很多小伙伴是无从下手的 今天智龙就简单的和你们 分享一下广告商业的 一些心得。 首先从用户类型开始入手 今天我们先讲网络用户群体 从图中可以看出 其实网络购物用户 群体是非常庞大的 意味着如果广告 …

chatgpt赋能Python-python_for_line

Python for Line: A Powerful Tool for Streamlining Your Business Communication In today’s fast-paced business world, effective communication is key to success. Whether you’re collaborating with colleagues, sharing information with clients, or dealing wit…

印刷八木天线的仿真与设计

前言 前篇介绍了俄罗斯的网红Wi-Fi天线&#xff0c;其可看作是八木天线。对于八木天线&#xff0c;相信很多业内朋友都不陌生&#xff0c;这类天线长成这个样子。本篇详细介绍八木天线的原理&#xff0c;并设计印刷八木天线。 ​图 1 八木天线 八木天线的工作原理 天线工作原…

「远程开发」VSCode使用SSH远程linux服务器 - 公网远程连接

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

【LeetCode: 面试题 17.24. 最大子矩阵 | 动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

多模态方法(更新中)

待coding&#xff1a; moco pcl 文章目录 Semantic Representation for Dialogue ModelingPCL: Peer-Contrastive Learning with Diverse Augmentations for Unsupervised Sentence Embeddings深度网络的公理归因 Axiomatic Attribution for Deep NetworksNLU模型的捷径学习行…

面试可以问面试官哪些问题?这些问题需要弄清楚

在参加面试过程中&#xff0c;面试官通常会给你提供询问的机会&#xff0c;让你了解公司、职位和工作环境。在这个过程中&#xff0c;你可以通过提问来更好地了解公司、职位和工作环境&#xff0c;也能够让面试官感受到你对公司的兴趣和热情。那么都有哪些问题我们是有必要进行…

阿里成立AIDC,用“增长”解题国际化

随着阿里巴巴集团2023财年年报的披露&#xff0c;AIDC也随即浮出了水面。 AIDC是阿里国际数字商业集团的英文简称&#xff0c;AIDC即Alibaba International Digital Commerce。阿里是在5月18日公布的截至2023年3月31日的2023财年Q4及全年财报&#xff0c;财报数据之外&#xff…

Windows 11部署WSL(Windows Subsystem for Linux——适用于Windows的Linux子系统)

文章目录 前言一、Windows 11部署WSL&#xff08;Windows Subsystem for Linux&#xff09;1.打开控制面板→程序→启动或关闭 Windows 功能2.勾选 “适用于 Linux 的 Windows 子系统” 和 “虚拟机平台”3.立即重新启动电脑4.按win键或者点击左下角的windows图标打开微软的应用…

Gitee+Jenkins+SonarQube代码上线的实战操作

代码上线-流程图 添加Nexus流程图 机器的环境 172.168.0.1 jenkins # 建议-机器环境&#xff1a;1C以上&#xff0c;2G以上&#xff0c;40G磁盘以上 172.168.0.2 SonarQube # 建议-机器环境&#xff1a;2C以上&#xff0c;4G以上&#xff0c;40G磁盘以上 172.…

面对数字化新技术的变革风口,企业应如何借由技术创新开拓新局,完成数字化转型和升级?

为使企业有效借力科技创新&#xff0c;实现数字化转型升级&#xff0c;企业可以采取以下几个关键步骤&#xff1a; 评估业务目标&#xff1a;首先明确企业的业务目标并确定技术创新可以帮助企业实现这些目标的领域。了解企业当前的挑战、竞争格局和客户需求&#xff0c;以确定数…

Unity:圆底烧瓶中液体液面升降变化的效果

一、效果展示 二、实现的原理 1、从image的filled模式说起 image的filled模式&#xff0c;适合用来做进度条&#xff1a; 2、能否为一个3D object实现一个image filled 的shader &#xff1f; Shader "Custom/FilledImageEffect" {Properties{_MainTex ("…

Qt编程基础 | 第三章-控件 | 3.1、组合框

一、组合框 1.1、定义 QComboBox提供了一种向用户呈现选项列表的方式&#xff0c;以占用最少的屏幕空间。 组合框是一个显示当前项目的选择小部件&#xff0c;可以弹出可选择项目的列表。 组合框可以是可编辑的&#xff0c;允许用户修改列表中的每个项目。 QComboBox 除了显示…

2023款ECMAScript

2023款ECMAScript 新的数组api findLast 反向迭代数组&#xff0c;并返回满足提供的测试函数的第一个元素的值, 如果没有找到返回undefined const isEven (number) > number % 2 0; const numbers [1, 2, 3, 4]; console.log(numbers.findLast(isEven)); // 4 findLastI…

华为战略方法论:BLM模型之市场洞察-五看工具篇(加餐)

欢迎大家继续来到华为战略方法论系列内容。 今天主要介绍一下市场洞察篇的延伸内容 —— 五看工具篇。 在BLM模型中&#xff0c;战略意图篇提到的愿景和目标能否实现&#xff0c;以及怎么实现呢&#xff1f; 要回答这个问题&#xff0c;你就需要从市场上去寻找依据。 企业需…