
1. 先搞清楚这个“花店销售系统”到底要做什么如果你正在找计算机专业的毕业设计题目或者想找一个完整的 Java Web 项目来练手这个基于 SSM 框架的花店销售系统是个不错的选择。它不是一个空泛的概念而是一个能让你把 Java、数据库、Web 开发串起来的实战项目。最核心的价值在于它能帮你完整地走一遍从需求分析、数据库设计、后端开发到前端展示的全流程而不是只写几个零散的接口。很多人拿到“管理系统”这类题目容易陷入两个误区要么一上来就想着把所有功能都做全结果卡在某个复杂模块上要么只关注代码能不能跑通忽略了业务逻辑的完整性和数据的一致性。这个花店销售系统重点在于“销售”二字这意味着你的核心工作流必须围绕“商品展示 - 用户下单 - 订单处理 - 库存更新”这条主线来设计。系统能稳定跑起来、数据流能闭环比你堆砌一堆用不上的“高级”功能要重要得多。基于 SSM (Spring Spring MVC MyBatis) 技术栈意味着你需要处理 MVC 分层、依赖注入、事务管理、数据库映射这些企业级开发中的常见问题。通过这个项目你能真切地体会到如何用 Spring 来管理 Bean用 MyBatis 来简化数据库操作以及如何让前端页面和后端 Controller 进行数据交互。这比单纯看教程要深刻得多。2. 环境准备别在第一步就卡住在动手写代码之前先把环境搭稳。很多同学的项目跑不起来问题往往出在环境配置上而不是代码逻辑。你需要一个能协同工作的“全家桶”。2.1 基础软件清单你需要准备以下软件并确保版本兼容。我建议使用相对稳定、资料较多的版本避免追求最新版带来的未知问题。JDK: Java 开发工具包。推荐 JDK 8 或 JDK 11这是目前企业应用最主流的版本兼容性最好。安装后务必配置好JAVA_HOME和PATH环境变量。IDE (集成开发环境): IntelliJ IDEA (社区版或旗舰版) 或 Eclipse。IDEA 对 Spring 和 Maven 的支持更友好能帮你省不少事。Maven: 项目构建和依赖管理工具。你的项目依赖如 Spring、MyBatis 的 jar 包都会通过 Maven 从中央仓库自动下载。MySQL: 数据库。版本 5.7 或 8.0 均可。安装时记住你设置的 root 用户密码。Tomcat: Servlet 容器用于运行你的 Web 应用。版本 8.5 或 9.x。注意安装完每个软件最好都在命令行测试一下是否能正确识别如java -version,mvn -v,mysql --version。环境变量配置错误是新手最常见的“拦路虎”。2.2 创建项目与依赖配置现在主流的方式是使用 Spring Boot 来简化 SSM 的配置但对于毕业设计从传统的 SSM 项目开始更能理解底层原理。你可以用 Maven 的webapp原型来创建项目。在 IDEA 中新建一个 Maven 项目选择maven-archetype-webapp原型。项目创建好后打开pom.xml文件这是依赖管理的核心。你需要添加以下核心依赖!-- Spring 核心容器、上下文、AOP等 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.3.23/version /dependency !-- Spring MVC -- dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.3.23/version /dependency !-- Spring JDBC 用于事务管理 -- dependency groupIdorg.springframework/groupId artifactIdspring-jdbc/artifactId version5.3.23/version /dependency !-- MyBatis 核心 -- dependency artifactIdmybatis/artifactId version3.5.11/version /dependency !-- MyBatis 与 Spring 整合包 -- dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.1.1/version /dependency !-- MySQL 驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency !-- 数据源这里用阿里的 Druid功能强大且监控方便 -- dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.15/version /dependency !-- JSTL 标签库用于 JSP 页面 -- dependency groupIdjavax.servlet/groupId artifactIdjstl/artifactId version1.2/version /dependency !-- Servlet API -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency写完pom.xml后IDEA 通常会提示你导入更改Enable Auto-Import同意即可。Maven 会自动下载这些依赖包到本地仓库。如果下载慢或失败可以考虑配置国内镜像源。3. 数据库设计先画图再建表数据库是系统的基石设计得好后面编码就顺设计得乱改起来会非常痛苦。不要一上来就写CREATE TABLE先用工具如 Navicat、MySQL Workbench 甚至 Excel把表结构和关系理清楚。3.1 核心表分析对于一个销售系统以下几张表是必不可少的用户表 (user): 存储管理员和普通客户信息。字段用户ID、用户名、密码加密存储、手机号、地址、角色如 admin, customer、注册时间。商品表 (flower): 存储鲜花商品信息。字段商品ID、商品名称、分类、价格、库存数量、图片路径、商品描述、上架状态。订单表 (order): 注意order是 MySQL 关键字最好用orders或order_info。字段订单ID、订单号唯一、用户ID、总金额、收货地址、订单状态如待付款、待发货、已发货、已完成、创建时间、支付时间。订单详情表 (order_item): 这是关键。一个订单可能包含多种商品需要拆出来。它连接了订单和商品。字段详情ID、订单ID、商品ID、购买数量、商品单价下单时快照避免商品后续调价影响历史订单。表之间的关系是用户 1:N 订单订单 1:N 订单详情订单详情 N:1 商品。这就是典型的一对多、多对一关系。3.2 建表 SQL 示例理清关系后编写建表语句。务必注意字符集推荐utf8mb4和存储引擎InnoDB。-- 创建数据库 CREATE DATABASE IF NOT EXISTS flower_shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE flower_shop; -- 用户表 CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名, password VARCHAR(255) NOT NULL COMMENT 密码加密后, phone VARCHAR(20) COMMENT 手机号, address VARCHAR(255) COMMENT 地址, role VARCHAR(20) DEFAULT customer COMMENT 角色admin/customer, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表; -- 商品表 CREATE TABLE flower ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL COMMENT 商品名称, category VARCHAR(50) COMMENT 分类如玫瑰、百合, price DECIMAL(10, 2) NOT NULL COMMENT 单价, stock INT NOT NULL DEFAULT 0 COMMENT 库存, image_url VARCHAR(500) COMMENT 图片地址, description TEXT COMMENT 商品描述, status TINYINT DEFAULT 1 COMMENT 状态1-上架0-下架 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT商品表; -- 订单表避免使用关键字order CREATE TABLE order_info ( id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(64) NOT NULL UNIQUE COMMENT 订单号可用UUID生成, user_id INT NOT NULL COMMENT 用户ID, total_amount DECIMAL(10, 2) NOT NULL COMMENT 订单总金额, address VARCHAR(255) NOT NULL COMMENT 收货地址, status VARCHAR(20) DEFAULT pending_payment COMMENT 订单状态, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, pay_time DATETIME COMMENT 支付时间, FOREIGN KEY (user_id) REFERENCES user(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单表; -- 订单详情表 CREATE TABLE order_item ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL COMMENT 订单ID, flower_id INT NOT NULL COMMENT 商品ID, quantity INT NOT NULL COMMENT 购买数量, price DECIMAL(10, 2) NOT NULL COMMENT 下单时商品单价, FOREIGN KEY (order_id) REFERENCES order_info(id), FOREIGN KEY (flower_id) REFERENCES flower(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单详情表;执行这些 SQL 语句前先在 MySQL 客户端里连上你的数据库。建完表后手动插入几条测试数据特别是用户和商品数据方便后续调试。4. 搭建 SSM 框架配置文件是灵魂SSM 整合的关键在于配置文件。它们定义了 Bean 如何创建、请求如何分发、SQL 如何映射。很多同学在这里被一堆 XML 文件搞晕其实每个文件都有明确职责。4.1 配置 Web.xml这是 Web 应用的入口配置 Spring 监听器和前端控制器。?xml version1.0 encodingUTF-8? web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd version4.0 !-- 1. 配置 Spring 的监听器用于加载 applicationContext.xml -- context-param param-namecontextConfigLocation/param-name param-valueclasspath:applicationContext.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener !-- 2. 配置 Spring MVC 的前端控制器 DispatcherServlet -- servlet servlet-namedispatcherServlet/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-mvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namedispatcherServlet/servlet-name url-pattern//url-pattern /servlet-mapping !-- 3. 配置字符编码过滤器解决中文乱码 -- filter filter-namecharacterEncodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-namecharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping /web-app4.2 配置 Spring 核心 (applicationContext.xml)这个文件负责管理 Service、DAOMapper、数据源、事务等“后端”Bean。?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:txhttp://www.springframework.org/schema/tx xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd !-- 1. 开启注解扫描扫描Service、DAO等组件 -- context:component-scan base-packagecom.flowershop !-- 排除Controller由Spring MVC管理 -- context:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller/ /context:component-scan !-- 2. 引入数据库连接属性文件 -- context:property-placeholder locationclasspath:jdbc.properties/ !-- 3. 配置数据源 (Druid) -- bean iddataSource classcom.alibaba.druid.pool.DruidDataSource init-methodinit destroy-methodclose property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ property namedriverClassName value${jdbc.driver}/ !-- 连接池配置 -- property nameinitialSize value5/ property nameminIdle value5/ property namemaxActive value20/ /bean !-- 4. 配置 SqlSessionFactory整合 MyBatis -- bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ !-- 指定 MyBatis 全局配置文件 -- property nameconfigLocation valueclasspath:mybatis-config.xml/ !-- 指定 Mapper XML 文件位置 -- property namemapperLocations valueclasspath:mapper/*.xml/ /bean !-- 5. 配置 Mapper 接口扫描这样就不用为每个接口写实现类了 -- bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.flowershop.dao/ property namesqlSessionFactoryBeanName valuesqlSessionFactory/ /bean !-- 6. 配置事务管理器 -- bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean !-- 开启注解驱动的事务管理 -- tx:annotation-driven transaction-managertransactionManager/ /beans对应的jdbc.properties文件jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/flower_shop?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse jdbc.usernameroot jdbc.passwordyour_password_here4.3 配置 Spring MVC (spring-mvc.xml)这个文件负责管理 Controller、视图解析、静态资源等“前端”相关配置。?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beans xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:contexthttp://www.springframework.org/schema/context xmlns:mvchttp://www.springframework.org/schema/mvc xsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd !-- 1. 扫描Controller -- context:component-scan base-packagecom.flowershop.controller use-default-filtersfalse context:include-filter typeannotation expressionorg.springframework.stereotype.Controller/ /context:component-scan !-- 2. 开启MVC注解驱动支持Controller, RequestMapping等 -- mvc:annotation-driven/ !-- 3. 静态资源处理如图片、CSS、JS不经过DispatcherServlet -- mvc:default-servlet-handler/ !-- 4. 配置视图解析器将逻辑视图名解析为JSP物理路径 -- bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/views// property namesuffix value.jsp/ /bean !-- 5. 文件上传解析器 (如果需要上传商品图片) -- bean idmultipartResolver classorg.springframework.web.multipart.commons.CommonsMultipartResolver property namemaxUploadSize value10485760/ !-- 10MB -- property namedefaultEncoding valueUTF-8/ /bean /beans4.4 配置 MyBatis (mybatis-config.xml)这个文件配置 MyBatis 的全局行为比如开启驼峰命名映射这样数据库字段user_name就能自动映射到 Java 属性userName。?xml version1.0 encodingUTF-8 ? !DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd configuration settings !-- 开启驼峰命名自动映射 -- setting namemapUnderscoreToCamelCase valuetrue/ !-- 打印SQL语句到控制台调试用 -- setting namelogImpl valueSTDOUT_LOGGING/ /settings !-- 可以在这里配置类型别名简化Mapper XML中的类型书写 -- typeAliases package namecom.flowershop.entity/ /typeAliases /configuration把这些配置文件放在src/main/resources目录下并确保路径正确。配置完成后项目的骨架就搭好了。此时启动 Tomcat 部署项目如果控制台没有报错并且能访问到 Tomcat 的默认首页说明环境基本没问题。5. 核心功能开发从实体类到页面框架搭好就可以开始写业务代码了。遵循 MVC 模式从底层往上层写Entity - DAO(Mapper) - Service - Controller - JSP。5.1 创建实体类 (Entity)实体类对应数据库表使用简单的 Java Bean 即可。以Flower为例package com.flowershop.entity; import java.math.BigDecimal; public class Flower { private Integer id; private String name; private String category; private BigDecimal price; // 使用BigDecimal处理金额避免精度丢失 private Integer stock; private String imageUrl; private String description; private Integer status; // 1上架0下架 // 省略 getter 和 setter 方法可以使用Lombok注解简化但需配置好插件 }注意如果使用 Lombok 注解如Data自动生成 getter/setter务必确保你的 IDE 安装了 Lombok 插件并且在pom.xml中添加了 Lombok 依赖否则编译可能报错 “you aren‘t using a compiler supported by lombok”。5.2 编写数据访问层 (DAO/Mapper)先定义接口再写 XML 映射文件。这是 MyBatis 的核心。FlowerMapper.java:package com.flowershop.dao; import com.flowershop.entity.Flower; import org.apache.ibatis.annotations.Param; import java.util.List; public interface FlowerMapper { // 增删改查方法 int insert(Flower flower); int deleteById(Integer id); int update(Flower flower); Flower selectById(Integer id); // 查询所有上架商品 ListFlower selectAllOnShelf(); // 分页查询结合PageHelper插件更简单 ListFlower selectByPage(Param(offset) Integer offset, Param(limit) Integer limit); // 更新库存销售或入库时用 int updateStock(Param(id) Integer id, Param(quantity) Integer quantity); }FlowerMapper.xml (放在resources/mapper/目录下):?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.flowershop.dao.FlowerMapper resultMap idBaseResultMap typeFlower id columnid propertyid/ result columnname propertyname/ result columncategory propertycategory/ result columnprice propertyprice/ result columnstock propertystock/ result columnimage_url propertyimageUrl/ result columndescription propertydescription/ result columnstatus propertystatus/ /resultMap sql idBase_Column_List id, name, category, price, stock, image_url, description, status /sql insert idinsert parameterTypeFlower useGeneratedKeystrue keyPropertyid INSERT INTO flower (name, category, price, stock, image_url, description, status) VALUES (#{name}, #{category}, #{price}, #{stock}, #{imageUrl}, #{description}, #{status}) /insert select idselectAllOnShelf resultMapBaseResultMap SELECT include refidBase_Column_List/ FROM flower WHERE status 1 ORDER BY id DESC /select update idupdateStock UPDATE flower SET stock stock #{quantity} WHERE id #{id} /update !-- 其他SQL语句 -- /mapper5.3 编写业务逻辑层 (Service)Service 层调用 DAO并处理业务逻辑比如下单时要同时更新订单表和库存。FlowerService.java (接口):package com.flowershop.service; import com.flowershop.entity.Flower; import java.util.List; public interface FlowerService { ListFlower getAllFlowers(); Flower getFlowerById(Integer id); boolean addFlower(Flower flower); boolean updateFlower(Flower flower); boolean deleteFlower(Integer id); // 核心业务购买商品涉及库存检查、订单创建、库存扣减需要事务 boolean purchaseFlower(Integer flowerId, Integer quantity, Integer userId); }FlowerServiceImpl.java (实现类):package com.flowershop.service.impl; import com.flowershop.dao.FlowerMapper; import com.flowershop.dao.OrderMapper; import com.flowershop.entity.Flower; import com.flowershop.entity.OrderInfo; import com.flowershop.entity.OrderItem; import com.flowershop.service.FlowerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.UUID; Service // Spring 扫描并创建Bean public class FlowerServiceImpl implements FlowerService { Autowired private FlowerMapper flowerMapper; Autowired private OrderMapper orderMapper; Override public ListFlower getAllFlowers() { return flowerMapper.selectAllOnShelf(); } Override Transactional // 声明式事务管理保证以下操作要么全成功要么全失败 public boolean purchaseFlower(Integer flowerId, Integer quantity, Integer userId) { // 1. 检查库存 Flower flower flowerMapper.selectById(flowerId); if (flower null || flower.getStock() quantity) { return false; // 商品不存在或库存不足 } // 2. 扣减库存乐观锁防止超卖 int rows flowerMapper.updateStock(flowerId, -quantity); if (rows 0) { throw new RuntimeException(库存扣减失败可能已被其他用户购买); } // 3. 创建订单 OrderInfo order new OrderInfo(); order.setOrderNo(UUID.randomUUID().toString().replace(-, )); order.setUserId(userId); order.setTotalAmount(flower.getPrice().multiply(new BigDecimal(quantity))); order.setAddress(用户默认地址); // 实际应从用户信息获取 order.setStatus(pending_payment); order.setCreateTime(new Date()); orderMapper.insertOrder(order); // 获取自增ID // 4. 创建订单详情 OrderItem item new OrderItem(); item.setOrderId(order.getId()); item.setFlowerId(flowerId); item.setQuantity(quantity); item.setPrice(flower.getPrice()); orderMapper.insertOrderItem(item); return true; } // 其他方法实现... }5.4 编写控制层 (Controller)Controller 接收前端请求调用 Service并返回视图或数据。FlowerController.java:package com.flowershop.controller; import com.flowershop.entity.Flower; import com.flowershop.service.FlowerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; import java.util.List; Controller RequestMapping(/flower) public class FlowerController { Autowired private FlowerService flowerService; // 跳转到商品列表页 GetMapping(/list) public String listFlowers(Model model) { ListFlower flowerList flowerService.getAllFlowers(); model.addAttribute(flowerList, flowerList); return flower/list; // 对应 /WEB-INF/views/flower/list.jsp } // 处理购买请求 PostMapping(/buy) ResponseBody // 返回JSON数据给前端如使用Ajax public String buyFlower(RequestParam Integer flowerId, RequestParam Integer quantity, RequestParam Integer userId) { try { boolean success flowerService.purchaseFlower(flowerId, quantity, userId); if (success) { return {\code\: 200, \msg\: \购买成功\}; } else { return {\code\: 500, \msg\: \库存不足或商品不存在\}; } } catch (Exception e) { e.printStackTrace(); return {\code\: 500, \msg\: \系统错误\}; } } // 跳转到商品详情页 GetMapping(/detail/{id}) public String detail(PathVariable Integer id, Model model) { Flower flower flowerService.getFlowerById(id); model.addAttribute(flower, flower); return flower/detail; } }5.5 编写前端页面 (JSP)在/WEB-INF/views/flower/目录下创建list.jsp。这里展示一个简单的列表页。% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % html head title鲜花列表/title /head body h2鲜花商城/h2 table border1 tr th图片/th th名称/th th分类/th th价格/th th库存/th th操作/th /tr c:forEach items${flowerList} varflower tr tdimg src${flower.imageUrl} width100/td td${flower.name}/td td${flower.category}/td td${flower.price}/td td${flower.stock}/td td a href/flower/detail/${flower.id}查看详情/a button onclickbuy(${flower.id}, 1, ${sessionScope.user.id})购买/button /td /tr /c:forEach /table script function buy(flowerId, quantity, userId) { fetch(/flower/buy, { method: POST, headers: {Content-Type: application/x-www-form-urlencoded}, body: flowerId${flowerId}quantity${quantity}userId${userId} }) .then(response response.json()) .then(data { alert(data.msg); if(data.code 200) { location.reload(); // 购买成功刷新页面 } }); } /script /body /html6. 功能扩展与优化让项目更完整完成核心购买流程后一个完整的毕业设计还需要其他模块来支撑。6.1 用户登录与会话管理实现创建UserController和UserService实现登录验证。登录成功后将用户对象存入HttpSession。拦截器编写一个登录拦截器对需要登录的页面如购物车、订单页进行校验。在spring-mvc.xml中配置拦截器。密码安全存储密码时务必使用BCryptPasswordEncoder等工具进行加密切勿明文存储。6.2 购物车功能设计购物车数据可以存储在Session中适合未登录用户也可以存入数据库关联用户ID实现持久化。实现创建CartItem实体包含商品ID、数量。提供添加、删除、修改数量、清空、计算总价等方法。6.3 订单管理后台管理为管理员提供订单列表页面支持按状态筛选、查看详情、发货等操作。用户中心为用户提供“我的订单”页面展示历史订单支持取消待付款、确认收货等操作。分页订单列表数据量大必须实现分页。可以使用 MyBatis 分页插件 PageHelper非常方便。6.4 后台管理系统模块商品管理增删改查、上下架、用户管理、订单管理、数据统计如销量排行榜。技术可以使用 AdminLTE、Layui 等开源后台模板快速搭建界面。权限控制简单的可以通过SessionAttributes和拦截器判断用户角色是否为admin。6.5 图片上传与展示上传使用 Spring MVC 的CommonsMultipartResolver处理文件上传。将文件保存到服务器特定目录如/upload并将相对路径存入数据库。展示配置 Tomcat 的虚拟路径或将上传目录映射为静态资源以便通过 URL 访问图片。7. 部署、测试与常见问题排查7.1 项目部署到 Tomcat在 IDEA 中点击Add Configuration添加一个Tomcat Server - Local。在Deployment标签页添加你的项目为Artifact。启动 Tomcat。访问http://localhost:8080/你的项目名/flower/list测试。7.2 常见问题与排查顺序404 错误页面找不到检查 URL 是否写错特别是项目上下文路径Context Path。检查web.xml中DispatcherServlet的url-pattern是否为/。检查spring-mvc.xml中视图解析器的prefix和suffix配置以及 JSP 文件是否在正确路径。500 错误服务器内部错误看控制台日志这是最重要的。错误信息会明确告诉你哪里出问题。空指针异常 (NullPointerException)最常见。检查Autowired注入的 Bean 是否成功Service 或 Mapper 是否为 null。SQL 异常检查 SQL 语句语法特别是 MyBatis Mapper XML 中的参数#{}是否与接口方法参数名对应。检查数据库连接配置jdbc.properties。中文乱码确保数据库、表、字段的字符集为utf8mb4。确保jdbc.url中有characterEncodingutf8。确保 JSP 页面开头有% page pageEncoding“UTF-8”%。确保web.xml中配置了字符编码过滤器。事务不生效检查 Service 方法是否添加了Transactional注解。检查applicationContext.xml是否配置了tx:annotation-driven和transactionManager。确保异常被抛出默认只对RuntimeException回滚如果需要检查异常也回滚使用Transactional(rollbackFor Exception.class)。静态资源CSS/JS/图片无法加载检查spring-mvc.xml是否配置了mvc:default-servlet-handler/或mvc:resources mapping“/**” location“/” /。7.3 性能与优化建议加分项连接池监控Druid 提供了强大的监控功能可以查看 SQL 执行情况帮助发现慢查询。SQL 优化为经常查询的字段如status,category建立索引。避免SELECT *只查询需要的字段。缓存对于不常变的数据如商品分类可以考虑使用 Redis 或 Ehcache 进行缓存减轻数据库压力。前端优化图片懒加载、合并 CSS/JS 文件、使用 CDN 等。这个基于 SSM 的花店销售系统从零到上线跑通你会遇到几乎所有 Java Web 初级开发者会遇到的问题。把它做扎实不仅是为了毕业设计更是为你的第一份工作打下坚实的基础。真正的难点往往不是某个高深的技术点而是如何让所有这些组件Spring, MVC, MyBatis, MySQL, Tomcat, JSP协同工作并处理好业务数据的一致性。先从让一个最简单的“查看商品-加入购物车-下单”流程跑通开始再逐步添加其他功能这样每一步的进展和问题都更清晰可控。