ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

JavaWeb超市管理系统毕设实战:JSP+Servlet+JDBC+MySQL全流程部署

JavaWeb超市管理系统毕设实战:JSP+Servlet+JDBC+MySQL全流程部署 简介这是一套基于JavaWeb的超市管理系统毕业设计项目包含完整项目源码与数据库脚本。项目为个人毕设答辩作品评审分达到98分代码经过实际调试与测试可确保直接运行主要面向计算机、通信、人工智能、自动化等相关专业学生亦适合作为课程设计、大作业或毕业设计的参考模板。压缩包共64个文件涵盖28个Java源文件、21个JSP页面、10个XML配置文件及properties配置并附SQL建表脚本与说明文档整体大小约582KB其中Java文件承担业务逻辑与数据访问JSP页面负责前端展示与交互XML等配置文件用于工程整合与运行环境搭建目录内还包含Maven工程描述文件与简要说明文档便于导入IDE后快速启动。当前已有141人学习下载适合初学者对照学习超市管理系统的前端交互、后端逻辑与数据库设计也支持在此基础上进行二次开发与功能扩展整体具有较高的实用与借鉴价值。1. 为什么一个“老技术”毕设能拿 98 分先弄懂这套超市系统到底在做什么第一次看到这份基于 JavaWeb 的超市管理系统时我的第一反应是“又是 JSP Servlet 的老三样”。但把它完整跑起来之后我改变了自己的判断——这是一个非常典型的、把 JavaWeb 核心知识链走通的毕设项目。它的价值不在于技术有多新而在于它完整覆盖了从数据库设计到前端页面的全部环节商品管理、分类管理、库存变动、供应商管理、用户登录与权限校验全部在一个 Tomcat MySQL 的环境下闭环跑通。这套系统适合三类人一是计算机相关专业、正在找毕设题目的学生可以用它做底子快速交付二是想搞懂 JavaWeb 项目完整链路JSP 怎么写、Servlet 怎么跳转、JDBC 怎么连库、Maven 怎么管理依赖的初学者三是手里有课设任务、需要一个“能演示、能有截图、能写进论文”的参考实现的从业者。系统本身不算复杂但每一层该有的东西都在对于学习者和二次开发来说是一个非常干净的起点。在往下拆之前先说明这份资源是一个完整的压缩包里面包含 Maven 工程pom.xml、Java 源码、JSP 页面、数据库脚本sms.sql以及项目说明文档。我下面的所有操作均基于 Windows 11 IntelliJ IDEA 2023 Tomcat 8.5 MySQL 5.7 环境如果你用的是 MySQL 8.0我会在对应位置标注差异。2. 从压缩包到可运行项目技术栈选型与结构拆解2.1 为什么选 JavaWeb 而不选 Spring Boot毕设答辩的底层逻辑很多学生现在习惯直接上手 Spring Boot轮到做毕设却卡在“框架封装太多、说不清原理”上。这套超市系统坚持用 JSP Servlet JDBC恰恰是整个项目最值得学习的地方。毕设答辩时老师最常问的问题不是你用了什么框架而是“用户登录之后请求是怎么一步步走到数据库再返回页面的”。JSP Servlet 的模型天然把这条链路摊开浏览器发起请求 → Tomcat 找到对应的 Servlet → Servlet 调用 DAO 层 → DAO 通过 JDBC 访问 MySQL → 结果封装后转发回 JSP 渲染。每个环节的角色边界非常清晰。如果你是冲着学东西来的不建议一上来就把这套代码改造成 Spring Boot。先按原样跑通画一遍请求流程图再去想优化的事底子会更扎实。2.2 工程目录逐个看每个文件夹是干什么的解压之后你会看到这样的目录结构supermarket-management-system │ pom.xml │ sms.sql │ README.md └─ src └─ main ├─ java │ └─ com/xxx/sms实际包名以解压后为准 │ ├─ servlet # 控制层接收请求、转发页面 │ ├─ dao # 数据访问层封装 JDBC 操作 │ ├─ entity # 实体类对应数据库表 │ └─ util # 数据库连接工具、字符编码过滤器等 ├─ webapp │ ├─ admin # 后台管理页面JSP │ ├─ css / js # 静态资源 │ └─ WEB-INF │ └─ web.xml # Servlet 映射、欢迎页面等配置 └─ resources └─ db.properties # 数据库连接配置用户名、密码、URL这个结构是标准的 JavaWeb 分层没有任何花哨的东西。实操时你只需要关注三个地方db.properties改数据库账号密码、web.xml确认 Servlet 映射路径、以及sms.sql初始化数据库。其余代码在你第一次运行时最好不要动跑通了再去改造。2.3 pom.xml 能告诉我们什么依赖版本与作用打开pom.xml重点关注这几个依赖dependencies !-- Servlet API 4.0编译期需要Tomcat 运行期提供 -- dependency groupIdjavax.servlet/groupId artifactIdjavax.servlet-api/artifactId version4.0.1/version scopeprovided/scope /dependency !-- JSP API同样是编译期依赖 -- dependency groupIdjavax.servlet.jsp/groupId artifactIdjavax.servlet.jsp-api/artifactId version2.3.3/version scopeprovided/scope /dependency !-- MySQL 驱动运行期必须打包到 lib 下 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version5.1.49/version /dependency !-- JSTL 标签库JSP 页面的 c:forEach 等标签依赖它 -- dependency groupIdjstl/groupId artifactIdjstl/artifactId version1.2/version /dependency /dependencies注意两点第一Servlet 和 JSP 的依赖 scope 是provided意思是编译时用一下真正运行时由 Tomcat 容器提供如果打包时把这俩也塞进去反而会冲突。第二MySQL 驱动如果是 5.1.x对应 MySQL 5.7 没有问题但如果你本机装的是 MySQL 8.0建议把驱动版本改成8.0.33同时数据库连接 URL 里的com.mysql.jdbc.Driver要改成com.mysql.cj.jdbc.Driver否则会直接报表驱动类找不到。这个坑在第四章详细展开。3. 让数据库先站起来sms.sql 脚本的导入与参数说明3.1 先用 MySQL Workbench 或命令行把库建起来这套系统的数据库脚本是sms.sql命名取自 Supermarket Management System 的缩写。脚本内容是完整的建库、建表、插入初始化数据的 SQL包含管理员账号、少量商品分类和几十条商品记录这样第一次登录后页面不会空荡荡上课演示时效果更真实。导入之前用文本编辑器打开这个文件搜一下CREATE DATABASE和USE关键字确认默认的数据库名、字符集和排序规则比如CREATE DATABASE IF NOT EXISTS sms DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE sms;如果你本机已经装过一套 MySQL而且root用户有密码导入之前要先确认脚本里有没有包含CREATE USER或GRANT语句如果有就删掉直接使用你自己现有的账号授权即可。在命令行导入非常简单mysql -u root -p sms.sql输入密码之后脚本会静默执行完所有语句。执行完用下面命令验证USE sms; SHOW TABLES;正常情况下你会看到类似t_admin、t_goods、t_goods_type、t_supplier这样的表名不同的表对应管理员、商品、分类、供应商等核心业务对象。如果SHOW TABLES结果为空大概率是脚本里USE的数据库名和你实际查看的库名不一致或者导入过程中有报错被忽略了。3.2 表结构设计好在哪主键策略与字段类型看一遍表结构对后续二次开发非常有用。以商品表为例常见的字段设计可以参考下面的 SQL 片段CREATE TABLE t_goods ( id INT(11) NOT NULL AUTO_INCREMENT COMMENT 商品主键, goods_name VARCHAR(100) NOT NULL COMMENT 商品名称, goods_type_id INT(11) DEFAULT NULL COMMENT 商品分类ID外键关联t_goods_type, price DECIMAL(10,2) DEFAULT NULL COMMENT 零售价, stock INT(11) NOT NULL DEFAULT 0 COMMENT 库存数量, supplier_id INT(11) DEFAULT NULL COMMENT 供应商ID, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id), KEY idx_type (goods_type_id), KEY idx_supplier (supplier_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这套设计有几处是符合实际开发习惯的主键用自增 int、所有数值类字段加了能用得上的索引、价格用DECIMAL(10,2)而不是float避免了浮点精度问题。对毕设来说这种表设计写进论文里完全站得住脚。需要修改时直接在原来的 SQL 里加字段就行比如给商品表加一个warn_stock字段用于库存预警ALTER TABLE t_goods ADD COLUMN warn_stock INT(11) NOT NULL DEFAULT 10 COMMENT 库存预警阈值;3.3 IDEA 里用 Database 面板导入可视化替代方案不习惯命令行的同学可以在 IDEA 右侧打开 Database 面板点加号选择 DataSource → MySQL填上主机、端口、用户名、密码连接成功后右键sms数据库 → Run SQL Script…选择sms.sql即可。这种方式的好处是能看到控制台的完整输出哪条语句报错会直接标出来对排查分号缺失、编码问题更友好。导入完成后刷新数据库连接能看到所有表和数据。但注意这一步只是把数据库建好了Java 代码还没跟它建立连接需要进入下一步配置db.properties。4. 用 IDEA 把项目跑起来Tomcat 配置与全流程验证4.1 修改数据库连接配置只改这里就够了在 IDEA 中File → Open选择解压后的pom.xml等待右下角 Maven 依赖下载完成。整个项目最关键的配置文件是src/main/resources/db.properties打开后几乎每行都要对着你自己的环境改jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/sms?useSSLfalsecharacterEncodingutf8 jdbc.usernameroot jdbc.password123456逐个说明jdbc.driver在 MySQL 5.7 时代写com.mysql.jdbc.DriverMySQL 8.0 要改成com.mysql.cj.jdbc.Driverjdbc.url里sms对应你导入的数据库名useSSLfalse是避免本地连接时 SSL 告警characterEncodingutf8是为了让中文字符从 Java 到数据库不乱码jdbc.password改成你自己 MySQL 的密码这是绝大多数第一次跑不起来的原因。4.2 IDEA 配置 Tomcat手把手设置我用的是 IDEA 2023配置路径和其他版本基本一致Run → Edit Configurations点左上角加号选择Tomcat Server → Local。Name随意比如Tomcat8.5。在Server选项卡中Application server点Configure...指向你本地解压的 Tomcat 目录HTTP port保持8080不变。切到Deployment选项卡点加号选Artifact此时需要先创建 Artifact。回到 IDEA 主界面打开File → Project Structure → Artifacts点加号选Web Application: Exploded直接使用默认名称。再三确认 IDEA 已经识别到web.xml如果这里没有WEB-INF/web.xml被标记Tomcat 起来后会出现 404。这里有个常见现象配置完成后点启动Tomcat 日志输出了Connected to server但浏览器打开http://localhost:8080/却看到 Tomcat 默认首页而不是系统登录页。原因是 Deployment 里 Artifact 的Application context不是根路径\默认可能是/sms_war_exploded。你只需要在 Deployment 选项卡里把它改成\然后重新启动登录页就会出现。为了不动这个路径也可以保留原值用http://localhost:8080/sms_war_exploded/访问个人建议改成根路径地址栏清爽很多。4.3 启动并验证登录管理员账号与页面流转启动成功后打开浏览器输入http://localhost:8080/应该能看到超市管理系统的登录页。README 文件里一般会写初始账号密码大多默认是admin/admin。登录成功后会跳到后台首页左侧是菜单右侧是统计概览或欢迎语登录失败时页面会提示用户名或密码错误这时候不需要查代码直接用 Navicat 或者命令行查t_admin表SELECT * FROM t_admin;如果表中没有数据说明sms.sql里的 INSERT 语句没执行成功重新执行脚本如果密码是密文存储而不是明文你需要找到util包下的 MD5 工具类按同一种算法把新密码加密后再 UPDATE 进库。5. 避坑指南五个让毕设卡壳的常见问题5.1 页面报 500控制台提示 ClassNotFoundException: com.mysql.jdbc.Driver现象Tomcat 启动正常登录页也正常但点登录后页面变 500IDEA 控制台出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。原因IDEA 中 Artifact 没有把 MySQL 驱动 jar 打包到WEB-INF/lib目录下。这在 Maven 项目里特别容易发生因为 IDEA 对provided依赖的处理和普通依赖不同而mysql-connector-java在 pom 里依赖范围正常但 Artifact 的输出没有包含 jar 包。解决File → Project Structure → Artifacts选中你的 Artifact在Output Layout里右键Available Elements找到mysql-connector-java-5.1.49的 jar 包选择Put into /WEB-INF/lib然后重新启动。从那以后我每次新建 JavaWeb 项目都会先检查一次 OUTPUT 里有没有WEB-INF/lib再谈跑通的事。5.2 中文乱码页面显示商å“这类乱码数据库里也是乱码现象部署后商品名称、类型名等中文全部变成菱形或乱码数据库里存进去的数据也是乱的。原因三层编码不一致。JSP 页面、Servlet 转发时设置的编码、数据库连接的characterEncoding任何一处断了都会乱码。具体到这个项目用户登录请求经过 Tomcat 时如果请求体没有设置 UTF-8Servlet 里request.setCharacterEncoding(utf8)的位置可能在参数读取之后就来不及了。解决三条命令逐个确认。第一确保 JSP 文件顶部是% page contentTypetext/html;charsetUTF-8 languagejava %第二数据库连接 URL 上已经带了characterEncodingutf8如果没带JDBC 会按本机默认编码传值第三如果还不放心最稳妥的做法是在web.xml里加一个全局编码过滤器把请求和响应的编码统一到 UTF-8!-- 从 web.xml 中抽出片段置于文件头部的 web-app 标签内 -- filter 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 /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping注意这个过滤器依赖 Spring 的 jar 包如果项目没引入 Spring直接复制会找不到类。更贴合原项目的方式是项目中util包下有一个自定义编码过滤器检查它是否已经在web.xml中正确配置。在你自己写代码时提前把过滤器放在所有 Servlet 映射前面。5.3 过期 MySQL 驱动导致的 SSL 告警与连接超时现象Tomcat 启动时控制台大片黄色告警内容是关于SSL connection或Establishing SSL connection without servers identity verification...有时伴随连接超时。原因MySQL 5.7 及以上版本默认开启了 SSL而驱动的 5.1.x 版本连接时会对 SSL 握手做一些额外检查本地开发环境下没有 SSL 证书就会告警。更麻烦的是如果连接超时业务代码会直接抛异常。解决在db.properties的连接 URL 上把useSSLfalse放进参数即可。如果本机 MySQL 是 8.0驱动版本同步升级到 8.0.33URL 里还需要加上serverTimezoneAsia/Shanghai否则连接时 MySQL 8.0 会因为没有设置时区而报The server time zone valueÖйú±ê׼ʱ¼ä is unrecognized。这两步是网上问得最多的做过后告警消失。5.4 登录页面跳转后一直是 404现象访问项目根路径能看到登录页但输入账号点击登录后地址栏变成了http://localhost:8080/login或某个 Servlet 路径页面 404。原因Servlet 的WebServlet注解或者web.xml里的url-pattern映射路径是错的或者 JSP 中的表单action指向的路径没有跟 Servlet 映射对上。这个项目部分 Servlet 使用注解部分用web.xml配置两者混用时要格外小心。解决打开web.xml找一个 login 相关的servlet-mapping看它的url-pattern是/login还是/login.do然后在 JSP 页面里搜form action保证两者一致。如果你改web.xml后没有重启 Tomcat也会出现 404IDEA 里老版本的 Tomcat 对 modify 操作有时不触发热部署手动重启最保险。5.5 数据库连接失败Access denied for user rootlocalhost现象启动项目或登录时控制台报java.sql.SQLException: Access denied for user rootlocalhost (using password: YES)。原因db.properties里的密码跟本机 MySQL 实际密码不匹配或者 MySQL 用户表的 host 字段不是 localhost。还有一种情况是root密码里有特殊字符比如、#直接被 properties 文件解析出问题。解决先确认 MySQL 账号密码用命令行验证mysql -u root -p你的密码 -e SELECT 1能执行就代表账号密码没问题然后检查db.properties中密码是否前后有空格。properties 文件中两边的空格会被当作值的一部分这是新手最容易碰到的隐性 bug。从那次踩了密码带#的坑之后我倾向于把所有配置文件的值先打引号再统一测试。6. 让系统在答辩中更有说服力三个演示技巧与入库实战先看一个最有用的验证技巧在登录前手动把t_goods表里某条商品的stock改成一个大数然后登录系统查看库存列表你马上能看到该商品库存页面的表现和别的商品有何不同。用这套系统答辩时你可以现场演示“数据变动驱动页面变化”这比任何解说都有效果——老师看到的是你理解业务字段不是只会背代码。再给两条二次开发的切入点。第一做“库存不足预警”给商品表加入前面提到的warn_stock字段在 DAO 层的查询方法里添加一条判断// 例如在 StockDao 的查询方法中增加库存预警判断 String sql SELECT * FROM t_goods WHERE stock ?; pstmt conn.prepareStatement(sql); pstmt.setInt(1, goods.getWarnStock()); ResultSet rs pstmt.executeQuery();配合c:if标签在 JSP 页面对库存数加一个span stylecolor:red;的样式条件就能做出预警效果。第二把新增商品功能改造为“批量导入”使用 Apache POI 解析 Excel本质上是读取文件后循环调用GoodsDao.insert()这个改造可以作为论文里的“系统优化与扩展”章节。注意所有 Servlet 层不要直接写 JDBC 代码保持 DAO 层的数据访问职责。说到底JavaWeb 项目的跑通不是终点能说出“哪个请求对应哪个 Servlet、哪个 JSP 展示哪张表的数据、哪个字段驱动哪个页面变化”才是答辩现场最稀缺的能力。说句实在话这套系统我第一次跑的时候光在数据库密码上就卡了半小时最后发现是 properties 文件里多了一个空格。从那以后我每次拿到任何 JavaWeb 源码第一步永远是先改db.properties并测试数据库连接然后再启动 Tomcat——检查顺序倒过来就是白费时间。希望这篇拆解能让你少踩几个同样的坑祝你顺利跑起来。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进