
简介JSP超市管理系统是面向Java Web初学者的B/S模式实战项目基于JSP与MySQL开发适合课程设计或毕业设计参考。项目围绕超市日常运营覆盖人事、销售、进货、库存、客户五大管理模块包含职工与供货商信息维护、商品销售盘点、进货与库存登记、用户账号管理等完整功能可帮助理解前后端数据交互与分层开发思路。源码可在MyEclipse 8.5和Tomcat 7.0环境中直接部署数据库采用MySQL5.0将配套SQL脚本导入后可运行管理员账号为admin/admin启动后登录页面即可进入系统。资源以RAR压缩包发布大小约1.06MB内含项目源码、页面文件与数据库脚本代码结构完整便于导入运行和二次开发。已有1023人学习下载适合希望通过完整案例掌握Java Web开发流程并理解超市管理系统业务逻辑的读者。1. 一套能跑通的JSP超市管理系统从登录到盘点的完整WEB闭环JSP超市管理系统是那种第一眼看上去很“课设”、实际却能完整跑通的B/S web项目JSP负责页面展示Java代码管业务和JDBCMySQL存数据整套源码加数据库脚本一步到位。它不追求高并发也不讲微服务但登录校验、session状态、增删改查、中文乱码处理这些web开发的基本功它一个不落。适合正在学JSP、准备课程设计、或者刚进java web门的人拿来做复现样本已经在写业务代码的熟手也能拿它当“标准课设”的边界参照。我拆过不少同类系统发现大家卡住的地方往往不是业务逻辑而是环境版本和数据库导入——这篇就按最省事的顺序完整拆一遍。2. 环境搭建MyEclipse 8.5、Tomcat 7.0 与 MySQL 5.0 的版本搭配为什么不能乱这类老项目最坑人的不是代码而是版本。项目正文写得很清楚开发环境是TOMCAT7.0、MyEclipse8.5、mysql5.0。这三个版本属于同一个年代JDK那会儿主流是1.6和1.7。你要是手头只有JDK 17、Tomcat 10、MySQL 8.0硬导这个工程大概率会翻车——Tomcat 10 之后包名从javax.servlet改成了jakarta.servlet老JSP页面和Java源码直接找不到类路径。2.1 版本搭配JDK 1.7 Tomcat 7.0 MySQL 5.x 的兼容逻辑我先给出一张可以直接照着配的版本表。不一定非要精确到小版本但大版本线不能跨组件推荐版本为什么这么配JDK1.71.6 也能跑和 MyEclipse 8.5 内置编译器匹配Tomcat 7 在 1.7 上最稳MyEclipse8.5 / 8.6自带 Web Project 结构识别和部署视图不用手动配 WTPTomcat7.0.xServlet 3.0 JSP 2.2login.jsp这类动态资源直接映射MySQL5.0 ~ 5.7驱动类叫com.mysql.jdbc.Driver5.x 全系兼容连接驱动mysql-connector-java-5.1.x和 MySQL 5.x 握手不掉链子别拿 8.x 驱动来测MySQL 5.0 现在官网已经不给新包了所以实操时我一般装 5.7驱动和 SQL 语法都不受影响。你要是手边只有 MySQL 8.0也能跑但驱动类要换成com.mysql.cj.jdbc.DriverURL 后面还得加serverTimezoneAsia/Shanghai和useSSLfalse不然连接层直接报 SSL 错误。新手别在这上面消耗时间老老实实装 5.7 版本最省心。2.2 JDK 与 MyEclipse 8.5 的安装配置先装 JDK 1.7再装 MyEclipse 8.5顺序不要反。JDK 装完后要配环境变量我用最常见的 Windows 路径举例setx JAVA_HOME C:\Program Files\Java\jdk1.7.0_80 setx Path %JAVA_HOME%\bin;%Path%配置完环境变量后新开一个命令行窗口验证。注意是新开窗口因为 setx 不会刷新当前已打开的终端。如果java -version显示的版本还是旧版多半是 Path 里前面有其他 JDK 的路径把%JAVA_HOME%\bin往前提就行了。java -version javac -version看到1.7.0_80这类输出就说明 JDK 没问题。classpath 那种老用法在 1.7 里不是必须的配不配都不影响 Tomcat 启动别在这上面纠结。MyEclipse 8.5 安装包是 exe 一路下一步装完先打开一次确认编译器默认指向 JDK 1.7。2.3 MyEclipse 里接好 Tomcat 7.0Tomcat 7.0 下载解压版就够用目录最好放在不带空格的路径下比如D:/apache-tomcat-7.0.109。然后在 MyEclipse 里做关联路径是Window - Preferences - Servers - Tomcat - Tomcat 7.0勾选 Enable指定 Tomcat 安装目录JDK 下拉选刚才配好的 1.7。这一步最容易忽略的是Serve Modules without publishing这个选项。老项目改动频繁勾上它之后 MyEclipse 直接用工作区里的文件去跑省掉每次改代码都要重新 publish 的步骤对调试课设项目来说体验差别非常大。在 Servers 视图里能看到 Tomcat 7.0 节点右键可以 Start但先别急着启动数据库还没建好启动只能看到欢迎页项目也还没部署上去。2.4 MySQL 5.x 安装与 root 账号设置MySQL 我建议装 5.7 的 Windows 解压版配置教程网上很多这里只说关键点my.ini里设置character_set_serverutf8端口保持默认 3306root 密码建议直接设成root。为什么因为这项目的配置文件 DBO.java 里默认账号密码很可能就是 root/root保持默认能少改一处。安装完成后先在命令行确认服务能起来这一步决定后面所有操作的前提net start mysql注意如果你的服务名不叫 mysql改成实际的服务名比如MySQL57。看到“服务启动成功”之后用mysql -uroot -proot试着登录能进命令行就说明环境这关过了。3. 导入工程与数据库还原把 jspsupermarket.sql 落进 supermarket 库的两个关键动作环境准备好之后正式开始导工程。这一章就解决两件事怎么把项目完整导进 MyEclipse怎么让数据库和代码对上线。这两件事里任何一个没对齐后面登录页面打不开、查询报错都是必然的。3.1 解锁工程文件导入时看清目录结构用File - Import - General - Existing Projects into Workspace然后选择工程根目录。关键点是选哪一层工程根目录的特征是下面直接有src、WebRoot或者WebContent、.mymetadata、.classpath这些文件和目录。选进去之后Projects 列表里应该出现一个名为supermarket的工程。导入完成后别急着打开页面先把目录结构过一遍src目录里放的是 Java 源码WebRoot下面放的是 JSP 页面、CSS、JS。数据库配置文件 DBO.java 在 src 里按Ctrl Shift R输入 DBO 就能直接定位到。这个文件是整条数据链路的起点后面改密码、改库名都靠它。如果导入之后 Java 文件报错最常见原因是 MyEclipse 的编译级别还是默认 JDK 1.8右键工程Properties - Java Compiler把级别改成 1.7重新 Build 一下就能消掉红叉。3.2 还原 jspsupermarket.sql 到 supermarket 库项目给的数据库文件名是jspsupermarket.sql系统名称是supermarket。先创建库再导入数据我用命令行演示最直接的方式mysql -uroot -proot进入 MySQL 命令行后执行CREATE DATABASE IF NOT EXISTS supermarket DEFAULT CHARACTER SET utf8; USE supermarket; SOURCE D:/path/to/jspsupermarket.sql;SOURCE后面写你本机 sql 文件的绝对路径。导入过程中如果没报错最后执行SHOW TABLES;能看到用户表、职工表、供货商表、商品表、进货表、销售表、库存表这些结构。这里有一个很容易踩的坑库名必须和 DBO.java 里的 URL 一致代码里写的是jdbc:mysql://127.0.0.1:3306/supermarket你建库建成了supermarketdb运行起来一定报Unknown database。不想动代码的话库名就只能叫 supermarket。3.3 按 DBO.java 校准数据库账号密码打开 DBO.java重点看三个常量URL、USERNAME、PASSWORD。这套老代码的驱动类基本是com.mysql.jdbc.Driver如果你装的是 MySQL 5.7驱动和 URL 都不用改只确认密码这一处即可private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://127.0.0.1:3306/supermarket?useUnicodetruecharacterEncodingUTF-8; private static final String USERNAME root; private static final String PASSWORD root; // 改成你本地MySQL的密码characterEncodingUTF-8是中文不乱码的关键参数没有这个参数后面所有中文数据都可能变成问号。如果你本机 MySQL root 密码不是 root就把 PASSWORD 这一行改成你自己的密码。改完之后保存MyEclipse 会自动编译。如果不放心可以执行Project - Clean强制重新编译一次防止 Tomcat 跑到旧 class 文件。3.4 部署到 Tomcat 并跑通 login.jsp部署动作在 Servers 视图里做右键 Tomcat 7.0 -Add and Remove Projects把 supermarket 从 Available 移到 Configured。部署名默认是supermarket不要手滑改成别的名字因为访问 URL 是http://127.0.0.1:8080/supermarket/login.jsp部署名变了路径就要跟着变。启动 Tomcat然后在浏览器输入上面的地址。能看到登录页面说明工程部署和数据源连接都通了。如果 Tomcat 启动后立刻失败或者页面打不开先看 Console 窗口的日志这一步不建议看网页上的报错Tomcat 的本地日志logs/localhost.log会把真实异常写得非常详细。跑通登录页之后用 admin/admin 登录能进到主页就算环境闭环了。4. 代码走读五大功能模块背后的 JDBC 链路与设计取舍系统跑通之后就该读代码了。这套项目的五个模块——人事、销售、进货、库存、客户管理——本质上都是围绕几张表做增删改查但每个模块的读写权限设计不一样读代码的时候能看出作者对业务边界的理解。4.1 登录链路login.jsp 到 Session 判权登录是最完整的请求链路示例浏览器提交表单JSP 把参数传给处理逻辑Java 代码用 JDBC 查数据库比对成功写 session然后跳转主页。login.jsp 里的表单结构大体是这个写法form actionlogin methodpost 账号input typetext nameusername / 密码input typepassword namepassword / input typesubmit value登录 / /form处理登录的代码里我见过最典型的写法是这样request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); Connection conn DBO.getConnection(); String sql SELECT * FROM user WHERE username? AND password?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { // 登录成功后把用户名放进session其他页面靠它判断是否已登录 session.setAttribute(loginUser, username); response.sendRedirect(index.jsp); } else { response.sendRedirect(login.jsp?error1); } DBO.close(conn, ps, rs);注意PreparedStatement的?占位符写法这才是标准做法——拿字符串直接拼接 SQL 的方式一旦用户名里带单引号就会出问题。你后面去面 Java 岗面试官问到 JDBC 防注入这个登录页就是现成答案。登录后的每个业务页面开头基本会有一段检查session.getAttribute(loginUser)是否为空、为空就response.sendRedirect(login.jsp)的逻辑这是老 JSP 项目控制访问权限最常见的做法。4.2 人事管理职工与供货商的同构增删改查人事管理模块拆成两组职工信息一组供货商信息一组每组都是“查询 更新增删改”两个入口。这种结构意味着页面上通常有一个列表页list.jsp负责查询展示再有add.jsp、edit.jsp负责录入和修改。读列表页时重点看主键怎么传的。列表里每条记录后面的“修改”“删除”链接会带上主键 id写法大致是a hrefedit.jsp?id% rs.getInt(id) %修改/a a hrefDeleteServlet?id% rs.getInt(id) %删除/a删除操作对应的处理代码一般是这样int id Integer.parseInt(request.getParameter(id)); String sql DELETE FROM supplier WHERE id?; PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, id); ps.executeUpdate(); response.sendRedirect(SupplierServlet?actionlist);这里值得注意的细节是删除之前有没有先确认这个供货商有没有关联进货记录。很多课设代码是不管关联的直接删结果就是数据不一致。搜到DELETE FROM supplier的时候多看一眼有ResultSet先查关联再删的说明作者考虑过外键约束问题。4.3 销售盘点与进货更新一读一写的权限设计销售管理模块里只有“查询”和“盘点”没有增删改入口进货管理模块却是“查询 增删改”都有。这种不对称不是功能缺失而是业务权限设计销售单是收银环节产生的后台管理员不需要去改销售单只需要统计进货是后台主动行为必须支持录入和修改。盘点功能在代码层面通常体现为一条聚合查询常见写法是统计某段时间内每种商品的销售数量SELECT gname, SUM(quantity) AS total FROM sale WHERE sale_time BETWEEN 2025-01-01 00:00:00 AND 2025-01-01 23:59:59 GROUP BY gname;如果项目里销售数据是主表和明细表分开存就多一步 join但聚合逻辑不变。实际项目里sale_time字段类型可能是datetime也可能是字符串你拿到手后先DESC sale;看一眼字段类型确认之后再套日期范围。读盘点代码时有个小技巧搜索GROUP BY定位到之后向上看 WHERE就能搞清盘点的时间口径是“当天”“当月”还是“全部”。4.4 库存管理商品表与库存表的数量联动库存模块拆了商品信息、库存信息两块每块都能查、能改。设计上常见的是两张表goods存商品基本信息stock存数量通过商品 id 关联。为什么拆开因为商品名称、价格这类属性跟库存余量是两个维度的数据拆开之后进货和销售各自只改一张表降低锁冲突。进货成功要同步加库存这步逻辑一般写在进货的更新代码里-- 进货成功时按商品id给库存加数量 UPDATE stock SET gnum gnum ? WHERE gid ?;销售成功要减库存只是把换成-。这套逻辑用 SQL 写很简单但它不是原子操作——先加库存再提交事务如果中间出错就可能出现“进货单有了、库存没加上”的脏数据。课设项目数据量小这里不做事务也能交差。但是你可以做一个很小的改进把进货更新和库存更新包进同一个setAutoCommit(false)两条 SQL 执行完再 commit异常就 rollback。这段改动控制在十行以内但读代码的人一眼能看出你懂事务边界。4.5 客户管理用户维护里的删除与改密细节客户管理只有三个动作添加用户、删除用户、修改密码。代码量不大但有两个细节值得琢磨。第一是删除用户之前要不要检查关联数据。如果这个用户已经产生了销售记录直接DELETE FROM user WHERE id?会把历史数据挂成悬空记录。你要么先查sale表里有没有该用户的记录要么删的时候就明确业务规则——“有销售记录的用户不允许删除”这在 delete 之前加一个 count 查询就能实现。第二是修改密码。老项目最常见的写法是直接把新密码明文写进数据库String sql UPDATE user SET password? WHERE id?; ps.setString(1, newPassword); ps.setInt(2, userId); ps.executeUpdate();代码虽然能跑但字段在数据库里是明文。你如果想把这段做成亮点就引入MD5或SHA-256登录校验时把输入密码先加密再比对。改动不涉及页面结构只动处理逻辑但这一处就能让整套系统的安全等级上一个台阶——这是面试时能讲十分钟的改造点。5. 部署避坑端口、驱动、权限、404 与中文乱码的五条血泪记录这一章全部来自实际复现时的踩坑记录每一条我都按“现象 - 原因 - 解决”的格式写清楚。遇到问题先对照现象定位别一上来就重装环境。5.1 现象一Tomcat 启动直接报端口占用现象双击 Tomcat 启动脚本或者从 MyEclipse 里 StartConsole 窗口刷出一片红色异常核心提示类似BindException: Address already in use: JVM_Bind:8080Tomcat 起不来。原因8080 端口已经被其他进程占了。最常见的是之前启动过一次 Tomcat 没关干净残留了 java 进程也可能是其他开发工具如 Nginx、另一个 Tomcat 实例占了 8080。解决先确认是谁占了端口Windows 下用命令行查netstat -ano | findstr 8080最后一列是 PID然后去任务管理器结束对应进程或者用taskkill /PID 进程号 /F强杀。如果这个端口必须留给别的服务用就改 Tomcat 的conf/server.xml把 Connector 的 port 改成 8081访问地址同步改。我一般不改端口直接用taskkill清掉残留进程因为改了端口后面所有访问地址都要跟着变很容易再吃一个 404。5.2 现象二页面 404工程明明部署了现象Tomcat 正常启动首页能打开但访问http://127.0.0.1:8080/supermarket/login.jsp报 HTTP Status 404。原因有两类一是部署名不是 supermarket比如工程导入时被重命名成supermarket_1部署到 Tomcat 后上下文路径也跟着变了二是根本没做 Add and Remove Projects 部署Tomcat 跑去webapps目录找工程找不到自然 404。解决先在部署视图里看项目名。右键 Tomcat -Add and Remove Projects看 Configured 列表里的部署名到底是什么。如果带着后缀就选中项目点 Edit 把 Deployment Name 改成supermarket重新启动。另外确认WebRoot目录下真的存在login.jsp文件——有些压缩包传输出问题JSP 文件损坏部署后访问也是 404。5.3 现象三查询时报 Access denied for user现象登录页能打开输入 admin/admin 一点登录报错信息里出现Access denied for user rootlocalhost (using password: YES)。原因DBO.java 里的 USERNAME 或 PASSWORD 和本地 MySQL 实际账号密码对不上。老项目源码里默认密码五花八门可能是 root、123456、空密码而你本机 MySQL root 密码是另一个值MySQL 服务端直接拒绝连接。解决回到第 3.3 节打开 DBO.java把 PASSWORD 改成你真实密码。注意 MySQL 5.7 默认 root 密码在安装时指定忘记的话要先去改密码改完再回 DBO.java 同步。还有一种小概率情况是 MySQL 服务没启动——注意看报错是Access denied还是Connection refused后者是服务没起来前者才是密码问题。5.4 现象四ClassNotFoundException: com.mysql.jdbc.Driver现象Tomcat 启动时或者页面第一次查数据库时异常栈里出现ClassNotFoundException: com.mysql.jdbc.Driver整个页面被异常堆栈占据或者显示 500。原因MySQL 的 JDBC 驱动 jar 没有进 WEB-INF/lib。老 MyEclipse 项目里驱动引用有两种方式一种是直接把mysql-connector-java-5.1.x.jar放在 WebRoot/WEB-INF/lib 下另一种是在 Build Path 里引用了磁盘上的 jar。第二种方式在发布到 Tomcat 时不会自动拷贝到发布目录运行时 JVM 找不到驱动类于是抛 ClassNotFoundException。解决打开WebRoot/WEB-INF/lib目录看一下有没有驱动 jar。没有就下载mysql-connector-java-5.1.49.jar直接复制进去然后右键工程Refresh。如果有 jar 但仍然报找不到类检查是否只是 Build Path 里引用了磁盘路径把它也加进 lib 目录保证发布后驱动文件在它该在的位置。从那以后我拿到这类老工程的第一件事就是翻 lib 目录确认驱动在不在。5.5 现象五所有中文显示成问号现象登录进系统后职工姓名、供货商名称这些中文数据全部显示成???或者写入数据库后变成乱码。原因三个环节的字符集不统一JSP 页面的 pageEncoding、数据库建库时的字符集、JDBC URL 里的 characterEncoding 参数只要有一个跟其他不一致中文就会在传输或存储时变形。MySQL 5.x 的老实例更敏感如果库表本身建成了 latin1页面和连接改成 UTF-8 也无济于事。解决统一成 UTF-8按顺序排查。JSP 页面头部确认pageEncodingUTF-8JDBC URL 必须带useUnicodetruecharacterEncodingUTF-8数据库通过ALTER DATABASE supermarket CHARACTER SET utf8;修正已经建的表还要逐个转。最简单的方法是删库重新导入jspsupermarket.sql导入前先确认库是 utf8。这一步顺手验证一下浏览器里页面右键查看编码是不是 UTF-8浏览器默认编码如果走了本地系统编码页面也会乱码但那是显示层问题刷新即可。6. 一次完整的验证流程每张表每个按钮都要过一遍系统跑通之后别急着改功能先按表里的顺序做一遍完整验收。这套流程走完环境、数据、代码三条线就都确认过了。顺序操作预期结果1启动 MySQL 服务服务正在运行3306 端口监听2启动 Tomcat启动日志无异常部署成功3访问 login.jsp显示登录框无 4044admin/admin 登录进入主页session 生效5人事管理新增一名职工列表查询能看到新记录6进货管理新增一条进货库存管理里对应商品数量增加7销售管理补一笔销售盘点统计里能看到这笔数量8客户管理修改密码退出后用新密码重新登录每做一步去数据库里看一眼对应表的变化比只看页面结果可靠得多。比如第 5 步之后执行SELECT * FROM emp ORDER BY id DESC LIMIT 1;能看到刚才插入的那条记录。第 6、7 步之后看 stock 表数量的增减能顺带验证库存联动逻辑是否真的生效。这个习惯帮我抓出过不少“页面显示成功、数据库没写进去”的假报错。我原来有个坏习惯拿到源码先急着改代码加功能结果环境没跑通加的代码全成了负担。后来强制自己按上面这张表走一遍每一步确认绿灯再动手从那以后接手这类老 JSP 项目基本半天内就能进到业务层。希望帮到你。本文还有配套的精品资源点击获取