当前位置: 首页 > news >正文

实现SSM简易商城项目的购物车实现

实现SSM简易商城项目的购物车实现

在这篇博客中,我们将使用SSM框架来实现一个简易的购物车功能。我们将使用Spring框架来管理Bean,使用SpringMVC框架来处理HTTP请求,使用MyBatis框架来操作数据库。
实现SSM简易商城项目的购物车功能的思路如下:

  1. 创建数据库表:创建一个商品表和一个购物车表,商品表用于存储商品的信息,购物车表用于存储用户添加到购物车中的商品信息。

  2. 创建实体类:创建商品实体类和购物车实体类,用于映射数据库表的字段。

  3. 创建DAO接口和Mapper文件:创建商品DAO接口和购物车DAO接口,并创建对应的Mapper文件,用于定义数据库操作的方法。

  4. 创建Service接口和实现类:创建商品Service接口和购物车Service接口,并创建对应的实现类,用于处理业务逻辑。

  5. 创建Controller:创建商品Controller和购物车Controller,用于处理用户的请求和返回相应的视图。

  6. 创建JSP视图:创建商品查询页面和购物车页面的JSP视图,用于展示商品信息和购物车内容。

  7. 实现购物车功能:在购物车Controller中,实现添加商品到购物车和从购物车中移除商品的功能。通过购物车Service和购物车DAO,将商品信息存储到购物车表中,并从购物车表中获取购物车内容。

  8. 展示购物车内容:在购物车页面的JSP视图中,通过购物车Controller返回的购物车内容,展示购物车中的商品信息,并提供移除商品的功能。

以上是实现SSM简易商城项目的购物车功能的基本思路。根据这个思路,您可以逐步实现和扩展购物车功能,以满足项目需求。

步骤一:创建数据库表

首先,我们需要创建一个名为product的数据库表,用于存储商品的信息。表结构如下:

CREATE TABLE product (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,price DOUBLE NOT NULL,stock INT NOT NULL,category VARCHAR(100) NOT NULL
);

步骤二:创建实体类

src/main/java目录下创建一个名为com.example.entity的包,并在该包下创建一个名为Product.java的文件,作为商品实体类。代码如下:

package com.example.entity;public class Product {private int id;private String name;private double price;private int stock;private String category;// 省略getter和setter方法
}

步骤三:创建Mapper接口

src/main/java目录下创建一个名为com.example.mapper的包,并在该包下创建一个名为ProductMapper.java的文件,作为商品Mapper接口。代码如下:

package com.example.mapper;import com.example.entity.Product;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface ProductMapper {List<Product> getProductsByCategory(@Param("category") String category);Product getProductById(@Param("id") int id);void updateProduct(Product product);
}

步骤四:创建Mapper映射文件

src/main/resources目录下创建一个名为mapper的文件夹,并在该文件夹下创建一个名为ProductMapper.xml的文件,作为商品Mapper映射文件。代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.ProductMapper"><select id="getProductsByCategory" resultType="com.example.entity.Product">SELECT * FROM product WHERE category = #{category}</select><select id="getProductById" resultType="com.example.entity.Product">SELECT * FROM product WHERE id = #{id}</select><update id="updateProduct">UPDATE product SET stock = #{stock} WHERE id = #{id}</update>
</mapper>

步骤五:创建Controller类

src/main/java目录下创建一个名为com.example.controller的包,并在该包下创建一个名为ProductController.java的文件,作为商品Controller类。代码如下:

