资讯详情

资讯详情

JSP+Servlet+MySQL宠物管理系统:JavaWeb课设完整实现与避坑指南

简介这是一个基于JSPServletMySQL搭建的宠物管理系统源码包面向初学Java Web的开发者以简单直观的宠物分类查询、添加、编辑与删除功能完整呈现增删改查模块的落地方式。系统原先缺少编辑与删除能力后续补充升级形成一套可供模仿与二次开发的入门级项目。包内共41个文件压缩后大小6.37MB。除核心的Java类、JSP页面和Servlet配置外还包含MySQL数据库脚本、Eclipse工程配置文件、详细配置说明文档以及操作演示视频便于从环境搭建到功能调试逐层理解。资源中还提供PDF说明文档与图片预览适合学生课设、毕业设计参考或自学练手。该资源已有1580人学习下载整体结构清晰、代码量适中特别适合刚接触Java Web的读者梳理请求转发、数据库连接与页面交互的基本流程。拿到后可对照视频运行项目阅读sql脚本理解数据表设计再结合源码体会分层编写思路快速完成一个可运行的宠物管理模块。1. 为什么宠物管理系统是 JavaWeb 课设最稳的打开方式JavaWeb 课程设计交作业前两周班级群里问得最多的问题就从“java 课程设计案例源码去哪找思路”变成了“基于 jsp 的毕设选题有没有好做的”。宠物管理系统恰好站在两类需求的重合点上题目不偏、需求清晰改一改就能变成宠物医院、流浪动物领养这类衍生题。这套 javajspservletmysql 组合的宠物管理系统把登录、宠物信息维护、按名字和类型条件筛选这些课设标配功能完整跑通适合正在赶课程设计、毕业设计或者想回头补 Servlet 底层功底的读者。和直觉相反SpringBoot 项目遍地走的今天面试最常问的反而是 Servlet 的生命周期和请求转发把这套老组合吃透比再照抄一个 SpringBoot CRUD 项目划算得多。2. 技术栈拆解JSP、Servlet、MySQL 在一条请求里各自干什么2.1 从浏览器到数据库再到浏览器一条请求的七步链路先把最关键的链路讲清楚。整个项目里没有 Spring 帮你封装所有请求都按 Servlet 规范走流程是这样的浏览器输入http://localhost:8080/pet/list发出 HTTP GET 请求。Tomcat 监听 8080 端口收到请求后按 URL 路径去匹配映射关系。匹配到WebServlet(/pet/list)对应的 Servlet 类。Tomcat 创建或复用该 Servlet 实例调用service方法按请求类型分发到doGet。Servlet 里调用 PetDao 查询 MySQL拿到宠物数据列表。Servlet 把查询结果setAttribute存进 request 对象再forward给 JSP 页面。JSP 渲染成 HTML 返回浏览器用户看到表格里每一行宠物数据。这条链路里MySQL 负责数据存储Servlet 负责接收参数、调方法、决定下一个页面是谁JSP 负责把数据渲染成页面。JSP 在容器里其实也会被翻译成一个 Servlet 类再编译执行所以 JSP 和 Servlet 共享同一个 request 对象——这也是为什么 Servlet 里request.setAttribute(petList, list)之后JSP 里能直接取出来用。2.2 为什么还要学 ServletSpring Boot 里也包着这一层现在做课设的惯性是直接开 SpringBoot但 SpringBoot 内部依然是内嵌 Tomcat DispatcherServlet 在跑拦截请求、分发到 Controller、渲染视图这一套底层逻辑从 Servlet 时代就没变过。面试八股文里最早背的那批题——Servlet 生命周期、forward 和 redirect 区别、Session 的实现机制——全是从这一层盘出来的。Servlet 生命周期一共四步类加载与实例化、init()初始化、service()处理请求、destroy()销毁。其中service()会按请求方法自动分发到doGet或doPost。早期项目用 web.xml 配置 Servlet 映射现在主流用WebServlet注解省掉 XML但老项目的部署文件里还是大量存在servlet servlet-namePetListServlet/servlet-name servlet-classservlet.PetListServlet/servlet-class /servlet servlet-mapping servlet-namePetListServlet/servlet-name url-pattern/pet/list/url-pattern /servlet-mapping这段配置的含义就是把/pet/list这个 URL 交给PetListServlet处理。注解和 XML 只是两种配置方式最终效果一致。SpringBoot 2 集成 JSP 之所以麻烦是因为 JSP 依赖 Tomcat 的 JSP 解析器需要额外引入tomcat-embed-jasper依赖目录结构必须回到src/main/webapp还得打成 war 包才能稳定运行——这些限制恰好反向印证了 JSP Servlet 这套原生组合在传统 Web 项目里的地位。2.3 用 Model2 思想拆代码谁写 HTML谁写 Java谁连 MySQLJSP 刚流行的时候有个叫 Model1 的写法业务逻辑、数据库访问、HTML 全塞在一个 JSP 文件里一个列表页能写三四百行改个查询条件要在%%和table标签之间反复横跳。后来提出的 Model2 思想就是把职责拆开按照 JSP Model2 思想实现用户注册功能这类实训题本质上就是让你写 MVC 分层。组件职责典型文件能不能写 SQLJSP只负责展示数据list.jsp、add.jsp不能Servlet接收请求、调业务、控制跳转PetListServlet、LoginServlet不能DAO数据库访问PetDao、UserDao能JavaBean封装数据实体Pet、User不能我一般把包结构固定成四层课设规模完全够用src/main/java ├─ entity # 实体类对应数据库表字段 ├─ dao # 数据访问层 JDBC 操作 ├─ servlet # 控制器层接收处理请求 ├─ filter # 过滤器统一编码和登录校验 └─ util # 公共工具类比如数据库连接 src/main/webapp ├─ list.jsp # 宠物列表页 ├─ add.jsp # 新增宠物页 ├─ edit.jsp # 修改宠物页 └─ login.jsp # 登录页分层之后有个隐藏好处Servlet 里forward到 JSP 时路径是相对于 webapp 根目录的不需要加项目名前缀。同一个应用上下文内Servlet 和 JSP 天然共享 request、session、application 三个作用域对象这比前端页面自己拼接口路径要省心得多。3. 数据库设计与开发环境表建不好后面全是坑3.1 pet 与 user 两张表字段类型怎么定才够课设用宠物管理系统的核心数据是宠物档案最少两张表一张存宠物信息一张存登录用户。很多课设翻车第一站不是代码是表结构设计得别扭——比如把宠物类型做成外键关联一张类型表增删改查瞬间多出两套联表 SQL复杂度直接翻倍。CREATE DATABASE IF NOT EXISTS pet_manage DEFAULT CHARACTER SET utf8mb4; USE pet_manage; CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID, username VARCHAR(20) NOT NULL UNIQUE COMMENT 登录名, password VARCHAR(32) NOT NULL COMMENT 密码 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; CREATE TABLE pet ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT 宠物ID, name VARCHAR(20) NOT NULL COMMENT 宠物名字, type VARCHAR(10) NOT NULL COMMENT 类型猫/狗/兔/其他, gender CHAR(2) DEFAULT 公 COMMENT 性别, age INT DEFAULT 0 COMMENT 年龄月, health VARCHAR(10) DEFAULT 健康 COMMENT 健康状态, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 登记时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO user VALUES (NULL, admin, admin123); INSERT INTO pet (name, type, gender, age, health) VALUES (豆豆, 狗, 公, 12, 健康), (咪咪, 猫, 母, 8, 健康), (团子, 兔, 母, 5, 待观察);字段选择上的几个关键点type用普通 VARCHAR 而不是外键宠物类型就猫狗兔几个固定值查询时直接WHERE type 猫简单直接不用 JOINage用 INT 存月份数而不是字符串是因为后续要做“年龄大于 X 月”的筛选字符串比较会出问题create_time设置DEFAULT CURRENT_TIMESTAMP新增记录时页面不用传这个字段数据库自动填当前时间省一个参数health默认给“健康”前台下拉框传值不给就落默认值。两张表都明确指定utf8mb4字符集这是数据库层面防中文乱码的第一道保险。3.2 从命令行建库、建表、灌初始数据一份可以直接跑的 pet.sql把上面的 SQL 保存成pet.sql文件在命令行执行mysql -uroot -p pet.sql输入 root 密码后脚本会自动建库、建表、插数据。如果不想用文件导入也可以登录后手动执行mysql -uroot -p进入 mysql 交互终端后用source命令source /path/to/pet.sql;导入完验证一下USE pet_manage; SELECT id, name, type, gender, age, health FROM pet;能看到三行宠物数据就说明数据库没问题。这一步做完后面的 Java 代码只管连库操作不用再关心初始化。习惯图形界面的可以用 MySQL Workbench 打开 SQL 文件直接执行但课设答辩时考官很可能让你在命令行重跑一遍就为了确认表结构是你亲手建的命令行跑通反而更稳。3.3 开发环境搭配JDK、Tomcat、MySQL、驱动 jar 的版本怎么选版本选错是本项目最大的隐形坑。我自己踩过一回MySQL 8.0.21 配 mysql-connector-java 5.1.47启动直接报 SSL 连接异常换了对应版本的连接器后一次通过。版本之间不是随便能混用的按我的习惯搭配组件组合一最稳组合二较新JDKJDK 1.8JDK 1.8TomcatTomcat 8.5Tomcat 9.0MySQL5.78.0JDBC 驱动mysql-connector-java 5.1.49mysql-connector-java 8.0.33JDK 必须装 1.8不要用 17 或更高版本跑这个项目Tomcat 8.5 在高版本 JDK 下会出现模块访问报错。java 环境变量配置详细教程里最重要的就是JAVA_HOME指向 JDK 安装目录、PATH里加%JAVA_HOME%\bin装完在命令行敲java -version验证。Tomcat 解压后进bin目录双击startup.bat浏览器访问http://localhost:8080能看到猫头鹰页面就算成功。MySQL 安装教程里最容易漏的是安装过程中选字符集记得选 utf8mb4。数据库驱动 jar 文件必须放在WEB-INF/lib目录下放错位置的表现是代码编译能过、运行时报ClassNotFoundException。用 VSCode 编写 Servlet 代码需要配置 Java 环境和 Tomcat 插件但调试的顺畅程度远不如 IDEA课设阶段直接用 IDEA 社区版最省时间。Tomcat 关联 IDEA 的方式是在Run → Edit Configurations里新增 Tomcat Server Local然后在 Deployment 页签把项目 artifact 加进去Context 路径建议直接改成/省得访问时还要带项目名。4. 后端实现从数据库到浏览器Servlet 与 JSP 的完整配合4.1 通用的 JDBC 工具类驱动加载、连接获取、资源关闭数据库连接代码每个 DAO 都要用抽成一个工具类最省事。常见做法是放在util包下面静态初始化块负责加载驱动getConnection()负责拿连接close()负责释放资源。package util; import java.sql.*; public class DBUtil { private static final String URL jdbc:mysql://localhost:3306/pet_manage?useSSLfalsecharacterEncodingutf8serverTimezoneAsia/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); } public static void close(ResultSet rs, Statement stmt, Connection conn) { try { if (rs ! null) rs.close(); } catch (SQLException ignored) {} try { if (stmt ! null) stmt.close(); } catch (SQLException ignored) {} try { if (conn ! null) conn.close(); } catch (SQLException ignored) {} } }Class.forName放在static块里保证类第一次被加载时驱动只注册一次。URL 里三个参数各有用途characterEncodingutf8保证传输层中文不乱码serverTimezoneAsia/Shanghai解决 MySQL 8.0 的时区报错useSSLfalse关掉 SSL 警告本地开发不需要加密连接。USER和PASSWORD直接写死是课设阶段的省事做法生产环境要外置到配置文件这个到部署章节再讲。4.2 登录校验 ServletSession 与重定向的分工登录功能是整套系统的入口。用户在login.jsp输入用户名密码表单 POST 到/loginServlet 校验通过后把用户名存进 Session再重定向到列表页。package servlet; import dao.UserDao; import entity.User; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; WebServlet(/login) public class LoginServlet extends HttpServlet { private UserDao userDao new UserDao(); Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); String username req.getParameter(username); String password req.getParameter(password); User user userDao.findByUsernameAndPassword(username, password); if (user ! null) { HttpSession session req.getSession(); session.setAttribute(loginUser, user.getUsername()); resp.sendRedirect(req.getContextPath() /pet/list); } else { req.setAttribute(error, 用户名或密码错误); req.getRequestDispatcher(/login.jsp).forward(req, resp); } } }两个细节值得注意。第一req.setCharacterEncoding(UTF-8)必须先于getParameter执行否则 POST 提交的中文参数会乱码。第二登录成功用sendRedirect重定向失败用forward转发重定向是浏览器重新发起一次请求地址栏会变成/pet/list刷新页面不会重复提交表单而转发是服务器内部跳转地址栏不变。这是 Servlet 面试必考点也是代码里最重要的设计决策。4.3 列表与条件查询LIKE 查询和 PreparedStatement 参数绑定列表页要支持两种筛选按宠物名字模糊搜索按类型精确匹配。查询条件动态拼接这种情况下最容易犯的错误是用字符串拼接 SQL既难调试又有注入风险。正确做法是用PreparedStatement的占位符。public ListPet findByCondition(String keyword, String type) { ListPet list new ArrayList(); StringBuilder sql new StringBuilder(SELECT * FROM pet WHERE 11 ); ListObject params new ArrayList(); if (keyword ! null !keyword.trim().isEmpty()) { sql.append(AND name LIKE ? ); params.add(% keyword.trim() %); } if (type ! null !type.trim().isEmpty()) { sql.append(AND type ? ); params.add(type.trim()); } try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql.toString())) { for (int i 0; i params.size(); i) { ps.setObject(i 1, params.get(i)); } try (ResultSet rs ps.executeQuery()) { while (rs.next()) { Pet pet new Pet(); pet.setId(rs.getInt(id)); pet.setName(rs.getString(name)); pet.setType(rs.getString(type)); pet.setGender(rs.getString(gender)); pet.setAge(rs.getInt(age)); pet.setHealth(rs.getString(health)); pet.setCreateTime(rs.getTimestamp(create_time)); list.add(pet); } } } catch (SQLException e) { e.printStackTrace(); } return list; }WHERE 11是个取巧写法目的是让后续条件都能用AND开头拼接省去判断“是不是第一个条件”的逻辑。LIKE ?的模糊匹配值在传入参数时就拼好%和关键字而不是拼进 SQL 字符串这样即使名字里带单引号也不会破坏语句结构。JDBC 的try-with-resources写法会自动关闭Connection和PreparedStatementResultSet也一并处理代码量比手动finally关闭少一半。4.4 新增、删除、修改表单提交、GET 删除与重定向回列表新增和删除是列表页旁边的两个入口。新增走 POST删除用 GET 带 id 参数。WebServlet(/pet/add) public class AddPetServlet extends HttpServlet { private PetDao petDao new PetDao(); Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); Pet pet new Pet(); pet.setName(req.getParameter(name)); pet.setType(req.getParameter(type)); pet.setGender(req.getParameter(gender)); pet.setAge(Integer.parseInt(req.getParameter(age))); pet.setHealth(req.getParameter(health)); petDao.insert(pet); resp.sendRedirect(req.getContextPath() /pet/list); } }WebServlet(/pet/delete) public class DeletePetServlet extends HttpServlet { private PetDao petDao new PetDao(); Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int id Integer.parseInt(req.getParameter(id)); petDao.deleteById(id); resp.sendRedirect(req.getContextPath() /pet/list); } }新增成功后没有转发到某个成功页面而是直接重定向回列表页这个设计叫 Post/Redirect/Get 模式。如果转发回列表页用户刷新浏览器会再次提交同样的表单导致宠物数据重复插入重定向让浏览器重新请求列表页数据只有一条。修改功能的 SQL 是标准的 update 语法UPDATE pet SET name?, type?, age?, health? WHERE id?参数顺序必须和 SQL 里的问号位置一一对应最容易漏的是最后那个 id 条件漏掉就整表被改。Integer.parseInt在参数不是数字时会抛异常课设里可以容忍稳健一点的做法是用 try-catch 包住失败时返回错误提示。4.5 JSP 页面渲染列表页与表单页的核心写法列表页是整个项目里信息密度最高的页面它要把findByCondition查出来的petList遍历成表格行。这个场景用 JSTL 的c:forEach最规范但需要额外引入两个 jar 包不想引依赖就用最原始的% %循环效果一样。% page contentTypetext/html;charsetUTF-8 languagejava % % if (session.getAttribute(loginUser) null) { response.sendRedirect(request.getContextPath() /login.jsp); return; } % html body form action${pageContext.request.contextPath}/pet/list methodget 名字关键字input typetext namekeyword 类型select nametype option value全部/option option value猫猫/option option value狗狗/option option value兔兔/option /select button typesubmit查询/button /form table border1 trthID/thth名字/thth类型/thth性别/thth年龄(月)/thth健康/thth操作/th/tr % ListPet pets (ListPet) request.getAttribute(petList); if (pets ! null) { for (Pet p : pets) { % tr td% p.getId() %/td td% p.getName() %/td td% p.getType() %/td td% p.getGender() %/td td% p.getAge() %/td td% p.getHealth() %/td td a href${pageContext.request.contextPath}/pet/delete?id% p.getId() % onclickreturn confirm(确定删除这只宠物吗)删除/a /td /tr % } } % /table a href${pageContext.request.contextPath}/add.jsp新增宠物/a /body /html页面顶部那段 Session 判断叫“页面级别登录校验”效果是未登录用户直接打开这个 JSP 会被弹回登录页。${pageContext.request.contextPath}是 EL 表达式取出项目部署的上下文路径用它拼链接就不会出现“部署后带项目名导致 404”的问题。删除链接里的onclick返回 false 时会阻止跳转这是最简单的前端二次确认。新增页是一个普通的 HTML 表单action 指向${pageContext.request.contextPath}/pet/addmethod 必须是 post字段 name 与 Servlet 里getParameter的参数名一一对应。5. 避坑自查宠物管理系统高频翻车现场与排查思路5.1 现象Tomcat 启动报Port 8080 required by Tomcat v8.5 Server is already in use双击startup.bat后控制台刷出端口占用错误Tomcat 窗口一闪而过浏览器访问 8080 没反应。原因一般有两个上一个 Tomcat 实例没关干净或者 8080 被其他程序占了。解决命令行查端口占用netstat -ano | findstr 8080看到 LISTENING 状态那一行的最后一列是 PID然后taskkill /PID 1234 /F杀掉进程后重新启动。更省事的办法是直接改 Tomcat 的端口打开conf/server.xml把 8080 改成 8090 或 8081。但要注意改端口后访问地址和 IDEA 里配置的 URL 都要一起改漏一处就是连接不上。这个坑的根因是开发机环境太杂多个项目共用一个 Tomcat 端口养成启动前先netstat看一眼的习惯能省很多时间。5.2 现象运行到Class.forName或DriverManager.getConnection时抛异常启动项目后访问接口控制台出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver或者java.sql.SQLException: No suitable driver found。前者是驱动类根本没加载到后者是驱动类加载了但连接 URL 和驱动不匹配。原因几乎都是同一个mysql-connector jar 包没放进WEB-INF/lib或者放进了项目的lib目录但 IDEA 没把它加入构建路径。常见做法是把 jar 复制到WEB-INF/lib后在 IDEA 右键Add as Library。另一个隐蔽原因是 MySQL 8 配 5.x 驱动时报Caused by: java.sql.SQLException: Unknown initial character set index 255 received from server这是驱动版本和数据库版本不匹配MySQL 8 必须用 8.x 的连接器同时驱动类名要从com.mysql.jdbc.Driver换成com.mysql.cj.jdbc.DriverDBUtil 里的字符串要同步改。5.3 现象页面显示正常但数据库里中文全部变成问号插入一条“泰迪”查表看到的是???。这个问题的传播链条极长四层编码里任何一层不一致都会出问题。原因链条数据库表字符集不是 utf8或者 JDBC 连接 URL 没有指定characterEncodingutf8或者 JSP 页面pageEncoding写错。解决按顺序排查第一步确认建表语句里DEFAULT CHARSETutf8mb4有写第二步检查 DBUtil 的连接 URL 里有没有characterEncodingutf8第三步确认 JSP 第一行是% page contentTypetext/html;charsetUTF-8 %第四步加一个过滤器统一每次请求的编码这是治本的办法package filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; WebFilter(/*) public class EncodingFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(UTF-8); resp.setCharacterEncoding(UTF-8); chain.doFilter(req, resp); } }过滤器用WebFilter(/*)拦截所有请求在 Servlet 执行前统一把请求和响应的编码都设成 UTF-8。加了这个过滤器之后每个 Servlet 里的req.setCharacterEncoding都可以删掉反而更不容易漏。5.4 现象列表页数据出来了但 CSS、JS 全部加载失败页面显示纯 HTML 表格样式全丢F12 看到 CSS 文件 404。原因是link href/css/style.css这种写法少带了项目上下文路径。本地开发时访问地址是http://localhost:8080/pet/list部署后变成http://localhost:8080/pet_manage/list以/开头的路径会被解析到当前服务根目录而不是项目根目录。解决方式统一改用 EL 表达式拼接项目根路径link href${pageContext.request.contextPath}/css/style.css relstylesheet script src${pageContext.request.contextPath}/js/common.js/scriptpageContext.request.contextPath会自动带上当前部署的应用名直接写在开头表示“从应用根目录找这个文件”。页面里所有href、src、表单 action 都遵循这个规则换环境部署时路径就不会错。5.5 现象MySQL 8 连接时报时区错误中文乱码字符显示异常启动项目连接数据库控制台报The server time zone value Öйú±ê׼ʱ¼ä is unrecognized or represents more than one time zone这串乱码其实是“中国标准时间”被错误编码后的结果。这是 MySQL 8 引入的时区校验机制MySQL 5.7 没这个问题。解决方式是在连接 URL 里显式指定时区jdbc:mysql://localhost:3306/pet_manage?useSSLfalsecharacterEncodingutf8serverTimezoneAsia/ShanghaiserverTimezoneAsia/Shanghai告诉驱动按东八区解释数据库时间。顺手把useSSLfalse也加上否则每次启动还会刷一串 SSL 警告虽然不影响运行但答辩时被考官看到满屏红色会非常减分。这个配置和 5.3 的编码配置最好一步到位写在 DBUtil 里不要等项目跑起来再补。6. 部署与交付从 IDE 到能交作业的完整验证流程6.1 把项目打成 war 包从 IDEA 到独立 Tomcat开发调试在 IDEA 里做交作业要把项目打成 war 包部署到独立 Tomcat。IDEA 操作路径是File → Project Structure → Artifacts → → Web Application: Exploded → From Modules然后Build → Build Artifacts → Rebuild会在输出目录生成 war 包。也可以直接用 Maven 的mvn clean packagetarget 目录下就是最终产物。把 war 包复制到 Tomcat 的webapps目录启动 Tomcat 时会自动解压部署。cp pet_manage.war /opt/tomcat/webapps/ cd /opt/tomcat/bin ./startup.sh访问地址的关键区别就在这war 包的文件名就是应用上下文路径。pet_manage.war部署后要访问http://localhost:8080/pet_manage/如果希望访问根路径就把 war 改名为ROOT.war。开发环境里 JSP 链接都用${pageContext.request.contextPath}拼写这里就体现价值了——换环境部署所有链接自动跟着上下文路径走。6.2 交付前的十分钟自测清单检查项操作方式通过标准登录功能输入 admin/admin123跳转列表页错误密码输入错误密码显示错误提示且不跳转未登录访问清除 Cookie 后直接打开列表页被弹回登录页中文录入新增“泰迪”“加菲猫”列表显示正常数据库无乱码条件查询类型选“猫”只显示猫删除确认点击删除弹确认框确认后记录消失新增后刷新新增成功后按 F5列表不出现重复数据这一轮走下来项目的主体流程就完整了。如果某项不过先按第 5 章的排查路径定位别急着重跑整个项目。6.3 交付前补一个动作数据库备份与账号密码外置所有功能测完后把数据库导出一份备份这是最后的“后悔药”。mysqldump -uroot -p pet_manage pet_manage_backup.sql备份文件连同源码、war 包一起打包提交交作业时演示环境出了问题也能一键恢复。如果想把 DBUtil 里写死的数据库账号密码改成外置常见做法是在src/main/resources放一个db.properties用Properties类加载改动一个配置文件就能切换数据库环境不用重新编译。这两个动作花不了十分钟但能让这套宠物管理系统从“能在本机跑”升级为“换个环境也能跑”课程设计答辩时这是明显的加分项。这套 JSP Servlet MySQL 的组合承载了我当年第一次理解“请求-响应”“MVC 分层”这两个概念的全过程。后来写 SpringBoot、写微服务遇到诡异问题时往回翻的依然是 Servlet 规范那一层。希望这篇笔记能把这条最朴素的 Java Web 链路讲清楚让你少走几个我当年走过的弯路希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →