ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java在线音乐管理系统毕设复现:JSP+Servlet+MySQL全流程解析

Java在线音乐管理系统毕设复现:JSP+Servlet+MySQL全流程解析 简介这是一份基于Java的在线音乐试听管理系统的毕业设计论文文档适合计算机专业学生用于毕设参考或课程项目学习尤其适合希望掌握JSP、Servlet、MySQL及Web前端技术整合的开发者。文档完整呈现了系统从课题背景、可行性分析、需求设计到代码实现的论文结构系统基于B/S模式融合MySQL、Servlet、JSP与HTML技术针对游客、会员、管理员三类角色设计了歌曲显示、排行榜、在线注册、歌曲增删查改及会员管理等功能模块并对其实现流程和数据库交互做了系统性论述。资源为单个doc文件大小1.29MB内容包含郑州大学毕业设计论文正文、摘要及目录预览可帮助读者快速了解论文的论述框架与关键技术要点。目前已有50人学习对于准备毕设或需要撰写Java Web项目论文的同学可据此梳理技术选型、模块划分和开发流程减少从零搭建系统与查阅资料的精力消耗。1. 这份 Java 在线音乐管理系统论文2019 年的毕设现在照样能复现拿到手里的这份郑州大学毕业设计论文题目是「基于 Java 的在线音乐试听网的开发与设计」技术栈是 JSP Servlet MySQL典型的 2019 年 Java Web 课程设计路线。很多 java 课程设计案例源码 里装的都是这类项目但它比网上流传的残缺 demo 要完整得多——三类角色、十几项功能、从需求分析到软件测试全流程都有正好对应一篇能拿得出手的毕设论文该有的骨架。先说清楚这东西能解决什么。如果你正卡在毕设开题或者想用最短时间把 Java Web 全链路跑通这份文档的价值在于它把「需求分析 → 数据库设计 → 功能实现 → 软件测试」这条线完整地串起来了你不需要自己从零编需求也不用去拼凑零散的教学代码。适合两类人一是准备 Java 方向毕业设计的在校生需要一套能讲清楚、能演示、能答辩的完整项目二是想快速回顾 JSP/Servlet 老技术栈的开发者看它比看八股文要直观得多。当然2019 年的项目放在今天环境和工具都有变化MySQL 版本、Tomcat 版本、JDK 版本都要重新对齐。后面我会把复现过程中的版本匹配、代码落点、常见翻车原因一条条拆开讲。2. 技术选型与项目骨架为什么是 JSP Servlet MySQL环境怎么搭2.1 B/S 结构与 MVC 分层在这份毕设里的落法这套系统采用 B/S 模式浏览器作为客户端所有业务逻辑和数据库交互都集中在服务器端。选 B/S 而不是 C/S核心理由是部署简单——用户不需要安装任何客户端浏览器输入网址就能访问管理员维护也只需要改服务器上的代码。这在毕设场景里几乎是必然选择因为答辩演示时只需要准备一台笔记本加一个浏览器不用考虑客户端分发的问题。MVC 模式的应用要结合 JSP 时代的特点来看。当时的项目不像现在 Spring Boot 那样有强制的分层约束常见的做法是JSP 页面充当 View负责展示和收集请求Servlet 充当 Controller负责接收请求、调用业务逻辑、转发页面Model 层是 JavaBean DAO负责数据库操作。这份论文里的实现正是这个套路我在复现时建议尽量沿用不要试图把 Spring 塞进去否则论文内容和代码实现会对不上。理解这个分层对后面读代码非常关键。你会在 JSP 文件里看到大量的% %脚本片段这些在现在看来是反面教材但在 2019 年的毕设里是普遍写法。它的问题是业务逻辑和页面展示耦合在一起但好处是直观——打开一个 JSP 文件就能看到这个页面到底做了什么操作。我建议你在复现阶段先按原样跑通后面要优化时再考虑把脚本片段迁出去。2.2 开发环境搭建MyEclipse、Tomcat 与 MySQL 的版本匹配论文里用的是 MyEclipse Tomcat MySQL这套组合在 2019 年是主流现在复现时版本要对齐否则会遇到各种隐性问题。先说 JDK论文时代的主流是 JDK 1.8这个不要动JSP 2.3 和 Servlet 3.1 规范都以 JDK 8 为基础JDK 11 以上跑老项目反而容易出现兼容问题。Tomcat 建议用 8.5 或 9.0不建议用 Tomcat 10。原因在于 Tomcat 10 把javax.servlet包名改成了jakarta.servlet而这套代码里 import 的肯定是javax.servlet直接用 Tomcat 10 会报 ClassNotFoundException。这是我复现时踩过的第一个坑后面避坑章节会详细展开。MySQL 方面如果本地装的是 8.0要注意 JDBC 驱动必须用com.mysql.cj.jdbc.Driver而论文时代的驱动是com.mysql.jdbc.Driver这个差异会导致数据库连接失败。环境变量配置是新手最容易卡住的地方。JAVA_HOME指向 JDK 安装目录CATALINA_HOME指向 Tomcat 目录PATH里加上%JAVA_HOME%\bin。这些不配置好MyEclipse 里启动 Tomcat 时会直接报错而且报错信息往往让人摸不着头脑——大概率是一堆 ClassNotFound 或者端口异常实际根源就是环境变量没配对。2.3 项目目录结构与部署方式在这套代码里目录结构遵循传统的 Web 项目布局。src下放 Java 源码包括 Servlet 类、DAO 类、JavaBeanWebContent或WebRoot下放 JSP 页面、CSS、JS、图片等静态资源WEB-INF下放web.xml配置文件和依赖的 JAR 包。论文里的项目没有用 Maven所以 JAR 包是手动拷贝到WEB-INF/lib下的这种方式的优点是简单缺点是依赖管理全靠自觉少拷一个包就运行不起来。部署方式有两种我在复现时推荐用第二种。第一种是直接在 MyEclipse 里关联 Tomcat设置好 Server 后一键部署这种方式对新手最友好但缺点是把 IDE 和服务器绑定了换个环境就要重新配置。第二种是手动打 WAR 包放到 Tomcat 的webapps目录下启动 Tomcat 后自动解压部署这种方式更贴近真实生产环境的操作习惯而且出问题时定位更清楚。需要注意一个细节MyEclipse 2019 之后的版本对老项目的支持不算好如果安装后新建 Dynamic Web Project 时没有 JSP 模板可以手动建文件夹和文件不影响运行。核心依赖就是mysql-connector-java这个 JAR 包版本选 5.1.49 或 8.0.33 都行关键是和你本地的 MySQL 版本对应。3. 系统分析与数据库设计三类角色、十几项功能的权限划分与表结构3.1 需求分析游客、会员、管理员的功能边界这套系统的用户分为三类每类角色的功能边界必须划分清楚因为后面所有权限控制都基于这个划分。游客是未登录用户功能主要是浏览类的查看歌曲列表、查看排行榜、在线注册。游客不能进行任何修改操作也不能进入后台管理页面。会员是注册登录后的用户在游客的基础上增加了试听、收藏、评论等交互功能论文的核心功能是试听所以会员需要能播放歌曲并记录播放行为。管理员负责整个系统的运维功能包括歌曲查询、歌曲添加、歌曲删除、会员管理相当于拥有后台的全部操作权限。这三个角色的权限等级是递进的游客 会员 管理员。在代码实现层面权限控制通过 Session 对象完成——用户登录成功后把用户信息存入 Session每个需要权限的页面或 Servlet 先检查 Session 里有没有对应角色标识没有就跳转到登录页。这种控制方式是最基础的但也是毕设答辩时最容易讲清楚的一种。论文里提到实现的功能大约有十几个我梳理下来核心模块是歌曲展示、歌曲排行榜、在线注册、歌曲类别管理、歌曲信息管理、会员管理。这几个模块之间通过数据库表关联设计好表结构是整个系统的地基。3.2 数据库表设计用户表、歌曲表、类别表怎么建数据库设计分为概念结构设计和逻辑结构设计两步。概念结构设计一般用 E-R 图表达实体、属性和联系然后转换成关系模型。这套系统里最核心的实体是用户、歌曲、歌曲类别。它们之间的关系是一个类别下有多首歌曲一个用户可以对多首歌曲进行试听和评论。转换成具体的表需要四张基础表。我给出的是精简版的建表语句与实际系统的表结构对应-- 用户表 CREATE TABLE user ( uid INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, email VARCHAR(100), role INT DEFAULT 1 COMMENT 1-会员2-管理员, register_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 歌曲类别表 CREATE TABLE category ( cid INT PRIMARY KEY AUTO_INCREMENT, cname VARCHAR(50) NOT NULL UNIQUE, description VARCHAR(200) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 歌曲信息表 CREATE TABLE song ( sid INT PRIMARY KEY AUTO_INCREMENT, sname VARCHAR(100) NOT NULL, singer VARCHAR(100), category_id INT, play_count INT DEFAULT 0 COMMENT 试听次数用于排行榜, file_url VARCHAR(200), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (category_id) REFERENCES category(cid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里有几个设计要点值得展开。role字段用整数区分会员和管理员而不是单独建角色表是因为只有两级权限一张表外加一个字段足够答辩时也好解释。play_count字段是排行榜的数据来源每次用户点击试听时加一排行榜查询就是按这个字段降序排列。file_url字段存歌曲文件的相对路径指向服务器上的某个目录这样数据库里不会直接存大文件只存路径引用。外键约束方面song表的category_id关联category表的cid这个外键保证了歌曲一定属于某个合法类别。删除类别时要注意如果类别下还有歌曲外键约束会阻止删除所以管理员删除类别前需要先处理该类别下的歌曲这个逻辑要在前台页面上给管理员提示否则会直接报 SQL 异常。3.3 数据库连接方式JDBC 直连与连接池论文时代最常见的数据库连接方式是 JDBC 直连即每次需要操作数据库时通过DriverManager.getConnection()获取连接用完再关闭。这种方式逻辑简单、代码直观适合毕设项目的代码量但存在一个明显的性能问题每次请求都要创建和销毁连接高并发下开销很大。当时的常见做法是写一个统一的数据库连接工具类把驱动加载、连接获取、资源关闭封装起来。论文里的实现思路也类似。展示核心方法package com.music.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class DBUtil { private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/musicdb?useUnicodetruecharacterEncodingutf8; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(DRIVER); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws Exception { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(Connection conn, Statement stmt, ResultSet rs) { try { if (rs ! null) rs.close(); if (stmt ! null) stmt.close(); if (conn ! null) conn.close(); } catch (Exception e) { e.printStackTrace(); } } }这个工具类的逻辑很直白静态代码块里加载 JDBC 驱动类加载时执行一次getConnection()返回数据库连接close()方法统一关闭三个资源。注意 URL 里带了useUnicodetruecharacterEncodingutf8参数这是处理中文乱码的关键如果不加写入数据库的中文很容易变成问号。参数说明里有一点需要特别注意如果你本地数据库配置了密码需要把PASSWORD常量改成自己的密码。另外如果用的是 MySQL 8.0 驱动DRIVER要改成com.mysql.cj.jdbc.DriverURL 里建议加上serverTimezoneAsia/Shanghai否则会报时区错误。这些细节在论文里没有体现但复现时几乎一定会遇到。4. 核心功能实现登录、歌曲管理、排行与前台展示的关键代码4.1 登录与权限控制Session 与角色判断登录模块是整个系统的入口也是权限控制的基石。实现思路是用户提交用户名和密码Servlet 接收参数后调用 DAO 层查询数据库验证通过后把用户信息存入 Session然后重定向到对应页面。核心逻辑在 LoginServlet 里。package com.music.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.music.dao.UserDao; import com.music.entity.User; public class LoginServlet extends HttpServlet { private static final long serialVersionUID 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(utf-8); String username request.getParameter(username); String password request.getParameter(password); UserDao dao new UserDao(); User user dao.findUser(username, password); if (user ! null) { HttpSession session request.getSession(); session.setAttribute(loginUser, user); if (user.getRole() 2) { response.sendRedirect(admin/index.jsp); } else { response.sendRedirect(index.jsp); } } else { request.setAttribute(msg, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } } }这段代码有两个关键细节。第一个是request.setCharacterEncoding(utf-8)必须在读取任何参数之前调用否则从表单提交的中文用户名会乱码。第二个是登录成功后根据user.getRole()值判断跳转方向管理员进后台页普通会员进前台首页。Session 里存的是整个 User 对象而不只是用户名这样页面里可以随时展示当前用户的信息不用再查一次数据库。findUser方法是 UserDao 里的查询逻辑SQL 是SELECT * FROM user WHERE username? AND password?用 PreparedStatement 防止 SQL 注入。答辩时如果被问到安全相关的问题这里是一个很好的回答点——为什么用 PreparedStatement 而不是直接拼接字符串因为预编译可以避免注入攻击。4.2 歌曲类别管理后台增删改查的实现歌曲类别管理是管理员专属功能实现对歌曲分类的新增、修改、删除和查询。这个模块是典型的增删改查代码结构清晰适合作为新手入门的参考。类别管理涉及两个动作类别列表展示和类别操作请求处理。列表展示用 JSP 加 JSTL 标签完成不直接在页面里写 Java 代码。操作请求统一走 CategoryServlet通过method参数区分是新增、修改还是删除protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String method request.getParameter(method); if (add.equals(method)) { String cname request.getParameter(cname); String description request.getParameter(description); CategoryDao dao new CategoryDao(); boolean result dao.addCategory(cname, description); if (result) { response.sendRedirect(categoryServlet?methodlist); } else { request.setAttribute(error, 添加失败); request.getRequestDispatcher(admin/category_add.jsp).forward(request, response); } } else if (delete.equals(method)) { int cid Integer.parseInt(request.getParameter(cid)); CategoryDao dao new CategoryDao(); dao.deleteCategory(cid); response.sendRedirect(categoryServlet?methodlist); } }这里有一个设计值得学习用一个 Servlet 通过method参数处理多个操作比每个操作建一个 Servlet 要精简也方便在web.xml里只配置一个映射地址。删除操作执行成功后重定向到列表页避免了刷新页面时重复提交删除请求这是 POST-Redirect-GET 模式的简化版。4.3 歌曲信息管理与前台展示歌曲信息管理与类别管理类似但多了两个维度文件路径和试听次数。后台添加歌曲时管理员需要填写歌曲名、歌手、类别、文件路径等信息。前台展示时歌曲列表页按类别进行分类展示并提供试听按钮。前台歌曲列表的核心是分页查询。论文里的数据量不大但分页逻辑是答辩时的高频考点建议认真实现。常见做法是接收页码参数计算起始偏移量用 LIMIT 子句取当前页数据同时查询总数算出总页数public ListSong getSongsByPage(int pageNum, int pageSize) { String sql SELECT * FROM song ORDER BY create_time DESC LIMIT ?, ?; ListSong list new ArrayList(); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, (pageNum - 1) * pageSize); ps.setInt(2, pageSize); try (ResultSet rs ps.executeQuery()) { while (rs.next()) { Song song new Song(); song.setSid(rs.getInt(sid)); song.setSname(rs.getString(sname)); song.setSinger(rs.getString(singer)); song.setPlayCount(rs.getInt(play_count)); song.setFileUrl(rs.getString(file_url)); list.add(song); } } } catch (Exception e) { e.printStackTrace(); } return list; }这段代码的关键参数是(pageNum - 1) * pageSize这是分页查询最容易出错的地方。MySQL 的 LIMIT 子句第一参数表示偏移量第二参数表示返回行数。第一页时 pageNum 为 1偏移量是 0第二页时偏移量是 pageSize。如果忘记减一第一页的数据会被跳过。4.4 排行榜实现试听次数与排序逻辑排行榜模块是这份论文的亮点原理不复杂歌曲表里有一个play_count字段每次试听时加一排行榜就按这个字段降序排列取前 N 条。关键点在于「试听加一」这个动作的触发时机和实现方式。试听动作的前端实现是在歌曲列表页点击播放按钮时触发跳转或弹窗同时调一个 Servlet 接口来更新播放次数protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int sid Integer.parseInt(request.getParameter(sid)); SongDao dao new SongDao(); dao.incrementPlayCount(sid); Song song dao.findById(sid); response.sendRedirect(song.getFileUrl()); }incrementPlayCount对应的 SQL 是UPDATE song SET play_count play_count 1 WHERE sid ?。注意这里用的是字段自增而不是先查后改避免了并发下读到的旧值覆盖新值的问题在 MySQL 的默认隔离级别下这条 UPDATE 语句是行级原子操作的。排行榜页面查询时用SELECT * FROM song ORDER BY play_count DESC LIMIT 10取试听次数最高的十首。在本地测试时我一般会写一个 SQL 脚本批量插入几首歌曲并手动更新 play_count 值这样排行榜页面能直接看到效果。生产中试听次数的防刷问题比如刷新一次就加一在毕设阶段可以不做深入处理但答辩时要有意识——面试官或者答辩老师可能会问「怎么防止用户刷排行榜」准备好用 Session 或者 IP 限制的思路去回答就比答不上来强很多。5. 软件测试与避坑从能跑到能答辩的排查清单5.1 测试用例设计四类核心功能的边界验证这份论文有专门的软件测试章节包含管理员登录、添加歌曲类别、添加歌曲信息、删除会员信息四个测试实例。这个思路值得保留因为测试不是走过场而是在答辩时支撑「系统可靠性」的直接证据。设计测试用例时除了正常流程一定要覆盖异常输入和边界情况。管理员登录测试需要覆盖三类情况正确的用户名密码能登录成功错误的密码提示登录失败空用户名或空密码被拦截。添加歌曲类别测试需要验证合法类别名能添加成功重复类别名被数据库唯一索引拦截超长类别名被截断或提示。删除会员信息测试要验证删除存在的会员成功后列表减少一条删除不存在的会员时给出友好提示删除时数据库返回影响行数为 0 的情况不能报异常。这四类用例分别对应权限控制、表单验证、唯一约束、空结果处理。把这些测试结果截图保存放进论文的测试章节里比任何文字描述都有说服力。我在复现时会把每一类测试的运行环境Tomcat 版本、浏览器类型、数据库字符集和测试数据记录下来答辩时被追问「这个系统到底测过没有」直接把测试记录摆出来。5.2 避坑记录一JSP 页面中文乱码现象页面显示正常但向数据库插入中文数据后数据库里存的是乱码或者页面上取出来的中文变成问号。原因三层编码不一致——JSP 页面编码、HTTP 请求编码、数据库连接编码。JSP 文件头没有声明pageEncodingutf-8表单提交时浏览器按默认编码发送请求Servlet 读取时用的还是 ISO-8859-1数据库表字符集又是默认的 latin1三层对不上中文必乱。解决统一四个位置——JSP 文件头加% page contentTypetext/html; charsetutf-8 pageEncodingutf-8%Servlet 的doPost方法开头调用request.setCharacterEncoding(utf-8)数据库连接 URL 加useUnicodetruecharacterEncodingutf8建表时指定CHARSETutf8mb4。四管齐下问题基本不会再出现。5.3 避坑记录二Tomcat 10 启动后报 ClassNotFound现象本地安装的是 Tomcat 10部署项目后启动访问任何 JSP 页面都报java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet或者 Servlet 类无法加载。原因Tomcat 10 是 Jakarta EE 的起点Servlet API 的包名从javax.servlet迁移到了jakarta.servlet而项目的代码和web.xml里依然使用的是旧的javax.servlet包名导致类加载失败。解决最省事的方案是换回 Tomcat 9 或 8.5。如果想留在 Tomcat 10需要把所有代码里的 import 改成jakarta.servlet.*同时web.xml头的xmlns也要改成 Jakarta 命名空间。对毕设项目来说换版本是最快路径改包名的成本完全没必要。5.4 避坑记录三MySQL 8.0 驱动认证失败现象用论文里提到的 JDBC 代码连接本地 MySQL启动后提示Access denied for user rootlocalhost或者Unable to load authentication plugin caching_sha2_password。原因MySQL 8.0 默认的认证插件是caching_sha2_password而老版本 JDBC 驱动5.x 系列只认mysql_native_password两边对不上导致连接被拒。解决首选方案是把 JDBC 驱动换成 8.0.33同时DRIVER常量改为com.mysql.cj.jdbc.Driver。如果项目必须用老驱动可以在 MySQL 里执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;修改认证插件但这属于绕路方案不推荐。5.5 避坑记录四JDBC 资源泄漏导致连接耗尽现象系统运行一段时间后某些页面打开越来越慢最终报Too many connectionsTomcat 日志里全是连接超时。原因代码里获取了 Connection但在异常分支里没有关闭或者close()被提前 return 跳过了。MySQL 默认最大连接数是 151泄漏到一定数量后所有新请求都无法获取连接。解决代码里统一使用 try-with-resources 语法或者在 finally 块里关闭资源。对外层调用方法来说拿到 Connection 之后必须确保close()一定执行——我用的是一个简单的原则谁打开谁关闭打开和关闭在同一层方法里完成不把 Connection 往下传。同时给 MySQL 配置一个监控本地开发时看SHOW PROCESSLIST有没有大量 Sleep 状态的连接有就说明泄漏了。6. 进阶从论文代码到能演示的毕设三处值得改写的关键点6.1 把 JSP 里的脚本片段迁到 Servlet 与 DAO如果你把这份论文的代码完整跑通了打开任何一个 JSP 文件大概率会看到满屏的% %。这在 2019 年还算常规操作但现在答辩时被问到「为什么把业务逻辑写在 JSP 里」很难给出让人信服的回答。所以进阶的第一步就是把脚本片段迁出去。具体做法是JSP 里只保留 HTML 和 JSTL 标签数据准备逻辑全部放到 Servlet 里完成。比如歌曲列表页原来是在 JSP 里直接声明 List 变量、调 DAO 方法查数据改写后在 Servlet 里查好数据放到 request 或 session 里再 forward 转发给 JSPJSP 只用c:forEach遍历展示。改写完的代码结构会跟 Spring MVC 的模式接近答辩时讲起来你的架构思维会加分不少。6.2 给排行榜增加防刷机制论文里的试听次数是点一次加一次没有任何限制。如果答辩现场演示时你多点了两次刷新排行榜的名次就变了这会直接影响演示效果。我建议在试听接口里加一个简单的防刷判断基于 Session同一个用户对同一首歌五分钟内只计一次试听。HttpSession session request.getSession(); String key play_ sid; Long lastPlayTime (Long) session.getAttribute(key); long now System.currentTimeMillis(); if (lastPlayTime null || now - lastPlayTime 300000) { dao.incrementPlayCount(sid); session.setAttribute(key, now); }这段逻辑不复杂但能让你的系统在演示时「表现稳定」——不管点多少次排行榜只在第一次点击时变化。同时它也是一个很好的答辩话题展示了你考虑了实际的恶意行为场景。6.3 用 Git 管理版本并准备答辩演示脚本最后一个建议和代码无关但对毕设顺利通过很关键把整个项目纳入 Git 管理。把初始部署成功的版本标记为v1.0每完成一次重构打一个 tag。答辩前准备一页纸的演示脚本按「登录 → 添加类别 → 修改歌曲 → 查看排行榜 → 删除会员」的固定顺序走一遍确保每一个步骤都提前点过不要在现场临时操作。我曾经帮一个学弟调试类似的 JSP 项目他答辩前夜还在改代码原因是前一版能跑加了新功能之后登录页挂了但源码已经被覆盖找不回旧版。从那以后我每次做项目都会先把能跑的版本提交一次再动任何代码这个习惯帮我避开了无数次「改坏了但找不回来」的局面。希望你也能从这份论文里把该踩的坑先踩一遍然后把能跑通的版本稳稳握在手里后面的路就好走了。希望帮到你。本文还有配套的精品资源点击获取
返回列表