package com.example.controller;import com.example.entity.Product;
import com.example.mapper.ProductMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;@Controller
public class ProductController {@Autowiredprivate ProductMapper productMapper;@GetMapping("/products")public String getProductsByCategory(@RequestParam("category") String category, Model model) {List<Product> products = productMapper.getProductsByCategory(category);model.addAttribute("products", products);return "products";}@GetMapping("/add-to-cart")public String addToCart(@RequestParam("productId") int productId, HttpServletRequest request) {Product product = productMapper.getProductById(productId);if (product != null) {List<Product> cart = (List<Product>) request.getSession().getAttribute("cart");if (cart == null) {cart = new ArrayList<>();request.getSession().setAttribute("cart", cart);}cart.add(product);// 更新商品库存product.setStock(product.getStock() - 1);productMapper.updateProduct(product);}return "redirect:/products?category=" + product.getCategory();}@GetMapping("/cart")public String viewCart(HttpServletRequest request, Model model) {List<Product> cart = (List<Product>) request.getSession().getAttribute("cart");model.addAttribute("cart", cart);return "cart";}@GetMapping("/remove-from-cart")public String removeFromCart(@RequestParam("productId") int productId, HttpServletRequest request) {List<Product> cart = (List<Product>) request.getSession().getAttribute("cart");if (cart != null) {Product productToRemove = null;for (Product product : cart) {if (product.getId() == productId) {productToRemove = product;break;}}if (productToRemove != null) {cart.remove(productToRemove);// 更新商品库存Product product = productMapper.getProductById(productId);product.setStock(product.getStock() + 1);productMapper.updateProduct(product);}}return "redirect:/cart";}
}

步骤六:创建JSP视图

src/main/webapp/WEB-INF目录下创建一个名为views的文件夹,并在该文件夹下创建一个名为products.jsp的文件,作为商品列表的JSP视图。代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>商品列表</title>
</head>
<body><h1>商品列表</h1><table><tr><th>ID</th><th>名称</th><th>价格</th><th>库存</th><th>分类</th><th>操作</th></tr><c:forEach items="${products}" var="product"><tr><td>${product.id}</td><td>${product.name}</td><td>${product.price}</td><td>${product.stock}</td><td>${product.category}</td><td><a href="/add-to-cart?productId=${product.id}">加入购物车</a></td></tr></c:forEach></table>
</body>
</html>

src/main/webapp/WEB-INF/views目录下创建一个名为cart.jsp的文件,作为购物车的JSP视图。代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>购物车</title>
</head>
<body><h1>购物车</h1><table><tr><th>ID</th><th>名称</th><th>价格</th><th>操作</th></tr><c:forEach items="${cart}" var="product"><tr><td>${product.id}</td><td>${product.name}</td><td>${product.price}</td><td><a href="/remove-from-cart?productId=${product.id}">移出购物车</a></td></tr></c:forEach></table>
</body>
</html>

步骤七:运行项目

现在,我们可以启动项目并访问商品查询页面了。在浏览器中输入http://localhost:8080/products?category=电子产品,即可获取并展示符合条件的商品信息。点击"加入购物车"按钮,商品将被添加到购物车中。在购物车页面http://localhost:8080/cart,您可以查看购物车中的商品,并可以点击"移出购物车"按钮将商品从购物车中移除。

相关文章:

实现SSM简易商城项目的购物车实现

实现SSM简易商城项目的购物车实现 在这篇博客中&#xff0c;我们将使用SSM框架来实现一个简易的购物车功能。我们将使用Spring框架来管理Bean&#xff0c;使用SpringMVC框架来处理HTTP请求&#xff0c;使用MyBatis框架来操作数据库。 实现SSM简易商城项目的购物车功能的思路如…...

【学习FreeRTOS】第17章——FreeRTOS任务通知

1.任务通知的简介 任务通知&#xff1a;用来通知任务的&#xff0c;任务控制块中的结构体成员变量 ulNotifiedValue就是这个通知值。 使用队列、信号量、事件标志组时都需另外创建一个结构体&#xff0c;通过中间的结构体进行间接通信&#xff01; 使用任务通知时&#xff0c…...

GO-vscode远程开发和调试

本文内容主要包括&#xff1a; 概述&#xff1a; 主要就是把代码放到服务器上然后远程去开发和调试 工具&#xff1a; vscode 远程端&#xff1a; linux 一.安装远程插件 vscode安装Remote - SSH&#xff0c;Remote Explorer&#xff0c;Remote Development&#xff0c…...

【笔记】判断两个Double类型的值是否相同

在Java中&#xff0c;将两个double值转换为String类型&#xff0c;然后使用equals方法进行比较是一个常见的做法&#xff0c;但是这种方法并不是完全可靠&#xff0c;特别是在涉及浮点数的精度时仍然可能会遇到问题。 浮点数在内部以二进制表示&#xff0c;有时会存在舍入误差…...

Linux —— nfs文件系统

简介 NFS 是Network File System的缩写&#xff0c;即网络文件系统。一种使用于分散式文件系统的协定&#xff0c;由Sun公司开发&#xff0c;于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据&#xff0c;让应用程序在客户端通过网络访问位…...

数据降维 | MATLAB实现T-SNE降维特征可视化

数据降维 | MATLAB实现T-SNE降维特征可视化 目录 数据降维 | MATLAB实现T-SNE降维特征可视化降维效果基本描述程序设计参考资料 降维效果 基本描述 T-SNE降维特征可视化&#xff0c;MATLAB程序。 T-分布随机邻域嵌入&#xff0c;主要用途是对高维数据进行降维并进行可视化&…...

蓝桥杯上岸每日N题 (交换瓶子)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 题目描述 有 N 个瓶子&#xff0c;编号 1∼N&#xff0c;放在架子上。 比如有 5 个瓶子&#xff1a; 2 1 3 5 4 要求每次拿起 2 个瓶子&#xff0c;交换它们的位置。 …...

GMS基本模块TIN、Solids、Modflow2000/2005、MT3DMS、MODPATH。及其在地下水流动、溶质运移、粒子追踪方面的应用

解决地下水数值模拟技术实施过程中遇到的困难&#xff0c;从而提出切实可行的环境保护措施&#xff0c;达到有效保护环境、防治地下水污染&#xff0c;推动经济社会可持续发展的目的。 &#xff08;1&#xff09;水文地质学&#xff0c;地下水数值模拟基础理论&#xff1b;&am…...

MySQL数据库中间件Mycat介绍及下载安装(教程)

一&#xff0c;介绍 MyCat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用MySQL一样来使用MyCat&#xff0c;对于开发人员来说根本感觉不到MyCat的存在。 开发人员只需要连接MyCat即可&#xff0c;而具体底层用到几台数据库&#xff0c;每一台数据库服务器…...

【VMware】CentOS 设置静态IP(Windows 宿主机)

文章目录 1. 更改网络适配器设置2. 配置虚拟网络编辑器3. 修改 CentOS 网络配置文件4. ping 测试结果 宿主机&#xff1a;Win11 22H2 虚拟机&#xff1a;CentOS-Stream-9-20230612.0 (Minimal) 1. 更改网络适配器设置 Win R&#xff1a;control 打开控制面板 依次点击&#x…...

机器学习十大算法之七——随机森林

0 引言 集成学习&#xff08;ensemble learning&#xff09;是时下非常流行的机器学习算法&#xff0c;它本身不是一个单独的机器学习算法&#xff0c;而是通过在数据上构建多个横型&#xff0c;集成所有模型的建模结果&#xff0c;基本上所有的机器学习领域都可以看到集成学习…...

spring boot 3使用 elasticsearch 提供搜索建议

业务场景 用户输入内容&#xff0c;快速返回建议&#xff0c;示例效果如下 技术选型 spring boot 3elasticsearch server 7.17.4spring data elasticsearch 5.0.1elasticsearch-java-api 8.5.3 pom.xml <dependency><groupId>org.springframework.boot</gr…...

住宅IP:解锁更快速、稳定的互联网,你准备好了吗?

随着互联网的广泛普及&#xff0c;我们对网络的需求也越来越高。无论是工作、学习还是娱乐&#xff0c;我们都希望能够享受到更快速、稳定的互联网连接。而在实现这一目标的过程中&#xff0c;住宅IP正逐渐崭露头角&#xff0c;成为了一种备受关注的解决方案。那么&#xff0c;…...

支持dolby vision的盒子接支持dolby vision的电视,在adaptive hdr时,播放非dv的hdr视频,输出sdr

支持dolby vision的盒子接支持dolby vision的电视&#xff0c;setting选择adaptive hdr&#xff0c;按照这个配置在播放非dv的hdr视频时&#xff0c;会输出sdr。 看起来是很不合理的&#xff0c;高级的产品播放高级的片源&#xff0c;却输出低级的画质。 想要搞清楚这个问题&am…...

使用ffmpeg将WebM文件转换为MP4文件的简单应用程序

tiktok网上下载的short视频是webm格式的&#xff0c;有些程序无法处理该程序&#xff0c;比如roop程序&#xff0c;本文介绍了如何使用wxPython库创建一个简单的GUI应用程序&#xff0c;用于将WebM文件转换为MP4文件。这个应用程序使用Python编写&#xff0c;通过调用FFmpeg命令…...

Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

Prompt任务&#xff08;Prompt Tasks&#xff09; 通过设计提示&#xff08;prompt&#xff09;模板&#xff0c;实现使用更少量的数据在预训练模型&#xff08;Pretrained Model&#xff09;上得到更好的效果&#xff0c;多用于&#xff1a;Few-Shot&#xff0c;Zero-Shot 等…...

玩转Mysql系列 - 第6篇:select查询基础篇

这是Mysql系列第6篇。 环境&#xff1a;mysql5.7.25&#xff0c;cmd命令中进行演示。 DQL(Data QueryLanguage)&#xff1a;数据查询语言&#xff0c;通俗点讲就是从数据库获取数据的&#xff0c;按照DQL的语法给数据库发送一条指令&#xff0c;数据库将按需求返回数据。 DQ…...

【SpringCloud技术专题】「Gateway网关系列」(1)微服务网关服务的Gateway组件的原理介绍分析

为什么要有服务网关? 我们都知道在微服务架构中&#xff0c;系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;难道要一个个的去调用吗&#xff1f;很显然这是不太实际的&#xff0c;我们需要有一个统一的接口与这些微服务打交道&#xf…...

【面试刷题】————STL中的vector是如何实现的?

STL&#xff08;Standard Template Library&#xff09;是C标准库中的一部分&#xff0c;它提供了许多常用的数据结构和算法&#xff0c;其中包括了动态数组 vector。 vector std::vector 是一个动态数组&#xff0c;它能够自动调整自己的大小&#xff0c;以适应存储元素的需…...

使用钉钉的扫码会出现多个回调(DTFrameLogin)

官方&#xff1a;地址 标题 出现的问题解决后效果正常使用(按照官网的流程进行使用)自己的理解(路人可忽略该内容&#xff01;) 出现的问题 1692861955468 解决后效果 1692861665687 正常使用(按照官网的流程进行使用) fn.js 该文件就是钉钉官网的js文件&#xff0c;我下载到了…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?

系列回顾&#xff1a; 在上一篇《React核心概念&#xff1a;State是什么&#xff1f;》中&#xff0c;我们学习了如何使用useState让一个组件拥有自己的内部数据&#xff08;State&#xff09;&#xff0c;并通过一个计数器案例&#xff0c;实现了组件的自我更新。这很棒&#…...