JSP超市管理系统实战:MyEclipse+MySQL从零搭建可运行Web工程
简介这份资源是一套基于JSP与Java的超市管理系统完整源码采用B/S架构配合MyEclipse与MySQL数据库开发适合正在学习Java Web编程、需要课程设计或毕业设计参考的学生与初级开发者。系统覆盖人事、销售、进货、库存与客户五大模块包含职工与供货商信息的增删改查、商品销售盘点、库存维护以及用户密码修改等功能能帮助读者理解JSP页面与后台逻辑的协作方式。压缩包为rar格式大小约1.06MB内含完整源代码与数据库脚本数据库文件为jspsupermarket.sql管理员账号密码均为admin开发环境为Tomcat7.0、MyEclipse8.5与MySQL5.0。目前已有1024人学习下载读者可据此快速搭建本地运行环境对照源码梳理模块划分与数据库表结构掌握JSP Web项目的开发流程与调试思路。1. JSP超市管理系统从MyEclipse到MySQL一套能跑通的Web工程长什么样很多Java Web的入门项目最后都卡在“能看懂但跑不起来”这一步。JSP超市管理系统就是典型标题里堆了JSP、MyEclipse、MySQL、Java、Web五个词看起来像课程作业实际上它是一套完整的请求-响应链路——浏览器发请求Tomcat交给JSP或ServletJDBC连MySQL取数据再把结果渲染回页面。这套链路跑通一次你对Java Web的理解会比看十篇文章都实在。这篇文章面向两类人一是要交课程设计、需要一套能演示增删改查的在校生二是刚转Java Web、想拿一个真实项目练手JDBC和JSP的初级工程师。我会按“环境怎么搭→数据库怎么建→页面怎么连→坑怎么避”的顺序讲所有命令和配置都能直接抄。需要说明的是MyEclipse只是IDE换成Eclipse或IDEA步骤几乎一样核心永远是Servlet容器加JDBC驱动。2. 环境与工程骨架MyEclipse里把JSP项目立起来2.1 为什么这套组合至今还在用JSP超市管理系统这类项目技术栈是典型的“老三层”JSP负责视图Servlet或JSP脚本负责控制JavaBean加JDBC负责数据。它不依赖Spring不需要Maven也能跑对新手最友好的一点是——所有东西都摆在明面上没有自动装配的黑匣子。MyEclipse自带Tomcat和JRE配置向导新建Web Project时会自动生成WebRoot、src、Web-INF这些目录省去手写web.xml的麻烦。选型上要注意版本匹配。MySQL 5.7和8.0的JDBC驱动类名不同5.7用com.mysql.jdbc.Driver8.0用com.mysql.cj.jdbc.DriverURL里还要加时区和SSL参数。Tomcat建议用8.5或9.0这两个版本对JSP 2.3支持稳定再新的Tomcat 10把包名从javax.servlet改成了jakarta.servlet老项目直接跑会报ClassNotFound。MyEclipse版本无所谓2014到2020都能用关键是JDK选1.8别用高版本否则编译JSP时容易出Unsupported major.minor version。2.2 新建工程与目录结构打开MyEclipseFile → New → Web ProjectProject Name填SupermarketSystemJRE选1.8Target Runtime选你装好的Tomcat。点Finish后工程结构如下SupermarketSystem/ ├── src/ # Java源码放Servlet、DAO、实体类 ├── WebRoot/ # 网站根目录 │ ├── WEB-INF/ │ │ ├── web.xml # 部署描述符 │ │ └── lib/ # 放mysql-connector-java.jar │ ├── css/ │ ├── js/ │ └── index.jsp把MySQL驱动jar复制到WebRoot/WEB-INF/lib下MyEclipse会自动加入Build Path。这一步别偷懒用外部jar引用部署到Tomcat时容易找不到驱动报No suitable driver found。2.3 配置Tomcat与编码Window → Preferences → MyEclipse → Servers → Tomcat选你的Tomcat目录JDK选1.8。然后在Tomcat的conf/server.xml里找到Connector标签加上URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8/不加这一句GET请求里的中文参数到后台就是乱码这是血泪经验。POST请求则在每个Servlet开头写request.setCharacterEncoding(UTF-8)两处都做才保险。3. MySQL数据库设计商品、用户、订单三张表怎么建3.1 建库建表的最小SQL超市管理系统的核心数据就三块商品信息、用户账号、订单记录。先用root登录MySQL执行下面的脚本。注意字符集用utf8mb4排序规则用utf8mb4_general_ci兼容性最好。CREATE DATABASE supermarket DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE supermarket; -- 用户表 CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, role TINYINT DEFAULT 0 COMMENT 0普通用户 1管理员 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 商品表 CREATE TABLE t_product ( id INT PRIMARY KEY AUTO_INCREMENT, pname VARCHAR(100) NOT NULL, price DECIMAL(10,2) NOT NULL, stock INT DEFAULT 0, category VARCHAR(50), img_path VARCHAR(200) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 订单表 CREATE TABLE t_order ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, product_id INT, quantity INT, total DECIMAL(10,2), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES t_user(id), FOREIGN KEY (product_id) REFERENCES t_product(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;price用DECIMAL不用FLOAT金额计算不会出现0.30000000000000004这种玄学。create_time给默认值插入订单时不用手动传时间。外键约束在演示项目里可以加方便展示表关系如果导入数据时报外键错误先插用户和商品再插订单。3.2 JDBC连接工具类每个DAO都写一遍连接代码太蠢抽一个DBUtil类。注意URL里的参数8.0驱动必须带serverTimezone否则报时区错误。package com.supermarket.util; import java.sql.*; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/supermarket?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse; private static final String USER root; private static final String PWD 你的密码; static { try { Class.forName(com.mysql.cj.jdbc.Driver); // 8.0驱动 } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConn() throws SQLException { return DriverManager.getConnection(URL, USER, PWD); } public static void close(Connection c, Statement s, ResultSet r) { try { if (r ! null) r.close(); } catch (Exception e) {} try { if (s ! null) s.close(); } catch (Exception e) {} try { if (c ! null) c.close(); } catch (Exception e) {} } }Class.forName放在static块里只执行一次避免每次拿连接都反射。close方法按ResultSet→Statement→Connection顺序关反了会报错。如果你的MySQL是5.7把驱动类名换成com.mysql.jdbc.DriverURL去掉serverTimezone也能跑。3.3 商品列表查询的DAO写法以商品查询为例写一个ProductDao包含查询全部和按ID查询两个方法。用PreparedStatement防SQL注入这是底线。package com.supermarket.dao; import com.supermarket.util.DBUtil; import java.sql.*; import java.util.*; public class ProductDao { public ListMapString,Object findAll() { ListMapString,Object list new ArrayList(); String sql SELECT id,pname,price,stock,category FROM t_product ORDER BY id DESC; try (Connection c DBUtil.getConn(); PreparedStatement ps c.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { MapString,Object m new HashMap(); m.put(id, rs.getInt(id)); m.put(pname, rs.getString(pname)); m.put(price, rs.getBigDecimal(price)); m.put(stock, rs.getInt(stock)); m.put(category, rs.getString(category)); list.add(m); } } catch (SQLException e) { e.printStackTrace(); } return list; } }用try-with-resources自动关连接比手动close干净。返回ListMap是为了演示方便真实项目应该建Product实体类。ORDER BY id DESC让新商品排前面符合超市上架的直觉。4. JSP页面与Servlet交互把数据从数据库搬到浏览器4.1 商品列表页的JSP写法JSP里尽量少写Java代码用JSTL和EL表达式。先在WebRoot/WEB-INF/lib下放jstl.jar和standard.jar然后在页面顶部引入标签库。% page contentTypetext/html;charsetUTF-8 languagejava % % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % html headtitle商品列表/title/head body table border1 width80% trth编号/thth名称/thth价格/thth库存/thth操作/th/tr c:forEach items${productList} varp tr td${p.id}/td td${p.pname}/td td${p.price}/td td${p.stock}/td tda hrefproduct?actiondetailid${p.id}详情/a/td /tr /c:forEach /table /body /html${productList}是Servlet里request.setAttribute(productList, list)传过来的。JSTL的c:forEach比脚本片段% for(...) %清晰得多也避免在页面里处理异常。4.2 Servlet接收请求并转发写一个ProductServlet用action参数区分操作。这是最土但最直观的路由方式新手一看就懂。package com.supermarket.servlet; import com.supermarket.dao.ProductDao; import javax.servlet.*; import javax.servlet.http.*; import java.io.IOException; import java.util.List; import java.util.Map; public class ProductServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String action req.getParameter(action); ProductDao dao new ProductDao(); if (list.equals(action) || action null) { ListMapString,Object list dao.findAll(); req.setAttribute(productList, list); req.getRequestDispatcher(/product_list.jsp).forward(req, resp); } else if (detail.equals(action)) { int id Integer.parseInt(req.getParameter(id)); // 省略按id查询逻辑同findAll改where条件 req.getRequestDispatcher(/product_detail.jsp).forward(req, resp); } } }forward是服务器内部跳转浏览器地址栏不变request里的属性还能带到目标页面。如果用sendRedirect属性就丢了列表页会显示空白。在web.xml里配置Servlet映射servlet servlet-nameProductServlet/servlet-name servlet-classcom.supermarket.servlet.ProductServlet/servlet-class /servlet servlet-mapping servlet-nameProductServlet/servlet-name url-pattern/product/url-pattern /servlet-mapping访问http://localhost:8080/SupermarketSystem/product?actionlist就能看到商品列表。如果报404检查url-pattern前有没有多写斜杠或者Servlet类名包路径写错。4.3 图片上传与坐标定位的常见需求热搜里有人问“jsp图片如何对坐标定位”这在超市系统里对应商品图片的热点区域。简单做法是用HTML的map和area标签在JSP里动态生成坐标img src${pageContext.request.contextPath}/upload/${p.img_path} usemap#goodsMap map namegoodsMap area shaperect coords0,0,100,100 hrefproduct?actiondetailid${p.id} /mapcoords的四个值分别是左上角x、y和右下角x、y。如果要做图片上传用commons-fileupload组件在Servlet里解析multipart/form-data请求把文件存到WebRoot/upload目录。注意上传目录要真实存在否则报FileNotFoundException。5. 避坑排查JSP连MySQL最容易翻车的5个地方5.1 报错No suitable driver found for jdbc:mysql现象启动Tomcat访问页面控制台抛SQLException: No suitable driver found。原因通常是驱动jar没放进WEB-INF/lib或者放进去但MyEclipse没重新部署。解决确认mysql-connector-java-8.0.x.jar在lib目录下右键工程 → Refresh然后在Servers视图里右键Tomcat → Clean重新发布。如果还不行检查URL是否写成了jdbc:mysql://少一个冒号也会报这个错。5.2 中文乱码页面显示问号或方块现象商品名在数据库里正常JSP页面显示成???。原因有三处数据库字符集、连接URL编码、JSP页面编码。解决建库时用utf8mb4URL加useUnicodetruecharacterEncodingutf8JSP顶部写% page contentTypetext/html;charsetUTF-8 %Tomcat的Connector加URIEncodingUTF-8。四处都对齐乱码基本消失。5.3 时区错误The server time zone value is unrecognized现象MySQL 8.0下连接报The server time zone value ?D1ú±ê×?ê±?? is unrecognized。原因是驱动需要明确时区。解决URL里加serverTimezoneAsia/Shanghai。如果还报错把useSSLfalse也加上8.0默认要求SSL本地开发关掉省事。5.4 外键约束导致插入失败现象插入订单时报Cannot add or update a child row: a foreign key constraint fails。原因是t_order里的user_id或product_id在对应表里不存在。解决先插用户和商品再插订单或者临时SET FOREIGN_KEY_CHECKS0关掉检查导入完再打开。演示项目里如果嫌麻烦建表时可以不写外键用程序逻辑保证一致性。5.5 JSP编译报错Unable to compile class for JSP现象访问JSP页面报500提示Unable to compile class for JSP。原因通常是JSP里Java代码有语法错误或者JSTL标签库没引入。解决看Tomcat日志里具体哪一行编译失败多数是少了分号、引号不匹配或者% taglib %的uri写错。JSTL的uri是http://java.sun.com/jsp/jstl/core别写成https。6. 进阶技巧用实体类替代Map让DAO更规范前面DAO返回ListMap是为了快速演示真实项目里应该用实体类。建一个Product类字段和表列一一对应然后改DAO用BeanHandler思路手动映射。这样做的好处是编译期就能发现字段名写错而不是运行时报Column pname not found。package com.supermarket.entity; import java.math.BigDecimal; public class Product { private int id; private String pname; private BigDecimal price; private int stock; private String category; // getter/setter省略 }DAO里把rs.getInt(id)换成p.setId(rs.getInt(id))返回ListProduct。JSP里${p.pname}照样能用因为EL表达式走的是getter方法。这一步改造花不了半小时但代码可读性提升明显。再进一步可以把增删改查的SQL抽到web.xml或properties文件里避免硬编码。我一般会在src下放一个sql.properties用Properties类加载。这样换数据库时只改配置不动Java代码。最后一个习惯每次改完DAO先在MySQL客户端里把SQL跑一遍确认能出结果再写进Java。我踩过最冤的坑是SQL里少了个空格Java里拼接成SELECT * FROM t_productWHERE id1报语法错误查了半小时。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

