资讯动态

JSP+MySQL网上商城系统部署指南:从环境配置到避坑实践

发布时间:2026/10/26 7:28:13 来源:尧图企业网站定制
简介面向Java Web初学者与毕业设计选题学生这份网上商城系统源码以JSPServletMySQL构建了一个可直接运行的电商项目完整覆盖用户注册登录、商品分类搜索、购物车管理、订单状态追踪等核心流程采用MVC分层架构将页面显示、业务逻辑与数据访问分离便于读者理解请求—处理—响应的Web开发主线。压缩包整体约2.2MB主要文件类型为JSP视图页面、Java后台类、JDBC工具类及SQL数据库脚本导入开发工具即可启动测试。目前已有56人学习适合用来拆解JSP内置对象、会话保持、动态SQL查询和事务控制等关键知识点。代码中涉及防SQL注入、连接池配置、订单状态机等实践细节能帮助读者建立从数据库设计到前端交互的完整思路稍作修改即可适配课程设计、毕业设计或小型电商项目二次开发。1. 网上商城系统JSPMySQL源码包先认清结构再动手如果你下载过这类 JSP 课程设计源码大概率见过这样一个压缩包里面是一个完整的 Eclipse 工程目录带着src、WebRoot或web、SQL文件夹名字就叫“网上商城系统(JSPMYSQL).zip”。这类项目在网上流传极广是很多计算机专业学生做 JavaWeb 课设、毕业设计的第一手素材。它的技术栈不算新——Servlet JSP JDBC MySQL但贵在完整有前台购物流程、后台商品管理、用户注册登录甚至订单处理。这篇笔记会把这个源码包从头到尾拆清楚本地怎么跑起来、数据库怎么导、代码去哪改、哪些地方一做一个坑。适合三类人急着交课设的学生、想拿现成项目学 JSPMYSQL 整合的初学者以及需要快速出一个 JavaWeb demo 做内部演示的开发者。2. 本地跑通的最小环境JDK、Tomcat、MySQL 的版本匹配拿到源码包第一件事不是急着导入 IDE而是先核对本机环境。这类老项目的通病是代码基于 JDK 1.6/1.7 写法数据库脚本用 MySQL 5.x 导出而你现在电脑上装的可能是 JDK 17 和 MySQL 8.4。版本不匹配会导致一连串诡异报错——有时是 Tomcat 启动失败有时是数据库连接被拒有时干脆编译期就挂。2.1 版本对照与选择建议先看下面这张表这是这类 JSPMYSQL 老项目最常见的环境组合组件兼容版本说明JDK1.88u202 及之前不建议用 JDK 11老代码里的 JAXB、java.se 模块问题会让你多折腾一天Tomcat8.5.x支持 Servlet 3.1对老 web.xml 兼容性最好Tomcat 9 也能跑但要看 servlet-api 版本MySQL5.7 / 8.05.7 最稳8.0 需要改驱动和连接串参数下文会讲Eclipse2020-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 里没带useSSLfalse、serverTimezoneAsia/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 上用 chocolateymacOS 上用 brew但国内网络环境下下载速度不稳定。这里给出手动配置的可复现步骤。先装 JDK 8设置环境变量# Windows 环境变量设置命令行临时生效重启后失效建议去系统属性里配 set JAVA_HOMEC:\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] basedirD:/tool/mysql-5.7.44-winx64 datadirD:/tool/mysql-5.7.44-winx64/data port3306 character-set-serverutf8mb4 # 注意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 rootlocalhost 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-setutf8mb4 D:/download/shop.sql这条命令的逻辑是用 root 用户连接本机 MySQL指定--default-character-setutf8mb4让会话使用 UTF-8 编码然后把shop.sql文件的内容重定向给 mysql 客户端执行。执行后没有输出就是成功如果报错会在终端直接打出来。参数说明-p123456密码直接写在后面和-p之间不能有空格不想明文写在命令行上就只写-p回车后交互输入。--default-character-setutf8mb4这是防止乱码的关键参数。它告诉 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. 读懂代码结构前后台两条链路的改动入口数据库搞定后代码层面要知道“改哪里”才能应对课设要求。网上商城系统JSPMYSQL的源码结构基本雷同前台面向访客后台面向管理员中间靠 Session 和权限判断串联。把这条链路捋顺你就能在答辩时讲清楚任何一处改动的理由。4.1 包结构与核心类职责解压源码包后src目录下一般是这样的包结构不同版本略有差异但思路一致包名核心类职责com.xxx.daoUserDao、GoodsDao、OrderDaoJDBC 数据访问负责拼 SQL、执行、封装结果集com.xxx.serviceUserService、GoodsService业务逻辑层调用 DAO处理事务com.xxx.servletLoginServlet、RegisterServlet、CartServlet控制器层接收 HTTP 请求调 Service转发跳转com.xxx.entityUser、Goods、Order实体类字段对应数据库表com.xxx.utilDBUtil数据库连接工具类持有 JDBC 连接参数com.xxx.filterLoginFilter过滤器做登录状态校验你拿到源码后第一个要打开的文件是DBUtil.java因为这里写死了数据库连接信息。常见做法是public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/shop?useSSLfalseuseUnicodetruecharacterEncodingutf8serverTimezoneAsia/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我加了一串参数useSSLfalse关掉 SSL 握手MySQL 8.0 默认开 SSL老代码没开启握手时偶尔会警告useUnicodetruecharacterEncodingutf8保证中文传输不乱码serverTimezoneAsia/Shanghai解决时区报错。如果你的源码里没有这些参数改成这样再跑。参数说明useSSLfalseMySQL 8.0 默认启用 SSL 连接老驱动在握手时可能报Communications link failure显式关掉后连接建立速度也会快一点。characterEncodingutf8字符集参数保证?name中文这样的 GET 请求参数到后端不乱码。注意数据库连接的字符集和页面JSP pageEncoding要一致。serverTimezoneAsia/ShanghaiMySQL 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-nameCartServlet/servlet-name servlet-classcom.xxx.servlet.CartServlet/servlet-class /servlet servlet-mapping servlet-nameCartServlet/servlet-name url-pattern/cart.do/url-pattern /servlet-mapping这段配置在web.xml里。它的作用是把/cart.do这个 URL 请求路由到CartServlet类的doGet/doPost方法。改前端页面时如果你不知道表单提交到哪里就找form actioncart.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 条血泪经验JSPMYSQL 老项目跑不起来的原因翻来覆去就那么几个。下面每一条都是真实踩过的坑按“现象 - 原因 - 解决”的顺序写清楚。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 port8080 ... /改成8081然后重启 Tomcat。这里有个连带操作项目里 JSP 写死了跳转 8080 的绝对路径的话端口一改全部跳转失效。老源码里基本不会这么写但如果出现改完端口后点击页面按钮无反应回 JSP 里搜8080关键字把硬编码地址替换成${pageContext.request.contextPath}动态拼接。5.2 数据库连不上Access denied for user现象启动项目后访问首页正常但点“登录”时报Access denied for user rootlocalhost (using password: YES)。原因DBUtil.java里写死的用户名密码和本机 MySQL 的实际密码不一致。源码包里 DBUtil 里写的是123456你自己安装时设了别的密码或者根本没给 root 设密码。解决两种修法。一是改DBUtil.java里的密码变量对准本机二是改 MySQL 的 root 密码对准代码。课设场景下建议直接改代码因为密码字段大概率还要拿给老师看。改完记得重新编译部署只改源码不重启 Tomcat 的话等于没改。5.3 中文乱码页面和数据库双重编码没对齐现象前台商品名称是问号或???后台管理员名字全部变乱码。个别页面打开是正常的某些页面全乱。原因三层编码不一致——页面 JSP 的pageEncoding、MySQL 表的字符集、JDBC 连接串的characterEncoding至少有一层和另外两层对不上。老源码里最容易出问题的是 JSP 顶部声明% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8%如果这行写成charsetGBK而数据库是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.jarEclipse 里右键项目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目录把要展示的图片丢进去然后修改商品表里的图片路径或者直接改 JSPimg src${pageContext.request.contextPath}/uploads/phone1.jpg width200 height200 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不破坏老代码结构三分钟搞定。这三个改动做完你对这套 JSPMYSQL 商城系统的掌握程度已经从“能跑起来”升级到“能说清楚每一个环节在干嘛”。我自己的习惯是拿到这类源码后先从DBUtil.java和web.xml两个文件反向画一遍请求流程图再动手改代码。这个习惯帮我避免了很多“觉得改完没问题、一运行就翻车”的情况。希望帮到你。最后提一个细节课设答辩之前把 MySQL 服务设为手动启动、把 Tomcat 的端口固定住、关掉电脑的自动睡眠。很多人的项目本来跑得好好的演示时因为服务没起来或系统休眠导致连接中断当场翻车。提前把部署环境固化为一套检查清单比你临时去改代码靠谱得多。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