简介:面向Java Web初学者与毕业设计选题学生,这份网上商城系统源码以JSP+Servlet+MySQL构建了一个可直接运行的电商项目,完整覆盖用户注册登录、商品分类搜索、购物车管理、订单状态追踪等核心流程,采用MVC分层架构将页面显示、业务逻辑与数据访问分离,便于读者理解请求—处理—响应的Web开发主线。压缩包整体约2.2MB,主要文件类型为JSP视图页面、Java后台类、JDBC工具类及SQL数据库脚本,导入开发工具即可启动测试。目前已有56人学习,适合用来拆解JSP内置对象、会话保持、动态SQL查询和事务控制等关键知识点。代码中涉及防SQL注入、连接池配置、订单状态机等实践细节,能帮助读者建立从数据库设计到前端交互的完整思路,稍作修改即可适配课程设计、毕业设计或小型电商项目二次开发。
1. 网上商城系统(JSP+MySQL)源码包:先认清结构再动手
如果你下载过这类 JSP 课程设计源码,大概率见过这样一个压缩包:里面是一个完整的 Eclipse 工程目录,带着src、WebRoot(或web)、SQL文件夹,名字就叫“网上商城系统(JSP+MYSQL).zip”。这类项目在网上流传极广,是很多计算机专业学生做 JavaWeb 课设、毕业设计的第一手素材。它的技术栈不算新——Servlet + JSP + JDBC + MySQL,但贵在完整:有前台购物流程、后台商品管理、用户注册登录,甚至订单处理。这篇笔记会把这个源码包从头到尾拆清楚:本地怎么跑起来、数据库怎么导、代码去哪改、哪些地方一做一个坑。适合三类人:急着交课设的学生、想拿现成项目学 JSP+MYSQL 整合的初学者,以及需要快速出一个 JavaWeb demo 做内部演示的开发者。
2. 本地跑通的最小环境:JDK、Tomcat、MySQL 的版本匹配
拿到源码包第一件事不是急着导入 IDE,而是先核对本机环境。这类老项目的通病是:代码基于 JDK 1.6/1.7 写法,数据库脚本用 MySQL 5.x 导出,而你现在电脑上装的可能是 JDK 17 和 MySQL 8.4。版本不匹配会导致一连串诡异报错——有时是 Tomcat 启动失败,有时是数据库连接被拒,有时干脆编译期就挂。
2.1 版本对照与选择建议
先看下面这张表,这是这类 JSP+MYSQL 老项目最常见的环境组合:
| 组件 | 兼容版本 | 说明 |
|---|---|---|
| JDK | 1.8(8u202 及之前) | 不建议用 JDK 11+,老代码里的 JAXB、java.se 模块问题会让你多折腾一天 |
| Tomcat | 8.5.x | 支持 Servlet 3.1,对老 web.xml 兼容性最好;Tomcat 9 也能跑但要看 servlet-api 版本 |
| MySQL | 5.7 / 8.0 | 5.7 最稳;8.0 需要改驱动和连接串参数,下文会讲 |
| Eclipse | 2020-06 及之后版本 | 太老的 Eclipse 对新版 JDK 支持差;新版对老项目兼容没问题 |
| MySQL 驱动 | mysql-connector-java 5.1.49 | 如果数据库是 8.0,要用 8.0.x 驱动 |
我一般建议直接用 JDK 8 + Tomcat 8.5 + MySQL 5.7 的组合,翻车概率最低。你可能会问:MySQL 8.4 LTS 不是更好的选择吗?对老代码来说不是。这个源码包里 JDBC 连接串通常长这样:
private static final String URL = "jdbc:mysql://localhost:3306/shop"; private static final String USER = "root"; private static final String PASSWORD = "123456";注意看,URL 里没带useSSL=false、serverTimezone=Asia/Shanghai这些参数。MySQL 5.7 对此无所谓,但 8.0 以上时区校验严格,不带时区参数会直接报The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized。所以要么你切 5.7,要么动手改连接串。
2.2 环境安装与验证命令
环境安装有两种路径。第一种是去官网下载 JDK 8、Tomcat 8.5、MySQL 5.7 的 zip 包手动配置;第二种是用包管理器(Windows 上用 chocolatey,macOS 上用 brew),但国内网络环境下下载速度不稳定。这里给出手动配置的可复现步骤。
先装 JDK 8,设置环境变量:
# Windows 环境变量设置(命令行临时生效,重启后失效,建议去系统属性里配) set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_202 set PATH=%JAVA_HOME%\bin;%PATH% # 验证 java -version javac -version注意:如果是给课设老师演示,
java -version输出必须是 1.8 开头。如果输出类似openjdk version "17.0.5",说明 PATH 里排在前面的还是新 JDK,去系统环境变量里把旧 JDK 的路径挪到最前面,或者删掉新的。
Tomcat 8.5 解压后不需要安装,重点是把CATALINA_HOME指过去。验证 Tomcat 能启动:
# 进入 Tomcat bin 目录,Windows 下执行 startup.bat # 看到 "Server startup in [xxx] milliseconds" 说明启动成功 # 浏览器访问 http://localhost:8080/ 能看到 Tomcat 首页MySQL 5.7 的安装走 zip 解压方案比较省心。下载mysql-5.7.44-winx64.zip后解压,在根目录建my.ini:
[mysqld] basedir=D:/tool/mysql-5.7.44-winx64 datadir=D:/tool/mysql-5.7.44-winx64/data port=3306 character-set-server=utf8mb4 # 注意:MySQL 5.7.44 是 5.7 系列的最终版本之一,官方后来没继续发 5.7.45,是因为 5.7 进入了 extended support 阶段然后以管理员身份打开 CMD 执行:
mysqld --initialize-insecure net start mysql--initialize-insecure会生成一个 data 目录,root 用户密码为空。启动服务后先改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; FLUSH PRIVILEGES;到这里,三件套就绪。有一个很容易被忽略的细节:老代码里 JDBC 驱动的加载方式是Class.forName("com.mysql.jdbc.Driver"),MySQL 8.0 驱动已经把这个类移到了com.mysql.cj.jdbc.Driver,如果你用了 8.0 驱动又没改代码,运行时会抛ClassNotFoundException。这属于典型的“环境不兼容”问题,后面避坑章还会展开。
2.3 IDEA / Eclipse 导入源码的具体操作
很多学生会在这个环节卡住。源码包解压后是 Eclipse 工程结构(有.classpath和.project文件),但你现在用的是 IDEA。导入方式有两种,常见做法是:
IDEA 里选File -> New -> Project from Existing Sources,选中解压后的根目录,然后一路 Next。IDEA 会自动识别 Eclipse 的工程文件,把目录结构转换过来。转换完成后需要检查三处:
一是Project Structure -> Project里 SDK 是否指向 JDK 8;二是Project Structure -> Modules -> Dependencies里是否已经把WebRoot/WEB-INF/lib下的 jar 包加进去了;三是Project Structure -> Facets -> Web里 Web 根目录是否正确指到了WebRoot(而不是web)。这三处任何一处不对,跑起来要么报ClassNotFoundException: com.mysql.jdbc.Driver,要么报 404。
如果是 Eclipse 导入,就没有转换问题,直接File -> Import -> General -> Existing Projects into Workspace就行。但 Eclipse 需要确认Window -> Preferences -> Server -> Runtime Environments里已经把 Tomcat 8.5 关联进来,否则项目上右键没有Run on Server选项。
3. 数据库导入:SQL 脚本不是双击就完事
源码包里几乎一定会带一个shop.sql或mall.sql文件,有些还带多个.sql文件,分成表结构、初始数据、存储过程三份。很多人用 Navicat 双击导入,然后项目跑起来一看——中文乱码、缺表、登录提示密码错误,问题一大堆。SQL 脚本导入这件事,听起来简单,实际上有一堆门道。
3.1 先看 SQL 脚本的编码和表前缀
打开 SQL 文件之前,先用 Notepad++ 或 VS Code 看它的编码格式。这类源码的 SQL 文件常见两种编码:UTF-8 和 GBK。如果文件是 GBK 编码,而你用 Navicat 默认的 UTF-8 导入,中文字段值(比如商品名称、分类名称)全部会变成乱码;反过来也一样。
判断方法很直接:看文件开头有没有SET NAMES utf8或SET NAMES gbk。有SET NAMES utf8说明脚本是在 UTF-8 会话下导出的,导入时也设置成 UTF-8;没有的话,看 INSERT 语句里的中文还能不能辨认。更稳妥的做法是统一转成 UTF-8 再导入。VS Code 右下角点编码,选择“通过编码重新打开”,改成 UTF-8 保存即可。
还有一个容易忽略的点:表前缀。很多老项目喜欢给表加前缀,比如t_、shop_、sys_。如果你打算把这份商城系统的表并到你自己的数据库里,前缀冲突是个隐患。看到CREATE TABLE t_user这类语句,就明白这项目里所有表都是t_开头。
3.2 命令行导入的正确姿势
使用命令行导入能更好地控制编码和错误输出。Windows 下先切到 MySQL 的 bin 目录,然后执行:
mysql -u root -p123456 --default-character-set=utf8mb4 < D:/download/shop.sql这条命令的逻辑是:用 root 用户连接本机 MySQL,指定--default-character-set=utf8mb4让会话使用 UTF-8 编码,然后把shop.sql文件的内容重定向给 mysql 客户端执行。执行后没有输出就是成功;如果报错会在终端直接打出来。
参数说明:
-p123456:密码直接写在后面,和-p之间不能有空格;不想明文写在命令行上就只写-p,回车后交互输入。--default-character-set=utf8mb4:这是防止乱码的关键参数。它告诉 MySQL 客户端“发过来的字节流按 utf8mb4 解析”。如果你的数据库字符集本身是 utf8(不是 utf8mb4),用utf8也行;但 utf8mb4 是 utf8 的超集,兼容性更好。- 文件路径里的反斜杠:Windows 下用
< D:/download/shop.sql的斜杠写法最稳,避免\d被转义的问题。
执行完之后,进入数据库验证:
USE shop; SHOW TABLES; SELECT COUNT(*) FROM t_user;第一条命令切换数据库,第二条看表是否全部创建成功,第三条查用户表的记录数——如果源码包里附带测试账号,这一步能确认初始数据有没有灌进去。
3.3 缺少数据库 / 缺少用户表的典型场景
有一种很常见的翻车场景:SQL 文件开头没有CREATE DATABASE语句,只有CREATE TABLE。这意味着你导入之前得先手动建库。如果你直接执行,MySQL 会报No database selected。
解决方法是先建库再导入:
CREATE DATABASE IF NOT EXISTS shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE shop; SOURCE D:/download/shop.sql;SOURCE是 MySQL 客户端的内部命令,效果和命令行重定向是一样的。这里有个细节:COLLATE utf8mb4_general_ci里的ci是 case-insensitive,即排序规则不区分大小写。如果你以后要在这个表上做模糊搜索,utf8mb4_general_ci的排序行为对中文和英文搜索都够用,不用折腾成utf8mb4_unicode_ci。
导入成功后还有个检查项:看有没有存储过程、触发器、视图。老源码包里如果有DELIMITER $$这种写法,说明里面有存储过程。存储过程的导入能在一个 SQL 文件里DELIMITER切换分隔符,只要你用mysql客户端执行就不会有问题;但用 Navicat 的“运行 SQL 文件”有时会在$$处截断,这也是我推荐命令行导入的原因。
4. 读懂代码结构:前后台两条链路的改动入口
数据库搞定后,代码层面要知道“改哪里”才能应对课设要求。网上商城系统(JSP+MYSQL)的源码结构基本雷同:前台面向访客,后台面向管理员,中间靠 Session 和权限判断串联。把这条链路捋顺,你就能在答辩时讲清楚任何一处改动的理由。
4.1 包结构与核心类职责
解压源码包后,src目录下一般是这样的包结构(不同版本略有差异,但思路一致):
| 包名 | 核心类 | 职责 |
|---|---|---|
com.xxx.dao | UserDao、GoodsDao、OrderDao | JDBC 数据访问,负责拼 SQL、执行、封装结果集 |
com.xxx.service | UserService、GoodsService | 业务逻辑层,调用 DAO,处理事务 |
com.xxx.servlet | LoginServlet、RegisterServlet、CartServlet | 控制器层,接收 HTTP 请求,调 Service,转发跳转 |
com.xxx.entity | User、Goods、Order | 实体类,字段对应数据库表 |
com.xxx.util | DBUtil | 数据库连接工具类,持有 JDBC 连接参数 |
com.xxx.filter | LoginFilter | 过滤器,做登录状态校验 |
你拿到源码后第一个要打开的文件是DBUtil.java,因为这里写死了数据库连接信息。常见做法是:
public class DBUtil { private static final String URL = "jdbc:mysql://localhost:3306/shop?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai"; private static final String USER = "root"; private static final String PASSWORD = "123456"; static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } }注意这里的URL我加了一串参数:useSSL=false关掉 SSL 握手(MySQL 8.0 默认开 SSL,老代码没开启握手时偶尔会警告),useUnicode=true&characterEncoding=utf8保证中文传输不乱码,serverTimezone=Asia/Shanghai解决时区报错。如果你的源码里没有这些参数,改成这样再跑。
参数说明:
useSSL=false:MySQL 8.0 默认启用 SSL 连接,老驱动在握手时可能报Communications link failure;显式关掉后连接建立速度也会快一点。characterEncoding=utf8:字符集参数,保证?name=中文这样的 GET 请求参数到后端不乱码。注意数据库连接的字符集和页面JSP pageEncoding要一致。serverTimezone=Asia/Shanghai:MySQL 8.0 不给时区参数直接抛异常,这就是前面说的版本坑。Class.forName("com.mysql.jdbc.Driver")这行:如果换用 MySQL 8.0 驱动,要改成com.mysql.cj.jdbc.Driver。5.1.49 驱动向下兼容,所以 5.7 数据库用 5.1.49 驱动最稳。
4.2 前台购物流程:从商品列表到订单落地
前台的链路一般是:用户访问index.jsp-> 点击商品进入goods_detail.jsp-> 点击“加入购物车”请求CartServlet-> 购物车页面结算生成订单。看源码时建议从web.xml的 servlet 映射开始反推,因为老项目里的 servlet 路径通常是.do或/servlet/xxx这种格式。
<servlet> <servlet-name>CartServlet</servlet-name> <servlet-class>com.xxx.servlet.CartServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CartServlet</servlet-name> <url-pattern>/cart.do</url-pattern> </servlet-mapping>这段配置在web.xml里。它的作用是把/cart.do这个 URL 请求路由到CartServlet类的doGet/doPost方法。改前端页面时,如果你不知道表单提交到哪里,就找<form action="cart.do">里的 action 属性,然后到web.xml里反查 servlet。
Servlet 里处理完业务后,常见做法是用request.getRequestDispatcher("cart.jsp").forward(request, response)转发回页面。这里有个容易搞混的概念:forward比sendRedirect多携带了request对象里的属性,所以 JSP 页面能直接通过${cartList}这种 EL 表达式拿到数据。如果你改代码时把转发改成了重定向,页面会突然拿不到数据。这是很多新手在调试时百思不得其解的点。
4.3 后台管理链路:权限拦截与商品 CRUD
后台链路一般以admin开头,进入后台前会经过过滤器(Filter)校验管理员 Session。看这段代码就知道权限控制的套路:
public class AdminFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpSession session = request.getSession(); Object admin = session.getAttribute("admin"); if (admin == null) { request.getRequestDispatcher("admin/login.jsp").forward(request, response); return; } chain.doFilter(req, resp); } }这段过滤器的逻辑是:从 Session 里拿admin属性,拿不到就转发到后台登录页,拿到了就放行继续执行后面的 Servlet。很多商城源码会配两份过滤器——一份拦前台用户,一份拦后台管理员。你在答辩时能讲清楚“为什么后台不能用前台用户的登录状态”这个点,评委印象分会高不少。
商品 CRUD 是后台操作最频繁的部分。新增商品的 Servlet 流程一般是:接收表单参数 -> 调用GoodsService.addGoods()-> 内部调用GoodsDao.addGoods()-> 重定向回商品列表页。这里注意,老项目里图片上传通常不是真正的文件上传,而是让你在表单里填一个图片 URL。如果你买的源码带“图片上传”功能,才需要引入commons-fileupload包;没有的话,改商品图片最直接的方式是改 JSP 里<img src="...">的路径。
5. 常见问题避坑:部署与运行中的 6 条血泪经验
JSP+MYSQL 老项目跑不起来的原因,翻来覆去就那么几个。下面每一条都是真实踩过的坑,按“现象 -> 原因 -> 解决”的顺序写清楚。
5.1 Tomcat 启动失败:端口被占用
现象:startup.bat执行后黑色窗口一闪而过,日志里能看到Port 8080 required by Tomcat v8.5 Server at localhost is already in use。
原因:本机某个进程已经占了 8080 端口,常见的是之前启动过的 Tomcat 没关干净、或者其它 Web 服务(比如 Nginx、Apache)在监听这个端口。老项目默认端口都是 8080,几乎没有例外。
解决:先查占用进程,再换端口或杀进程。
netstat -ano | findstr 8080看最后一列 PID,然后:
taskkill /PID 端口对应的进程号 /F如果你不想杀进程,改 Tomcat 端口也行。打开 Tomcat 安装目录conf/server.xml,找到<Connector port="8080" ... />改成8081,然后重启 Tomcat。这里有个连带操作:项目里 JSP 写死了跳转 8080 的绝对路径的话,端口一改全部跳转失效。老源码里基本不会这么写,但如果出现改完端口后点击页面按钮无反应,回 JSP 里搜8080关键字,把硬编码地址替换成${pageContext.request.contextPath}动态拼接。
5.2 数据库连不上:Access denied for user
现象:启动项目后访问首页正常,但点“登录”时报Access denied for user 'root'@'localhost' (using password: YES)。
原因:DBUtil.java里写死的用户名密码和本机 MySQL 的实际密码不一致。源码包里 DBUtil 里写的是123456,你自己安装时设了别的密码,或者根本没给 root 设密码。
解决:两种修法。一是改DBUtil.java里的密码变量对准本机;二是改 MySQL 的 root 密码对准代码。课设场景下建议直接改代码,因为密码字段大概率还要拿给老师看。改完记得重新编译部署,只改源码不重启 Tomcat 的话等于没改。
5.3 中文乱码:页面和数据库双重编码没对齐
现象:前台商品名称是问号或???,后台管理员名字全部变乱码。个别页面打开是正常的,某些页面全乱。
原因:三层编码不一致——页面 JSP 的pageEncoding、MySQL 表的字符集、JDBC 连接串的characterEncoding至少有一层和另外两层对不上。老源码里最容易出问题的是 JSP 顶部声明:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>如果这行写成charset=GBK而数据库是utf8,必然乱码。还有 GET 请求的中文参数,Tomcat 8.5 默认已经对 GET 的 URI 做 UTF-8 解码,但老源码里加了自己的CharacterEncodingFilter只处理 POST——你改参数时就要自己确认过滤器范围和顺序。
解决:统一三处编码。数据库表如果已经建好且数据乱码,先ALTER TABLE t_goods CONVERT TO CHARACTER SET utf8mb4;把表字符集改过来,再重导数据。乱码数据的“后悔药”是重新导入 SQL 文件,不要试图用 SQL 语句在乱码基础上修复,基本修不干净。
5.4 404 错误:项目部署名与访问路径不匹配
现象:Tomcat 起来了,但访问http://localhost:8080/看到的是 Tomcat 首页,没有你的项目入口;或者访问http://localhost:8080/shop/index.jsp报 404。
原因:项目没有部署到 Tomcat 的webapps目录下,或者 IDEA/Eclipse 里部署名不是shop。Eclipse 的Run on Server默认部署名取自项目名;IDEA 的Application context在Run/Debug Configurations -> Deployment里设置。
解决:直接手动把整个项目复制一份到webapps目录下是最稳妥的兜底方案。但要注意:老项目如果用了 Eclipse 的.settings配置,复制到 webapps 后要确认WEB-INF/classes下确实有编译好的.class文件。没有的话,用javac手动编译很容易漏依赖,还是建议回到 IDE 里跑。IDEA 用户直接检查 Deployment 里的 Application context 是否为/shop。
5.5 MySQL 8.0 驱动与老代码的兼容:ClassNotFoundException
现象:Tomcat 启动时控制台打印java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,项目所有数据库操作全部报错。
原因:你本机装的 MySQL 8.0,然后把 8.0 的驱动 jar 包放进WEB-INF/lib,但代码里Class.forName("com.mysql.jdbc.Driver")还在用老类名。MySQL 8.0 驱动把老类移到com.mysql.cj.jdbc.Driver。
解决:两选一。要么在WEB-INF/lib里换成mysql-connector-java-5.1.49.jar(跟 5.7、8.0 数据库都兼容),要么把DBUtil.java里Class.forName的参数改成新类名。我倾向于换 5.1.49 驱动,省事且对老代码的兼容性最好。
5.6 JSP 编译错误:无法导入 javax.servlet 包
现象:项目里有大量 JSP 文件报红,提示The import javax.servlet cannot be resolved。
原因:构建路径里没有加 Tomcat 的servlet-api.jar。这个 jar 在 Tomcat 安装目录的lib文件夹下,但它不属于你的业务代码依赖,而是 Tomcat 运行时的容器类库。Eclipse 里如果在Run on Server模式下运行,容器会自动提供;但你对项目做 Build Path 调整、或者用 IDEA 以非 Web 方式导入时,不会自动带上。
解决:IDEA 里File -> Project Structure -> Libraries添加 Tomcat 目录下的servlet-api.jar;Eclipse 里右键项目Build Path -> Configure Build Path -> Add External JARs同样指向这个文件。注意不要把这个 jar 复制进WEB-INF/lib,放进去了反而可能和 Tomcat 自带的产生冲突,出现诡异的ClassCastException。
6. 从课设到可演示:改端口、换主题、加日志的三个动作
源码跑通只是第一步,真正要让老师在演示时眼前一亮,或者让你自己真正吃透这套代码,还得做三个小改造。这三个动作都能验证你对前面内容的理解程度,也是面试讲项目时可以说出口的细节。
第一个动作是改项目名的访问路径。默认情况下,http://localhost:8080/shop/这个路径里的shop是部署名。IDEA 里改 Deployment 的 Application context 为根路径/,你就能用http://localhost:8080/直接访问首页。演示时少敲几个字符是小事,但给人的感觉是“这个项目就是长在这个服务器上的”,而不是“这是个临时跑起来的课设”。改完之后记得重启 Tomcat,否则部署名不生效。
第二个动作是给商品图片换成本地路径。老源码里的商品图片通常引用外链或项目内的固定目录。如果你要演示,图片加载失败会非常尴尬。常见做法是在WebRoot下建一个uploads目录,把要展示的图片丢进去,然后修改商品表里的图片路径,或者直接改 JSP:
<img src="${pageContext.request.contextPath}/uploads/phone1.jpg" width="200" height="200" alt="商品图片">这里pageContext.request.contextPath是 JSP 内置对象,动态输出项目部署路径。即使你把部署名从shop改成别的,图片路径也不会断。这比你手写<img src="/shop/uploads/phone1.jpg">要稳得多——后者在部署名变更时必然 404。
第三个动作是给DBUtil加一句日志输出。老项目的DBUtil在数据库连接失败时通常只printStackTrace(),这些堆栈信息打在哪里你根本不知道。加日志不是让你引日志框架,而是用一个最土的办法:
public static Connection getConnection() throws SQLException { long start = System.currentTimeMillis(); Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); System.out.println("[DBUtil] 连接建立成功, 耗时: " + (System.currentTimeMillis() - start) + "ms"); return conn; }这样做的好处是:你在 IDEA 控制台里能直接看到每次数据库操作的耗时。演示时如果页面卡顿,控制台里这行日志能告诉你瓶颈是不是在数据库连接上——这是直接能说出口的排障思路。不用引 Log4j,不破坏老代码结构,三分钟搞定。
这三个改动做完,你对这套 JSP+MYSQL 商城系统的掌握程度,已经从“能跑起来”升级到“能说清楚每一个环节在干嘛”。我自己的习惯是拿到这类源码后,先从DBUtil.java和web.xml两个文件反向画一遍请求流程图,再动手改代码。这个习惯帮我避免了很多“觉得改完没问题、一运行就翻车”的情况。希望帮到你。
最后提一个细节:课设答辩之前,把 MySQL 服务设为手动启动、把 Tomcat 的端口固定住、关掉电脑的自动睡眠。很多人的项目本来跑得好好的,演示时因为服务没起来或系统休眠导致连接中断,当场翻车。提前把部署环境固化为一套检查清单,比你临时去改代码靠谱得多。
本文还有配套的精品资源,点击获取