DeepSeek私有化部署实战:算力选型、vLLM部署与数据调教

DeepSeek私有化部署实战:算力选型、vLLM部署与数据调教

简介:面向中小型企业技术开发人员的 DeepSeek 落地实战手册,聚焦私有化部署、数据调教与业务创新三大主题。文档从 DeepSeek 的基本概念、模型特点与技术优势入手,系统梳理了中小型企业选择私有化部署的原因,并分步讲解环境准备、…

2026/10/9 10:45:19 阅读更多 →
C++缺省参数深度剖析:从语法到重载、虚函数与实战陷阱

C++缺省参数深度剖析:从语法到重载、虚函数与实战陷阱

我最早被 C 缺省参数“坑”到,是在给一个老接口加新参数的时候。当时我想当然地在函数定义处写了个默认值,结果满屏都是 redefinition of default argument。后来翻标准、看编译产物,才发现这个看起来只是“少写几个实参”的语法糖&#xff0…

2026/10/9 10:45:19 阅读更多 →
商科STEM化、澳洲申请更新、冷核聚变……六条新闻背后的留学与职场信号

商科STEM化、澳洲申请更新、冷核聚变……六条新闻背后的留学与职场信号

每天早上的信息流,我基本是当“脉搏”来看的——哪条新闻在留学群里转了,哪个话题又上了科技版首页,先扫一眼趋势,再决定要不要点进去细读。今天刷到一条标题混搭得离谱的推送:古希腊德尔菲神庙、美国某名校商学院全专…

