JavaWeb超市管理系统源码部署与Spring Boot迁移实战
简介一份基于JavaWeb的超市管理系统完整项目包面向正在学习JavaWeb开发的初学者及需要课程设计参考的开发者。项目覆盖MVC设计模式、Servlet、JSP、JDBC及数据库管理等核心知识点包含用户登录、商品管理、购物车、订单处理等典型业务模块适合作为实训项目或毕业设计参考。压缩包内含150个文件包括33个Java源代码、66个编译后class、18个JSP页面、19个XML配置、6个JAR依赖库及1个SQL数据库脚本整体大小仅5.08MB目录结构清晰便于直接导入IDE运行调试。已有425人学习使用口碑可参考。通过这份资源学习者可以对照源码深入理解JavaWeb请求处理流程、数据库表设计与JDBC操作掌握从页面展示到业务逻辑的完整实现路径同时可借助SQL脚本快速恢复数据库环境节省搭建时间是实战提升JavaWeb技能的实用资料。1. JavaWeb超市管理系统源码包先搞清你拿到的是什么把「JavaWeb超市管理系统源代码数据库.rar」解压后你通常会看到一堆以.java、.jsp、.xml、.sql结尾的文件外加几个看不懂名字的文件夹。这类源码包在课程设计、毕业设计里出现频率极高技术形态一般是 JSP Servlet JDBC MySQL少数会揉进 MyBatis 或 Spring。它的价值不在于代码写得有多优雅而在于你能在本地把超市的进货、销售、库存、供应商、会员这五条业务线完整跑起来然后沿着它改出自己想要的版本。适合谁适合要交课程设计、正在准备毕设答辩、或者刚学完 JavaWeb 想找一个完整项目练手的人。如果你预期是微服务、高并发、分布式那这个包不是你要的东西。2. 解压后的工程结构把源代码和数据库文件对号入座2.1 源码包的目录布局与三个关键文件拿到压缩包后先别急着丢进 IDE我先按经验把目录认一遍。常见的工程是 Eclipse 或 IDEA 的 Web 项目结构顶层会有src、WebContent或web、lib、database或sql这几个目录。src里放着 Java 源码按包名分层一般是com.xxx.servlet、com.xxx.dao、com.xxx.entity、com.xxx.util。WebContent或web里是 JSP 页面、CSS、JS 和WEB-INF/web.xml。database或sql目录里是我们要重点对待的.sql文件。超市管理系统/ ├── src/ │ ├── com/shop/entity/ # 实体类商品、订单、供应商等 │ ├── com/shop/dao/ # JDBC 数据访问层 │ ├── com/shop/servlet/ # 控制器接收请求、调 DAO、转发 JSP │ ├── com/shop/util/ # 数据库连接工具、字符串工具 │ └── com/shop/filter/ # 登录过滤器、编码过滤器 ├── WebContent/ │ ├── index.jsp │ ├── login.jsp │ ├── admin/ │ ├── css/js/ # 静态资源 │ └── WEB-INF/ │ └── web.xml ├── lib/ # 依赖 jarmysql-connector、jstl 等 ├── database/ │ └── supermarket.sql # 建库建表 初始数据 └── README.txt # 部署说明别忽略第一步先找三个关键文件数据库脚本通常是supermarket.sql或db.sql、数据库连接配置一般在src里的db.properties、DBUtil.java或applicationContext.xml、以及web.xml。把这三个文件的内容先浏览一遍能直接判断出这个项目用的是 JDBC 裸连还是 MyBatis端口配置是多大编码是 UTF-8 还是 GBK。这三个文件里最容易出问题的是数据库连接配置。老项目里常写死jdbc:mysql://localhost:3306/supermarket用户名root密码可能跟你的本地密码不一致。如果你只改 JSP 不改配置项目跑起来会直接报Cannot create PoolableConnectionFactory之类的连接失败错误。所以拿到包的第一步就是搜索3306、root、password这几个关键词把所有连接参数都找出来统一改成你本机的值。2.2 数据库脚本怎么导入从建库到灌数据的完整命令数据库脚本是这个项目的灵魂。超市管理系统的表通常有用户表管理员/收银员、商品表、商品分类表、供应商表、入库单表、销售单表、销售明细表、会员表。看表结构能反推功能边界——如果只有一张商品表加一张用户表那八成是简化版。导入数据库建议用命令行不要用 IDE 的可视化按钮因为老脚本里经常带着USE语句和DELIMITER存储过程可视化工具容易半途报错。我用 MySQL 8.0 为例先把脚本放到一个好找的路径然后打开终端执行mysql -uroot -p -- 输入密码后进入交互式命令行 mysql source /path/to/supermarket.sql; mysql SHOW DATABASES; mysql USE supermarket; mysql SHOW TABLES;source命令会逐行执行脚本里的 SQL 语句包括建库、建表、插入初始数据。执行完SHOW TABLES能看到至少 6 张表才说明导入成功。请注意脚本里如果写了CREATE DATABASE IF NOT EXISTS supermarket DEFAULT CHARACTER SET utf8;你本地就不用手动建库直接 source 即可如果脚本里没有建库语句那你需要先手动执行CREATE DATABASE supermarket DEFAULT CHARSET utf8;再USE supermarket;然后 source。参数说明-uroot表示用户名 root-p表示提示输入密码路径里的空格要用引号包起来或直接拖拽文件到终端。导入后查一下关键表的数据量比如商品表SELECT COUNT(*) FROM goods;如果返回 0可能说明脚本只导了结构没导数据或者插入语句被事务回滚了这时候要回头检查脚本文件里有没有SET AUTOCOMMIT0之类的语句。3. 本地跑通的最小步骤从部署到看到登录页3.1 配置数据库连接找对配置文件改五个参数无论项目是 Eclipse 导出的还是 Maven 风格的数据库配置文件万变不离其宗。最常见的是在src下放一个db.properties内容长这样jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/supermarket?useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456 jdbc.maxActive10这里的四个参数是必改的driver要看你的 MySQL 版本MySQL 5.x 用com.mysql.jdbc.DriverMySQL 8.x 用com.mysql.cj.jdbc.Driverurl里的3306是 MySQL 端口如果你的 MySQL 不是默认端口要改serverTimezoneAsia/Shanghai是 8.x 必须加的时区参数否则会报Server time zone异常username和password必须改成你本地能用的账号密码。有些项目不用 properties 文件直接在DBUtil.java里硬编码这反而更好找。全局搜索DriverManager.getConnection往上几行就是url、user、password三个字符串变量直接改即可。改完先写一个最简测试类验证连接不要急着启动整个 Web 应用。3.2 部署到 Tomcat 并启动两种常见方式的命令与验证把项目变成 Web 应用部署到 Tomcat常见做法有两条路把整个项目目录复制到 Tomcat 的webapps下或者在 IDE 里配置 Tomcat Server 后直接启动。我先说复制部署因为它不依赖 IDE适合你拿到源码包后最快看到效果。# 假设 Tomcat 安装在 /opt/tomcat项目解压目录是 /opt/shop cp -r /opt/shop /opt/tomcat/webapps/Shop cd /opt/tomcat/bin ./startup.sh # 或者 Windows 下执行 startup.bat部署后 Tomcat 会自动解压并加载。打开浏览器访问http://localhost:8080/Shop/如果能看到登录页或首页说明部署成功。注意访问路径里的Shop是 webapps 下的目录名大小写敏感如果你的项目是.war包直接复制 war 到 webapps 让 Tomcat 自动解压即可。在 IDE 里启动的话以 IDEA 为例Run - Edit Configurations - 添加 Tomcat Server - Local然后选择 Deployment 标签页把项目以war exploded方式添加进去。这里有一个很关键的坑老的 Eclipse 项目里可能带了.classpath和.project文件IDEA 导入时会把它当成普通项目依赖的 jar 不一定全部加入编译路径。所以启动前要检查lib目录里的 jar 是否都被引入到 Artifacts 的WEB-INF/lib下否则会出现ClassNotFoundException。验证不是只看页面出来就行要看得更细。打开 Tomcat 的logs/catalina.out或logs/localhost.yyyy-MM-dd.log确认没有报错然后登录系统随便点一个菜单比如进货管理看看列表有没有数据。如果列表空白但没报错优先检查数据库里的初始数据有没有导全。4. JavaWeb超市管理系统运行避坑5个典型部署问题排查4.1 登录页中文乱码页面变成「锟斤拷」的源头现象打开登录页中文全是乱码数据库里的商品名称也变成问号。原因老项目里有三处编码面不一致——页面 JSP 的pageEncoding、Servlet 设置响应的setCharacterEncoding、数据库表结构的DEFAULT CHARSET。只要有一处是 GBK另外两处是 UTF-8就会乱码。解决统一成 UTF-8。JSP 头部改配置文件里的连接 url 加useUnicodetruecharacterEncodingUTF-8数据库表改字符集ALTER TABLE goods CONVERT TO CHARACTER SET utf8mb4;三条一起改缺一条就继续乱。以后如果你改代码在过滤器里写死request.setCharacterEncoding(UTF-8)最省事。4.2 点登录按钮后白屏或 500空指针还是找不到类现象输入正确的账号密码点登录页面一片空白浏览器控制台显示 500Tomcat 日志里有NullPointerException或ClassNotFoundException。原因ClassNotFoundException常见原因是某个 jar 没打包进WEB-INF/libNullPointerException则十有八九是DBUtil.getConnection()返回了 null因为读配置文件路径写错了或者连接参数不对导致静默失败。解决先看异常是哪一行。如果是DBUtil.class.getResource(db.properties)返回 null把配置文件移到src根目录用 classpath 读取如果 jar 缺失把lib下所有 jar 复制到 Tomcat 项目的WEB-INF/lib或者在 IDEA 里右键 lib 目录Add as Library。改完重启再访问看是否恢复。4.3 Tomcat 端口被占用Address already in use现象启动 Tomcat 报Address already in use: JVM_Bind双击 startup.bat 窗口闪退。原因本机已经有别的进程占了 8080 端口常见的是另一个 Tomcat 实例、某个调试中的服务或者被 Oracle 的 HTTP 服务给占了。解决换个端口最省时间。改 Tomcat 的conf/server.xml把Connector port8080改成 8081 或 9090然后重启。如果非要找出占用者Windows 下执行netstat -ano | findstr 8080Linux 下执行lsof -i:8080看到 PID 后到任务管理器或kill -9干掉它。但如果那个进程是 MySQL就不要乱杀乖乖换端口。4.4 MySQL 驱动版本与新数据库不匹配现象启动时日志报java.sql.SQLException: Public Key Retrieval is not allowed或者Communications link failure。原因项目lib里放的是老版 MySQL 驱动5.x而你本地装的是 MySQL 8.x两者握手协议不一样。8.x 驱动默认不允许公钥检索同时老驱动也不认识 8.x 的密码加密方式。解决把lib下的mysql-connector-java换成对应版本的 jar。如果项目用的纯 JDBC直接替换 jar 即可如果是 Maven 项目在pom.xml里把版本号改成8.0.33或更高然后 Maven Reload。换完后我还建议顺手在连接 url 里加两个参数allowPublicKeyRetrievaltrueuseSSLfalse这两个参数能省掉大部分疑难杂症。4.5 商品增删改查失效点击删除没反应数据却没动现象页面能正常打开商品列表也能显示但点删除、修改浏览器没反应或者报 405、500。查看日志发现HTTP Status 500 - All statements are not closed之类的提示。原因这种老项目里 Servlet 和 JSP 之间用 form 表单提交但路径写成了死路径比如/Shop/goodsServlet?actiondelete而你的项目部署名不叫 Shop导致 404 或 405还有一种是 DAO 层用了Statement没有正确关闭连接数据库连接池耗尽后新操作全部阻塞。解决先检查页面里所有 action 路径用相对路径goodsServlet?actionxxx或加上${pageContext.request.contextPath}。再看 DAO 里是否把连接、Statement、ResultSet 在 finally 里都关闭了。老代码经常只在成功路径里 close异常路径直接跳过这属于必改项。改完后重启再进商品管理点一遍增删改查确认没问题再往下做。5. 代码吃透后怎么做把老 JSP 项目往 Spring Boot 迁移5.1 先抽出业务逻辑找到三块核心资产如果你打算把这个系统作为毕设或工作作品建议不要在 JSP 老骨架上缝缝补补而是把它迁移成 Spring Boot 工程。但别上来就重写先做减法把原项目的entity、dao、servlet抽出来按 MVC 三层整理成一张清单。常见超市系统的核心逻辑其实就三块登录鉴权、进货入库形成库存、销售出库减库存并记录流水。这三块的 SQL 语句是精华迁移时直接复用但要把散落在 JSP 里的if判断和数据拼装挪到 Service 层。抽逻辑的方法是每个 Servlet 里的doGet/doPost对应 Spring Boot 里的一个 Controller 方法原来response.sendRedirect和request.getRequestDispatcher().forward的地方改成返回RedirectView或直接返回视图名原来 DAO 里用PreparedStatement拼出来的 SQL整理成 MyBatis 的 mapper XML 或 JPA 的注解。这一步不牵涉业务改动只是代码搬运。5.2 用 Spring Boot 重写接口一个最小可跑通的改造样例迁移最适合用增量式先把登录模块迁过去跑通再迁下一个。下面是我给某开发者改造时常用的最小骨架核心是保留原 SQL换掉数据库访问方式。// GoodsController.java RestController RequestMapping(/api/goods) public class GoodsController { Autowired private GoodsService goodsService; GetMapping(/list) public Result list(RequestParam(defaultValue 1) int page) { ListGoods list goodsService.queryByPage(page, 10); return Result.success(list, list.size()); } }// GoodsMapper.java (MyBatis 接口) Mapper public interface GoodsMapper { Select(SELECT * FROM goods LIMIT #{offset}, #{limit}) ListGoods selectPage(Param(offset) int offset, Param(limit) int limit); }参数说明page是页码limit每页条数SQL 里LIMIT #{offset}, #{limit}是老 MySQL 分页写法offset 用(page-1)*limit计算。改用 MyBatis 后原来 DAO 里繁琐的try/catch/finally和资源关闭全部消失连接管理交给框架。但你要注意原 SQL 如果带?占位符替换成#{}是安全的如果原来是字符串拼接出来的必须改掉否则会保留 SQL 注入风险这是迁移时最容易照搬的坏习惯。5.3 数据库迁移注意事项字段命名与数据类型的三处坑老项目的表结构是给 JSP 用的字段命名比较随意比如g_name、g_price还有小数的float类型。迁移到现代框架时有三处坑第一主键类型。老表常用INT自增如果数据量不大没问题但建议改成BIGINT以免将来溢出第二时间字段。老项目用DATE或VARCHAR存时间统一改成DATETIME或TIMESTAMP否则排序和格式化都会出问题第三删除标记。老系统直接物理删除DELETE FROM goods WHERE id?这会让历史订单和销售明细变成孤儿数据迁移时应该加一个is_deleted字段把物理删除改成逻辑删除。迁移完成后不能只测登录。把进货、销售、库存查询、会员积分这几条主链路按顺序走一遍每走一步对比一下老系统页面上的数据比如库存数量、销售总额。我见过迁移完商品列表对得上但进货单关联的商品名全变 null 的情况多半是原表外键字段类型不一致导致的连接问题。6. 验收时让系统加分的三个细节从能用到像样当你把超市管理系统跑通后别急着交差。站在答辩或演示的角度有三个细节能快速提升完成度。第一个细节是数据回滚测试。在商品管理里连续插入、删除、修改几条记录然后去数据库看一眼goods表确认记录状态和你操作一致。如果能找到销售模块做一次「销售 10 件商品后库存减少 10」的验证这就是评委最喜欢问的业务闭环。第二个细节是统一异常响应。老 JSP 项目报错时会直接跳到一堆看不懂的英文错误页你可以加一个全局异常处理器把 400、500、404 分别映射成友好的中文提示页这个动作成本极低但会让系统看起来专业很多。第三个细节是操作日志。在登录、进货、销售这几个关键动作上埋点写入一张operation_log表记录操作人、操作时间、操作内容。答辩时展示这张表比口头解释系统功能直观得多。我自己的习惯是拿到这种源码包先花半小时看数据库脚本再花半小时看DBUtil和登录 Servlet这两处决定了整个系统能不能跑。把编码统一、连接池配好、路径改对剩下的功能模块大都是同一个套路。如果你打算在这个基础上做毕设记住一点别贪多模块把超市的核心闭环——进货、销售、库存、账单——做扎实比堆一堆只读不写的花哨页面有说服力得多。希望这个思路能帮到你也祝你把这份源码包消化成属于自己的作品。本文还有配套的精品资源点击获取