☰
JavaWeb超市管理系统毕设实战:JSP+Servlet+JDBC+MySQL全流程部署
2026/10/4 16:48:35 网站建设 项目流程

简介:这是一套基于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> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- JSP API,同样是编译期依赖 --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <!-- MySQL 驱动,运行期必须打包到 lib 下 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> <!-- JSTL 标签库,JSP 页面的 c:forEach 等标签依赖它 --> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> <version>1.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`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

这套设计有几处是符合实际开发习惯的:主键用自增 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.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/sms?useSSL=false&characterEncoding=utf8 jdbc.username=root jdbc.password=123456

逐个说明:jdbc.driver在 MySQL 5.7 时代写com.mysql.jdbc.Driver,MySQL 8.0 要改成com.mysql.cj.jdbc.Driver;jdbc.url里sms对应你导入的数据库名,useSSL=false是避免本地连接时 SSL 告警,characterEncoding=utf8是为了让中文字符从 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 启动正常,登录页也正常,但点登录后页面变 500,IDEA 控制台出现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-8,Servlet 里request.setCharacterEncoding("utf8")的位置可能在参数读取之后,就来不及了。

解决:三条命令逐个确认。第一,确保 JSP 文件顶部是<%@ page contentType="text/html;charset=UTF-8" language="java" %>;第二,数据库连接 URL 上已经带了characterEncoding=utf8(如果没带,JDBC 会按本机默认编码传值);第三,如果还不放心,最稳妥的做法是在web.xml里加一个全局编码过滤器,把请求和响应的编码统一到 UTF-8:

<!-- 从 web.xml 中抽出片段,置于文件头部的 web-app 标签内 --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</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 server's identity verification...,有时伴随连接超时。

原因:MySQL 5.7 及以上版本默认开启了 SSL,而驱动的 5.1.x 版本连接时会对 SSL 握手做一些额外检查,本地开发环境下没有 SSL 证书,就会告警。更麻烦的是如果连接超时,业务代码会直接抛异常。

解决:在db.properties的连接 URL 上把useSSL=false放进参数即可。如果本机 MySQL 是 8.0,驱动版本同步升级到 8.0.33,URL 里还需要加上serverTimezone=Asia/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,也会出现 404,IDEA 里老版本的 Tomcat 对 modify 操作有时不触发热部署,手动重启最保险。

5.5 数据库连接失败:Access denied for user 'root'@'localhost'

现象:启动项目或登录时控制台报java.sql.SQLException: Access denied for user 'root'@'localhost' (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 style="color:red;">的样式条件,就能做出预警效果。第二,把新增商品功能改造为“批量导入”:使用 Apache POI 解析 Excel,本质上是读取文件后循环调用GoodsDao.insert(),这个改造可以作为论文里的“系统优化与扩展”章节。注意,所有 Servlet 层不要直接写 JDBC 代码,保持 DAO 层的数据访问职责。

说到底,JavaWeb 项目的跑通不是终点,能说出“哪个请求对应哪个 Servlet、哪个 JSP 展示哪张表的数据、哪个字段驱动哪个页面变化”,才是答辩现场最稀缺的能力。

说句实在话,这套系统我第一次跑的时候,光在数据库密码上就卡了半小时,最后发现是 properties 文件里多了一个空格。从那以后我每次拿到任何 JavaWeb 源码,第一步永远是先改db.properties并测试数据库连接,然后再启动 Tomcat——检查顺序倒过来就是白费时间。希望这篇拆解能让你少踩几个同样的坑,祝你顺利跑起来。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询