简介这份资源是一套基于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报语法错误查了半小时。希望帮到你。本文还有配套的精品资源点击获取 SEO 优化官网定制响应式建站教育培训建站