
简介这是一套面向Java Web初学者与课程设计需求的宠物管理系统源码采用JSPServletMySQL技术栈实现适合刚接触Web开发、需要完成入门级增删改查练习的读者。系统围绕宠物信息管理展开支持按分类查询宠物并完整实现了添加、编辑、删除等操作在原有基础上补齐了编辑与删除功能形成一套完整的增删改查模块逻辑清晰、上手门槛低。压缩包共41个文件约6.37MB包含7个Java源文件、7个class编译文件、4个JSP页面、4个jar依赖包以及数据库脚本、配置文档、说明文档和演示视频等覆盖代码、数据与讲解多个层面。目前已有1580人学习下载配套的SQL脚本可直接导入建库详细配置文档与演示视频能帮助读者快速跑通项目适合作为课程作业、毕业设计原型或Servlet入门练手参考。1. 从一份 JSP 宠物管理系统源码说起它到底能跑出什么如果你正在找一份能直接跑起来的 Java Web 入门项目又不想被 Spring Boot 那一套注解和自动配置绕晕那这份javajspservletmysql的宠物管理系统源码值得看一眼。它没有用任何框架页面用 JSP 写控制层是原生 Servlet数据落在 MySQL整个请求链路是「浏览器 → JSP → Servlet → JDBC → MySQL → JSP 回显」每一层都看得见摸得着。功能上覆盖了宠物信息的增删改查还带按分类查询压缩包里配了 SQL 脚本、配置文档、演示视频和 PDF 说明基本属于「解压 → 建库 → 改配置 → 启动 Tomcat」就能看到页面的类型。它适合谁适合刚学完 Servlet 和 JSP、想找一个完整 CRUD 项目练手的人也适合需要给学生讲「一个请求在 Java Web 里到底怎么走完一圈」的讲师。不适合谁不适合想直接拿去做生产系统的人因为它的定位就是教学级功能简单、没有权限体系、没有分页优化。但正因为简单它才是一份好的「解剖样本」——你能在半小时内把整个项目的调用链摸清楚而不是花两天去理解框架的启动流程。2. 环境搭建与数据库初始化把 db_petmgr.sql 跑通2.1 JDK、Tomcat、MySQL 的版本选择这份源码用的是原生 Servlet JSP没有 Maven 依赖所以版本选择上不用太纠结但也不能乱来。JDK 建议用 8 或 11Tomcat 用 8.5 或 9.0MySQL 用 5.7 或 8.0 都行。为什么这么选因为 JSP 和 Servlet 的 API 在 Tomcat 9 之后有包名变化javax.servlet变成jakarta.servlet而这份源码里的 import 大概率还是javax.servlet.*所以 Tomcat 不要上 10。MySQL 8.0 的驱动类名是com.mysql.cj.jdbc.Driver5.7 是com.mysql.jdbc.Driver这个在配置数据库连接时要对应上否则会报ClassNotFoundException。常见做法是JDK 8 Tomcat 8.5 MySQL 5.7这套组合最稳网上资料也最多。如果你本机已经装了 MySQL 8.0也不用降级改一下驱动类名和 URL 参数就行。2.2 导入 SQL 脚本并确认表结构压缩包里的db_petmgr.sql是建库建表的脚本直接导入即可。我一般会先看一眼脚本内容确认库名和表名避免和本机已有库冲突。# 登录 MySQL导入脚本 mysql -u root -p db_petmgr.sql # 导入后确认库和表 mysql -u root -p -e show databases; use petmgr; show tables;导入之后你会看到宠物信息表字段大概包括宠物 ID、名称、分类、价格、图片路径、描述等。这里有个细节如果脚本里写死了CREATE DATABASE petmgr而你本机已经有同名库导入会报错。解决办法是先DROP DATABASE IF EXISTS petmgr;再导入或者手动改脚本里的库名。-- 查看表结构确认字段名和类型 USE petmgr; DESC pet;字段名要和后面 Java 代码里的实体类属性对应上比如数据库里是pet_name实体类里可能是petName这个映射关系在 DAO 层手写 SQL 时要特别注意。如果对不上查询结果就是 null页面显示空白这种问题排查起来很费时间。2.3 配置数据库连接改对 URL、用户名和密码数据库连接配置一般在src下的某个 properties 文件或者工具类里。打开详细配置.docx能看到作者给的说明但核心就是改三个值URL、用户名、密码。// 常见的 JDBC 工具类写法 public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/petmgr?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai; private static final String USER root; private static final String PASSWORD 你的密码; public static Connection getConnection() throws SQLException { try { Class.forName(com.mysql.cj.jdbc.Driver); // MySQL 8.0 用 cj5.7 去掉 cj } catch (ClassNotFoundException e) { e.printStackTrace(); } return DriverManager.getConnection(URL, USER, PASSWORD); } }这里有几个参数值得说清楚。useUnicodetruecharacterEncodingutf8是为了防止中文乱码尤其是宠物名称和描述里有中文时。serverTimezoneAsia/Shanghai是 MySQL 8.0 必须加的不加会报时区错误。驱动类名如果是 MySQL 5.7写成com.mysql.jdbc.Driver8.0 写成com.mysql.cj.jdbc.Driver写错了启动就报错。提示改完配置后先写一个 main 方法测试getConnection()能不能拿到连接再去启动 Tomcat。这样能把数据库问题和 Web 容器问题分开排查。3. Servlet 请求链路拆解从宠物列表到增删改查3.1 宠物列表与分类查询的实现逻辑列表页的入口一般是一个 Servlet比如PetListServlet它做的事情很固定调 DAO 查数据把结果塞进 request转发到 JSP。// PetListServlet.java WebServlet(/petList) public class PetListServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String category request.getParameter(category); // 分类查询参数 PetDao dao new PetDao(); ListPet pets; if (category ! null !category.isEmpty()) { pets dao.findByCategory(category); // 按分类查 } else { pets dao.findAll(); // 查全部 } request.setAttribute(pets, pets); request.getRequestDispatcher(/petList.jsp).forward(request, response); } }这段代码的关键点是request.getParameter(category)拿分类参数如果为空就查全部。分类查询在 SQL 里就是加一个WHERE category ?用 PreparedStatement 传参。为什么要用 PreparedStatement 而不是拼字符串一是防 SQL 注入二是避免中文参数拼接时的编码问题。这个项目虽然简单但这一点不能省。JSP 页面里用 JSTL 或者脚本片段遍历pets把每条宠物的名称、分类、价格显示出来。如果用的是c:forEach记得在 JSP 顶部引入 JSTL 标签库否则标签不生效页面会把标签原样输出。3.2 添加与编辑宠物表单提交和参数接收添加和编辑本质上都是表单提交区别在于编辑要多传一个宠物 ID。添加走PetAddServlet编辑走PetEditServlet或者合并成一个 Servlet 用 action 参数区分。// PetAddServlet.java WebServlet(/petAdd) public class PetAddServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); // 必须放在 getParameter 之前 String name request.getParameter(name); String category request.getParameter(category); String priceStr request.getParameter(price); double price Double.parseDouble(priceStr); Pet pet new Pet(); pet.setName(name); pet.setCategory(category); pet.setPrice(price); PetDao dao new PetDao(); dao.add(pet); // 插入数据库 response.sendRedirect(petList); // 重定向回列表页 } }request.setCharacterEncoding(UTF-8)这行必须放在所有getParameter之前否则中文参数会乱码。这是 JSP/Servlet 项目里最经典的坑之一很多人调半天以为是数据库编码问题其实是这行位置放错了。另外添加完成后用sendRedirect而不是forward是为了避免刷新页面时重复提交表单。编辑的逻辑多一步先根据 ID 查出原数据回显到表单用户改完再提交更新。回显时要注意把原值填进 input 的 value 属性里否则用户每次编辑都要重新输入所有字段。3.3 删除操作与页面跳转的注意事项删除一般用 GET 请求传 ID比如petDelete?id3Servlet 拿到 ID 后调 DAO 删除再重定向回列表。// PetDeleteServlet.java WebServlet(/petDelete) public class PetDeleteServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String idStr request.getParameter(id); int id Integer.parseInt(idStr); PetDao dao new PetDao(); dao.deleteById(id); response.sendRedirect(petList); } }删除操作用 GET 在 RESTful 规范里是不推荐的但教学项目里很常见因为方便在页面上直接写超链接。如果你要改成 POST就在 JSP 里用表单提交把 method 改成 post。删除后一定要重定向不要 forward 到列表页否则用户刷新会再次触发删除。注意删除前最好加一个 JavaScript 确认框防止误点。a hrefpetDelete?id${pet.id} onclickreturn confirm(确定删除)删除/a这一行就能搞定。4. 避坑与常见问题排查那些让项目跑不起来的细节4.1 中文乱码现象、原因与解决现象添加宠物时输入中文名称列表页显示成???或者乱码。原因通常有三个一是request.setCharacterEncoding没加或位置不对二是数据库表和字段的字符集不是 utf8三是 JDBC URL 里没加characterEncodingutf8。解决顺序是先确认 URL 参数再确认 Servlet 里编码设置的位置最后检查数据库字符集。-- 检查表和字段的字符集 SHOW CREATE TABLE pet; -- 如果不是 utf8用这条改 ALTER TABLE pet CONVERT TO CHARACTER SET utf8mb4;4.2 404 与 500路径和空指针的排查思路现象访问petList报 404。原因一般是WebServlet的路径和浏览器里输的不一致或者 Tomcat 部署时上下文路径不对。解决确认 Tomcat 的访问地址是http://localhost:8080/项目名/petList项目名不能丢。如果是 500看 Tomcat 控制台的异常堆栈最常见的是NullPointerException多半是 DAO 返回了 null 而 JSP 直接调了方法。4.3 数据库连接失败驱动、时区、权限三连现象启动后第一次访问页面就报Communications link failure或者Access denied。原因可能是驱动 jar 没放进WEB-INF/lib或者 MySQL 8.0 没加时区参数或者 root 用户没有远程/本地权限。解决确认mysql-connector-java.jar在WEB-INF/lib下URL 加serverTimezone用mysql -u root -p能登录说明密码没错。4.4 JSP 页面修改后不生效缓存与编译问题现象改了 JSP 文件刷新浏览器还是旧内容。原因是 Tomcat 缓存了编译后的 Servlet。解决清掉 Tomcat 的work目录或者重启 Tomcat。我一般会在开发阶段把 Tomcat 配置成热部署但这份源码是手动部署的所以改完 JSP 最好重启一次。4.5 图片上传路径写死换台机器就挂现象宠物图片在作者机器上能显示到你机器上就是裂图。原因是图片路径写成了绝对路径比如D:\project\images\。解决改成相对路径或者把图片放在webapp下的某个目录里用${pageContext.request.contextPath}/images/xxx.png引用。5. 二次开发与验证把 CRUD 模板变成你自己的项目5.1 从宠物管理扩展到任意实体管理这份源码的价值不在于宠物管理本身而在于它是一套完整的 JSPServletJDBC CRUD 模板。你把Pet换成Student、Book、Product把表名和字段改掉就是一个新的管理系统。具体步骤是改数据库表 → 改实体类 → 改 DAO 里的 SQL → 改 JSP 页面的字段名 → 改 Servlet 里的参数名。五步走完一个新模块就出来了。// 以 Student 为例实体类改一下 public class Student { private int id; private String name; private String className; // getter/setter 省略 }DAO 里的 SQL 从SELECT * FROM pet改成SELECT * FROM studentJSP 里的${pet.name}改成${student.name}。这个过程中最容易漏的是 JSP 表单里的name属性它必须和 Servlet 里getParameter的字符串完全一致大小写敏感。5.2 验证清单怎么确认项目真的跑通了跑通的标准不是「页面能打开」而是以下五条都过一遍验证项操作预期结果列表查询访问 petList显示所有宠物分类查询选择某个分类只显示该分类宠物添加填表单提交列表页出现新宠物编辑点编辑改名称列表页显示新名称删除点删除确认该宠物从列表消失五条都过说明增删改查链路完整。如果某一条失败按第 4 章的排查思路定位。5.3 一个具体技巧用日志代替 System.out.println教学项目里常见System.out.println打日志但 Tomcat 控制台输出多了之后很难找。我一般会在 DAO 层加一个简单的日志把执行的 SQL 和参数打出来排查问题时一目了然。// 在 DAO 方法里加一行 System.out.println(执行 SQL: sql 参数: id);更好的做法是用java.util.logging或者 Log4j但对于这个体量的项目System.out.println够用了。关键是养成「每个 DAO 方法都打一行」的习惯这样出问题时你能快速定位是哪条 SQL 没返回预期结果。从那以后我每次拿到这种教学级源码都会先跑一遍五条验证清单再动手改代码。因为很多坑不是代码逻辑问题而是环境和配置问题先确认基线能跑通后面改起来才有底。希望帮到你。本文还有配套的精品资源点击获取