2026/10/9 10:45:19 阅读更多 →

最新新闻

树结构核心术语解析:根、父子兄弟、深度高度与路径的工程意义

树结构核心术语解析:根、父子兄弟、深度高度与路径的工程意义

1. 为什么“树”这个词在计算机里被反复提起,却没人真去种一棵?你打开任何一本算法入门书,翻到第三章,大概率会看到一个分叉的图示:一个圆圈在最上面,下面连着两个圆圈,再往下又分出更多——旁边…

2026/10/9 11:18:10 阅读更多 →
锂电池清洗水枪EMC整改实战:从超标12dB到6dB余量的系统化方案

锂电池清洗水枪EMC整改实战:从超标12dB到6dB余量的系统化方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 11:18:10 阅读更多 →
GCC编译全解析:从预处理到链接的实战指南

GCC编译全解析:从预处理到链接的实战指南

1. 从一行报错说起:为什么值得花时间搞懂gcc很多人第一次接触gcc,不是因为想学它,而是因为被它拦住。编译一个C文件,终端甩出一堆看不懂的英文,什么undefined reference to、implicit declaration of function&#xf…

2026/10/9 11:18:10 阅读更多 →
电机测试数据飘?先查平台再查传感器——机械安装细节全解析

电机测试数据飘?先查平台再查传感器——机械安装细节全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 11:18:10 阅读更多 →
Eclipse导出可执行Jar的原理与三种依赖策略详解

Eclipse导出可执行Jar的原理与三种依赖策略详解

简介:本资源是一份面向Java初学者与中小型项目开发者的Eclipse工程打包实战指南,聚焦解决「如何导出含第三方Jar依赖的可执行Jar文件」这一高频部署痛点。内容基于Eclipse Indigo(3.7)环境,系统讲解Runnable JAR File导…

2026/10/9 11:18:10 阅读更多 →
Codex 额度重置后,开发者如何用 TaoToken 统一管理 API 调用?

Codex 额度重置后,开发者如何用 TaoToken 统一管理 API 调用?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 11:17:09 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →