
简介面向 Java 毕业设计与课程设计场景这份基于 SSM 和 JSP 的母婴用品网站项目覆盖前台展示与后台管理需求适合高校学生用于毕业设计、期末大作业或课程实训。项目具备完整的前后端交互流程浏览器端页面与服务器端业务逻辑分明开发环境使用 IDEA数据库采用 MySQL部署基于 Tomcat技术体系经典便于课堂讲授与后续扩展。资源包内涵盖项目源码、数据库脚本和软件工具代码注释较详细经过严格调试部署门槛低。整个压缩包共 1370 个文件以 JSP 页面、Java 类、SQL 脚本以及大量 CSS、JS、图片等前端素材为主大小仅 17.89MB结构清晰便于下载、检查与迁移。目前已有 53 人学习/下载对读者而言借助源码可以梳理 SSM 项目的分层方式、页面跳转关系与数据库操作思路同时可根据实际课题继续添加功能模块适合作为毕业设计或课程设计的基础框架。1. SSMJSP母婴网站这个Java毕设题值不值得做母婴用品网站放在Java毕业设计里确实是老面孔了——SSM框架做后端JSP做页面MySQL存数据。但这正是它最稳的地方框架老了意味着网上资料多、答辩老师熟悉、踩坑答案全你不会卡在某个冷门报错上三天出不来。压缩包里通常就是源码、数据库脚本和教程三件套目标很明确让一台普通笔记本能把项目跑起来截图、录视频、写论文、准备答辩一套流程走完。这篇文章是我按做这类毕设改稿的经验写的讲清楚它到底能干什么、怎么从零跑通、哪些地方最容易翻车适合正打算选这个题或者已经拿到压缩包但卡在部署阶段的同学看。2. 先拆项目SSMJSP母婴网站里到底有什么2.1 先立框架Spring管对象、SpringMVC管路由、MyBatis管SQLSSM里的三个S并不是平级关系。Spring是容器所有Service、Mapper、事务管理器这些对象都交给它创建和维护SpringMVC是表现层框架负责把浏览器发来的请求交给哪个Controller方法处理再把返回值渲染到哪个JSP页面MyBatis是持久层框架把Mapper接口的方法和XML里的SQL语句绑定起来替你把JDBC那一套重复代码收掉。刚接触的同学最容易把“SSM框架”理解成三个独立的东西各管各的实际上它们在一个项目里是这样分层的src/main/java ├── com.shop.controller # SpringMVC的Controller接收请求、返回视图 ├── com.shop.service # 业务逻辑接口 ├── com.shop.service.impl # 业务实现类加事务注解 ├── com.shop.dao # MyBatis的Mapper接口 ├── com.shop.entity # 实体类User、Product、Order等 └── com.shop.common # 工具类、常量我一般会提醒拿到项目的人先看这个骨架而不是急着点运行。因为你一旦知道哪个文件属于哪一层后面所有报错都能按层定位请求进不来找SpringMVC业务逻辑不对找ServiceSQL报错找Mapper的XML页面取不到数据找JSP的EL表达式。这里有个常见的误解有人说SSM里没有“实体类层”其实实体类就是MVC里的Model部分。它既要承载数据库表的一行数据又要作为页面展示的数据载体。所以实体类里的字段命名通常和数据库字段一一对应比如商品表是product_id实体类里就是productIdMyBatis会自动做驼峰映射。2.2 母婴业务的四张核心表商品、分类、用户、订单母婴类网站和普通电商网站比业务表会更集中在几块商品是核心分类用来组织商品用户承载注册登录订单记录交易。毕设项目一般不会把表拆得很碎但表结构设计本身可以直接作为论文里“数据库设计”章节的内容来写。我会先把这四张表的建表语句看一遍确认它的字段是不是够用CREATE TABLE category ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL COMMENT 分类名称如奶粉、尿裤、玩具, sort int(11) DEFAULT 0 COMMENT 排序值越小越靠前, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE product ( id int(11) NOT NULL AUTO_INCREMENT, category_id int(11) NOT NULL COMMENT 所属分类, name varchar(100) NOT NULL, subtitle varchar(200) DEFAULT NULL COMMENT 卖点标题, main_image varchar(255) DEFAULT NULL COMMENT 商品主图路径, price decimal(10,2) NOT NULL COMMENT 价格用Decimal不用Float, stock int(11) NOT NULL DEFAULT 0, status tinyint(4) DEFAULT 1 COMMENT 1上架 0下架, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL, password varchar(100) NOT NULL COMMENT 建议存MD5或加盐值, phone varchar(20) DEFAULT NULL, address varchar(200) DEFAULT NULL COMMENT 收货地址, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE orders ( id int(11) NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 订单编号代码生成, user_id int(11) NOT NULL, product_id int(11) NOT NULL, product_name varchar(100) DEFAULT NULL COMMENT 冗余商品名快照, product_price decimal(10,2) DEFAULT NULL COMMENT 下单时价格快照, quantity int(11) NOT NULL, total_price decimal(10,2) NOT NULL, receiver_name varchar(50) DEFAULT NULL, receiver_address varchar(200) DEFAULT NULL, status tinyint(4) DEFAULT 0 COMMENT 0待发货 1已发货 2已完成, create_time datetime DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;注意订单表里那几个冗余字段这是电商项目的标准做法下单那一刻就把商品名和价格复制一份到订单里。因为商品的价格、名称后面可能改价下架但订单必须是当时成交的记录不能跟着商品表变化。这个点写进论文、答到“为什么这么设计”时非常加印象分比单纯说“有外键关联”要高一层。2.3 一条商品列表请求的完整链路从浏览器到数据库再回来这个链路是整个SSM项目最核心的东西。我建议每个人都背下来因为答辩时评委几乎必问“用户访问首页数据是怎么出来的”。链路是这样的浏览器输入首页地址 → Tomcat收到请求 → SpringMVC的DispatcherServlet根据URL找到对应的Controller方法 → Controller调用Service接口 → Service实现类调用Mapper接口 → MyBatis执行XML里的SQL语句 → 数据库返回结果集 → MyBatis把行数据封装成实体类List → 一路返回到Controller → 数据塞进Model里 → 转发到JSP页面 → JSP用JSTL标签把数据渲染成HTML → Tomcat把HTML响应给浏览器。对应到代码上是最常见的三段式Controller RequestMapping(/product) public class ProductController { Autowired private ProductService productService; RequestMapping(/list) public String list(Model model) { ListProduct products productService.getAll(); model.addAttribute(products, products); return product/list; } }Service public class ProductServiceImpl implements ProductService { Autowired private ProductMapper productMapper; Override public ListProduct getAll() { return productMapper.selectAll(); } }select idselectAll resultTypecom.shop.entity.Product SELECT id, category_id, name, subtitle, main_image, price, stock, status, create_time FROM product WHERE status 1 ORDER BY create_time DESC /select三个文件对应三层Controller只做转发不写业务Service只调Mapper不写SQLMapper的XML只写SQL不关心页面。这样“高内聚低耦合”在SSM里体现得最清楚。答辩时如果能顺手点出“每一层都是通过接口调下一层改数据库时只动Mapper不影响Controller”面试官基本就会认定你是真写过代码而不是只跑通了Demo。2.4 为什么SSMJSP这套老技术栈反而好答辩现在毕业设计里前后端分离很流行VueSpringBoot看起来高级但答辩时往往更被动。因为评委一旦问“跨域怎么处理”“token过期刷新怎么设计”“Nginx部署时前端路由为什么404”没真做过项目的同学当场就容易答不上来。SSMJSP是服务端渲染页面直接从Controller转发过来没有跨域问题没有前后端接口联调问题登录状态用session就能管住。最实际的一点SSM是大多数高校Java课程设计案例源码和教学里讲得最多的组合评委老师对它的熟悉程度远超对Vue生态的熟悉程度。他们会问的IOC反转控制、AOP事务、MyBatis动态SQL网上答案一抓一大把而且项目里都能找到对应代码。你不用准备“这个框架为什么比那个框架好”这种开放题只需要把项目里真实用的技术点讲清楚就行。这题看起来不新但它是让你“能毕业”的稳妥选择。3. 从零跑通环境准备、数据库脚本和IDEA导入3.1 环境清单与版本搭配JDK不是越新越好SSM项目的血泪经验第一条就是别在版本上追求新。很多老项目用的是javax.*命名空间的包JDK 17以上把javax迁移成了jakarta直接编译报一堆“程序包不存在”。我推荐的版本搭配是组件版本说明JDK1.8兼容性最好环境变量配置最成熟Maven3.6.3不要用4.x依赖解析策略有差异Tomcat8.5支持Servlet 3.1适配javaxMySQL5.7驱动用5.1.49即可IDEA任意较新版自带Tomcat集成运行java环境变量配置这块我见过不少翻车案例配了JAVA_HOME但Path里没加%JAVA_HOME%\bin导致命令行能跑java但IDEA里找不到JDK。配置完先在cmd里执行java -version和mvn -v都正常再继续下一步。这一步花五分钟能省后面两小时。Maven还需要确认settings.xml里的镜像源。国内网络下如果中央仓库下载卡住pom.xml里那几十个依赖会持续标红。建议在settings.xml里配置阿里云镜像这个操作在教程文档里通常也会写但很多人会跳过导致翻车。3.2 数据库脚本导入先建库再建表拿到压缩包后先找到数据库脚本文件一般是sql结尾的脚本。打开看一眼如果里面有CREATE DATABASE就把整个脚本直接导入如果只有建表语句就得先手动建库。用Navicat操作时最不容易出错的方式是新建查询把脚本内容粘贴进去执行mysql -u root -p shop.sql这是命令行导入方式注意你必须先创建好数据库。Navicat里直接右键数据库选“运行SQL文件”也可以但我更推荐命令行因为它不会因为SQL文件里带了USE语句而选错库。导入后检查一下表数量母婴类毕设项目至少要有上面说的商品、分类、用户、订单四张核心表加上购物车、留言或收藏之类的辅助表总共6到10张都算正常。常见坑是SQL脚本在旧Navicat里双击打开无法执行或者脚本编码是GBK而工具默认UTF-8导致中文注释乱码。遇到这种情况直接把文件用记事本另存为UTF-8编码再导入一般都能解决。建库时字符集统一用utf8mb4不要用utf8因为后续如果插入特殊符号utf8会报“Incorrect string value”错误。3.3 导入源码到IDEA确认Maven依赖和三个配置文件拿到压缩包后解压用IDEA直接Open这个目录选Maven项目等右下角依赖解析完成。很多项目在第一次导入时pom.xml会标红这是正常的执行一次clean和reimportmvn clean mvn dependency:resolve如果IDEA右下角提示“Maven projects need to be imported”一定要点导入不能跳过。导入后检查pom.xml里是不是有这几个核心依赖spring-webmvc、mybatis、mybatis-spring、mysql-connector-java、jstl、javax.servlet-api。缺哪个就直接搜报错信息最常见的两种是servlet-api版本冲突和jstl没引入导致JSP页面里% taglib全部报错。依赖没问题后按顺序检查三个配置文件第一个是src/main/resources/db.properties里面是数据库连接信息这是必须改成你自己机器参数的。 第二个是spring-mybatis.xml或applicationContext.xml注意看数据源是不是读取了db.properties里的占位符。 第三个是spring-mvc.xml确认组件扫描路径和视图解析器的前缀后缀。如果教程里说“导入即运行”那说明配置里用的是通用账号密码比如root/123456你也要改成自己电脑实际的MySQL账号密码再试。3.4 数据库连接池参数最容易改错的四个地方连接池配置在毕设项目里一般用dbcp或druid配置文件就几行但四个参数值得逐一确认jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/shop?useUnicodetruecharacterEncodingutf8useSSLfalse jdbc.usernameroot jdbc.password123456第一个是driver类名。MySQL 5.x用com.mysql.jdbc.DriverMySQL 8.x要改成com.mysql.cj.jdbc.Driver同时url里还得加serverTimezoneAsia/Shanghai。很多人的坑在于本地明明装了MySQL 8驱动jar还是老的或者反过来导致启动时报ClassNotFoundException或连接超时。第二个是url里的useSSLfalse。不加这个参数MySQL 5.7以上会在连接时给一大堆SSL警告虽然不是致命错误但控制台刷屏会让新手误以为项目挂了。第三个是密码。这里我要特别提醒db.properties里的密码必须和MySQL实际用户密码完全一致连接串里不支持任何形式的“自动读取”。曾经有人把密码写在Navicat里能连但项目的配置文件里密码还是源码自带的测试密码结果启动就报Access denied for user。第四个是连接池大小。druid里常见的配置是initialSize5、maxActive20正常毕设项目实测大并发根本没人访问保持默认就行不要为了“看起来专业”把minIdle调成50白白占用MySQL连接数。等启动时报Connection is not available, request timed out时还要回头来检查这里。3.5 启动顺序和验证路径顺序是有讲究的我建议固定为先启动MySQL服务再在IDEA里启动Tomcat最后浏览器访问首页。如果先启动Tomcat数据源会在Spring容器初始化时就尝试建连此时MySQL没起来启动直接失败。在IDEA里配置Tomcat时要确认Deployment里选的是war exploded模式Application context可以设为/或者/shop。这里有个新手最容易忽略的点如果你是直接访问http://localhost:8080/但项目配置的context path是/shop就会看到Tomcat默认首页而不是项目首页。正确地址应该是http://localhost:8080/shop/。这个地址记在论文的“系统运行环境”一节里答辩演示时直接照着打开。启动成功后先看控制台有没有Started字样然后在浏览器里依次验证注册一个用户、退出、登录、浏览商品列表、点进详情、下单。这一步跑通说明你的环境、数据库、项目和代码是完整一致的后面所有修改都建立在这个基础上。4. 核心功能对着改页面渲染、购物车和订单事务4.1 商品列表页JSPJSTL怎么把数据渲染成HTMLSSM项目的页面是JSP它比前后端分离多了一层服务端渲染。看页面代码时你会发现JSP里除了HTML标签还混着c:forEach和${}这种特殊标签这就是JSTL和EL表达式。JSTL是控制流EL是取值两者组合是JSP项目的标准搭配。商品列表页的核心片段长这样% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % div classproduct-grid c:forEach items${products} varp div classproduct-card a href${pageContext.request.contextPath}/product/detail?id${p.id} img src${p.mainImage} alt${p.name} h3${p.name}/h3 p classprice${p.price}/p /a /div /c:forEach /div注意${pageContext.request.contextPath}这个写法它动态取项目根路径。很多人直接写/shop/或者空路径部署时一换context path图片全裂。如果页面循环不出来数据不要第一时间怀疑JSP先看Controller里有没有往Model里放products这个key再看数据库里status1的商品是不是为空。JSP本身只是消费者的角色先把数据链路查清楚再改页面这是排查效率最高的顺序。4.2 购物车和提交订单事务注解不能只加在Controller上母婴网站的购物车核心是“加购”和“下单”。加购比较简单把商品放进session里存着就行。下单这步则是全项目里最考验事务概念的地方因为它涉及多个写操作扣减库存、生成订单记录、清空购物车。这三件事任何一个失败整个下单操作都得回滚否则就会出现“扣了库存但订单没生成”或者“订单生成了但库存变成负数”的脏数据。正确写法是把事务注解加在Service实现类的方法上而不是Controller上Service public class OrderServiceImpl implements OrderService { Autowired private ProductMapper productMapper; Autowired private OrderMapper orderMapper; Override Transactional(rollbackFor Exception.class) public boolean createOrder(Integer userId, Integer productId, Integer quantity, String receiverName, String receiverAddress) { // 1. 查询商品并校验库存 Product product productMapper.selectById(productId); if (product null || product.getStock() quantity) { return false; } // 2. 扣减库存 int updated productMapper.reduceStock(productId, quantity); if (updated 0) { throw new RuntimeException(扣减库存失败回滚); } // 3. 生成订单 Order order new Order(); order.setOrderNo(UUID.randomUUID().toString().replace(-, )); order.setUserId(userId); order.setProductId(productId); order.setProductName(product.getName()); order.setProductPrice(product.getPrice()); order.setQuantity(quantity); order.setTotalPrice(product.getPrice().multiply(new BigDecimal(quantity))); order.setReceiverName(receiverName); order.setReceiverAddress(receiverAddress); orderMapper.insert(order); // 4. 清空购物车由Controller层处理这里只保证事务核心部分 return true; } }代码里第3步用了product.getName()和product.getPrice()来给订单冗余快照工商的就是前面建表时说的那个设计落地。Transactional(rollbackFor Exception.class)这行最关键默认情况下Spring事务只对RuntimeException回滚遇到受检Exception是不会自动回滚的。毕设项目里统一写成rollbackFor Exception.class是最省心的做法。判断事务是否生效有个土办法把第3步的orderMapper.insert这一行故意改成插入一个不存在的字段运行后看库存有没有被扣。如果库存没变说明回滚生效了如果库存变了说明事务没管住最常见的原因是spring-mybatis.xml里漏配了事务管理器或者tx:annotation-driven。这个排查方法毕业设计阶段够用。4.3 后台管理商品编辑时表单回显是必考操作母婴用品网站的另外半边是后台管理管理员登录后能对商品做增删改查。这里面最值得单独说的一步是“编辑商品”。因为新增很简单表单提交Controller然后insert就行但编辑不一样点“编辑”按钮时表单里要有当前商品的数据Java Web里管这个叫回显。回显的标准写法第一步先根据id查出商品放入Model第二步转发到编辑页面RequestMapping(/edit) public String edit(Integer id, Model model) { Product product productMapper.selectById(id); model.addAttribute(product, product); return admin/product_edit; }input typetext namename value${product.name} input typetext nameprice value${product.price} input typehidden nameid value${product.id}注意那个typehidden的id字段这是表单提交时告诉后端“你改的是哪一条记录”的暗号。漏掉它Controller里就接收不到id更新时会变成“没有条件的update”直接把整张表的数据都改掉。这个错误后果很严重我建议所有update语句都先看一眼有没有WHERE子句再跑。如果你改完页面样式发现价格变成800.0丢失了两位小数那是JSP页面的格式化问题在页面里用fmt:formatNumber value${product.price} pattern0.00/就能解决。别去改数据库字段Decimal本身没问题。4.4 jsp个人信息展示页面核心是Session而不是数据库热搜里“jsp个人信息展示页面”一直是Java Web学习者常搜的点。很多人以为个人信息是打开页面后实时查数据库拿到的实际上更常见的做法是登录成功时把user对象放进session里个人中心页面直接从session里取。熟人一眼就能看出你有没有真正做过项目因为频繁查数据库在性能上是不划算的。% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % div classuser-info h3欢迎回来${sessionScope.user.username}/h3 p手机号${sessionScope.user.phone}/p p收货地址${sessionScope.user.address}/p /div关键写法是${sessionScope.user.username}它明确告诉读者这个数据来自session作用域里的user对象。如果页面这里显示空白先看登录方法里有没有session.setAttribute(user, user)这行代码。很多新手只做了用户名密码校验忘了这是一次“会话建立”的过程。这里要注意一个边界用户修改个人资料后必须同步更新session里的user对象否则页面上还是显示旧手机号、旧地址。常见做法是修改成功后重新从数据库查一遍再setAttribute覆盖原有对象。这个细节虽然小但在现场演示时非常能体现工程意识评委一眼就能看出来你考虑过数据一致性问题。5. 避坑指南SSM项目从导入到答辩的8个血泪坑5.1 Tomcat能启动但访问首页404先确认启动日志里有没有类似Deployment of web application directory has finished的字样再看IDEA里Deployment的Application context是什么。Tomcat能启动只能说明容器正常和你的项目能不能被访问没有关系。如果context是/shop就必须访问http://localhost:8080/shop/我见过很多人在这里反复刷新8080根路径永远看不到页面。另一种情况是项目压根没部署上去检查Deployment列表里是否为空。5.2 启动时报ClassNotFoundException: DispatcherServlet这是典型的Maven依赖没进Tomcat。原因通常是IDEA没有用Maven的方式运行项目或者pom.xml里的spring-webmvc依赖虽然写了但没有在IDEA右侧Maven面板里执行reimport。解决方法是先mvn clean再右键项目选Maven → Reload Project然后检查External Libraries里是否出现spring-webmvc的jar。如果还不行就删掉本地仓库的.lastUpdated文件再重新拉取一遍。这个坑在换电脑、换IDEA版本时特别容易触发。5.3 MySQL 8.x下连接报错或启动控制台无限重试现象是启动时Spring日志里反复出现Cannot create PoolableConnectionFactory错误后半句通常带Public Key Retrieval is not allowed或Access denied。前者的原因是MySQL 8默认的caching_sha2_password认证方式老驱动或者连接串没有加allowPublicKeyRetrieval。解决方法是把db.properties里的driver改成com.mysql.cj.jdbc.Driverurl加上allowPublicKeyRetrievaltrueuseSSLfalseserverTimezoneAsia/Shanghai。顺便说一句hoser安装8.x的同学Navicat连不上的时候也是同样处理思路。5.4 中文乱码到底改哪一层乱码有四种来源必须按顺序排查JSP文件本身的编码、请求编码、响应编码、数据库连接编码。最简单有效的办法是在web.xml里配置Spring的编码过滤器统一UTF-8filter filter-nameencodingFilter/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同时保证db.properties的url里有characterEncodingutf8MySQL建库时用了utf8mb4三层一致乱码基本绝无可能是。如果加了过滤器还乱检查JSP第一行的pageEncoding以及文件是不是用UTF-8编码保存的。IDEA右下角能看到当前文件编码GBK文件即使页面写UTF-8也没用。5.5 商品图片显示不出来只看到裂图图标原因是图片的访问路径和上传保存路径不一致。常见的错误实现是把图片存到了IDEA工作空间下的某个目录里但Tomcat实际访问的路径是webapp目录。两个办法任选一是把上传目录直接指向src/main/webapp/upload二是用SpringMVC的静态资源配置mvc:resources mapping/upload/** location/WEB-INF/upload//我建议毕设用第一种简单直接部署成war时路径也不会丢。如果你用第二种注意访问地址要写${pageContext.request.contextPath}/upload/图片名.jpg。上传功能做完了一定要用一个真实的jpg文件走一遍“上传-列表页-详情页”全链路光在本地看文件存在没有意义。5.6 答辩前换电脑部署跑不起来最常见的三个坑MySQL密码没改、端口被Tomcat或MySQL占用以及IDEE里没配置Tomcat。如果是同一台电脑重启后跑不起来优先查3306和8080端口netstat -ano看一眼谁占着端口。如果是换电脑我建议直接打成war包部署下一页我会具体讲。任何情况下都别在答辩现场现编译项目提前一天把环境固定好是最稳妥的策略。6. 答辩与进阶把“能跑”变成“能讲”的三个技巧6.1 画清一张请求链路图评委十分钟听懂SSM答辩时不要一上来就点开页面评委想听的是你对系统的整体把握。我习惯在白板上画一张横跨三层的图左边是浏览器中间画一个Tomcat框标出DispatcherServlet右边画MySQL。然后用箭头串起一条购物流程用户点商品列表 → Controller → Service → Mapper → SQL。每画一个箭头就说一句对应代码里的类名和文件名。画完这张图SSM三个框架怎么协作、日志里看的请求怎么流转你已经都讲清楚了。穆子这里可以顺带回答SSM面试题里最常问的IOC和AOPIOC就是对象不由你new而是交给Spring容器AOP就是事务那个注解帮你在方法前后自动加了事务控制。6.2 用Navicat现场演示数据落地演示完页面操作打开Navicat选中数据库执行一条查询看看刚才新增的订单记录。这个动作现场效果很好它把前后端和数据库串成了一条完整的证据链证明你不是只做了个静态页面。更进一步在Navicat里直接改一条商品的库存刷新网页页面数据变了这就是“数据库表和页面是通的”最直观的证明。我也习惯在演示时用SELECT * FROM orders ORDER BY id DESC LIMIT 5按创建时间倒序展示刚插入的订单。6.3 把传统JSP项目打包成war放到任何电脑都能跑毕设项目打包成war是标准交付形态。在IDEA右侧Maven面板里执行clean然后执行packagetarget目录下会生成一个war包mvn clean package把war包复制到Tomcat的webapps目录下启动Tomcat它会自动解压并部署。访问路径就是http://localhost:8080/war包名/。相比在IDEA里点运行war包方式更接近真实部署环境也方便你在演示机上提前跑通。这里提示一点不要指望nginx直接解析JSPnginx本身不支持JSP页面的Servlet渲染正经做法是nginx只做端口转发真正的请求交给Tomcat处理毕设答辩阶段用Tomcat单独跑就够了不用引入nginx。我自己的习惯是答辩前一晚把数据库删掉重建一遍、重新导入初始SQL、用war包启动一遍完整流程全程把每一步报错记在一张纸条上。第二天演示时哪怕现场出问题你也能快速定位是环境还是代码。这种“自己把每一步重新踩一遍”的做法比背十遍八股文都有用做毕业设计最后拼的就是细节耐心。希望帮到你。本文还有配套的精品资源点击获取