免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

JSP+Servlet+MySQL教务管理系统:部署、避坑与二次开发实战

JSP+Servlet+MySQL教务管理系统:部署、避坑与二次开发实战 简介一份面向Java Web初学者的教务管理系统毕业设计源码包基于JSPServletMySQL实现覆盖学生信息管理、课程分配、成绩记录等常见业务场景适合课程设计、毕业设计及入门学习者参考。压缩包共535个文件约9.87MB主要包含24个Java源文件与对应class编译文件、10个JSP页面、9个依赖jar包以及SQL数据库脚本、XML配置和样式脚本等可快速导入IDE搭建运行环境。已有1130人学习下载。资源内含完整可运行的项目工程附带数据库初始化脚本目录结构清晰便于对照理解前端展示、后端Servlet处理与MySQL数据交互的完整流程同时通过大量gif演示文件和jpg截图可辅助查看页面效果与操作过程对复现系统、二次开发具有实用价值。1. 教务管理系统(JSPServletMySQL)拿到手第一夜先别急着“能跑”教务管理系统JSPServletMySQL是毕业设计圈子里流传最广的经典组合之一标题里的技术栈已经把这套系统的底牌全亮出来了页面用JSP写请求跳转靠Servlet接数据沉在MySQL里。很多人第一眼嫌它老可真到答辩季才发现这套组合反而是最稳的——源码完整可运行模块边界清楚随便抽一个功能都能把“请求怎么走、数据怎么存”讲明白。它适合两类人一是JavaWeb刚入门的在校生想用最短时间把项目跑通并弄懂三层架构到底是怎么回事二是被导师催着交初稿、需要能演示能改能答问题的底子。这篇文章不聊抽象概念直接讲怎么把这个压缩包变成你电脑上能访问的网站再讲坑在哪、二次开发从哪下手。2. 先让项目在本地跑起来环境、目录与最小启动三步2.1 压缩包里到底有什么先按文件清单核对再决定从哪下手这类毕设压缩包虽然来自不同的作者但只要标题写着“jspservletmysql”解压之后的结构八九不离十。我一般建议上来先别急着点开源码先按文件清单过一遍心里有个数避免后面启动时缺东少西还不知道去哪找。常见文件布局如下表文件/目录常见形态用途数据库脚本.sql 文件或放在 sql/、database/ 目录建库建表、初始管理员账号数据项目源码.war 或整个工程目录含 src、WebContent/WebRootJSP 页面、Servlet 类、配置文件依赖包lib/ 目录内含 .jarJDBC 驱动、JSTL 标签库等说明文档readme.txt、环境配置.docx数据库账号密码、默认端口、管理员账号运行截图.png/.jpg 或 docx演示用截图答辩 PPT 可参考拿到包以后最优先找三样东西数据库脚本、数据库连接配置文件、readme。只要这三样齐了这个项目大概率能在半小时内跑起来。如果 readme 里直接写了“admin / 123456”这种默认账号建议先截图保存后面登录验证要用。这里有个容易翻车的点很多老包是 Eclipse 时代的目录结构WebContent .classpath直接用新版 IDEA 导入会提示“Project 结构不兼容”。遇到这种情况不要慌IDEA 里用“Import Project”选好源目录或直接新建空项目再把 src 和 WebContent 复制进去问题都不大。具体的处理方式在第 5 章的避坑清单里再展开。2.2 JDK、Tomcat、MySQL 版本怎么选照着这套组合装能跑且不出幺蛾子选版本是这类老项目最容易踩雷的地方。JSPServlet 时代的老代码对运行环境的兼容性远没有你想象的那么强新版 Tomcat、新版 JDK 不是不能用但你得付出额外的适配成本。最稳妥的组合是JDK 1.88u202 或更早的 8u191 都行Tomcat 8.5.x 或 9.0.xMySQL 5.7 或 8.0.xIDEA 2020 到 2022 之间的版本或 Eclipse 2020-06为什么不用 Tomcat 10因为 Tomcat 10 把javax.servlet包名换成了jakarta.servlet老项目里的WebServlet、HttpServlet全都会编译失败。这就是 5.1 里讲的第一个坑。为什么不用 JDK 17因为老代码里若用了过时的反射、字节码操作或者某些 IDE 插件在 JDK 17 下会报模块访问错误对零基础来说排查成本太高。MySQL 8 能用但连接驱动和 URL 参数得调整第 4.4 节专门讲。安装好之后先做一次环境自检在命令行里跑这几个命令java -version mvn -v mysql --version正常输出里各版本号能对上就行。没有 Maven 的项目也正常很多毕设包是直接把 jar 塞在 lib 目录里用 IDE 的 Libraries 导入不经过 Maven 构建。这一步的意义在于确认你的环境变量没配错以及确认 MySQL 服务真的起来了——很多人装完 MySQL 启动失败后面项目连不上库排查了半天才发现服务都没开。2.3 导入数据库只用 MySQL 命令行和 Workbench 两步不依赖 Navicat拿到 .sql 脚本后用 MySQL 自带工具导入最省事不用去管客户端连不连得上的问题。先把数据库建出来再导入脚本mysql -u root -p然后在 MySQL 命令行里执行-- 1. 建库字符集统一用 utf8mb4避免中文乱码 CREATE DATABASE IF NOT EXISTS edu DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; -- 2. 切到刚建的库 USE edu; -- 3. 导入脚本路径别带中文否则可能识别失败 SOURCE D:/dev/edu/sql/edu.sql;SOURCE后面跟的是你解压出来的 .sql 文件的绝对路径。执行完之后用SHOW TABLES;看一下有没有表。能看到t_user、t_course之类的表名就说明导入成功了。如果你的脚本里没有CREATE DATABASE语句就先手动建库再 source如果脚本里已经建库了就别重复建直接SOURCE即可。不想敲命令行的用 MySQL Workbench 也可以左侧导航栏右键“Create Schema”建库然后Server Data Import Import from Self-Contained File选中 .sql 文件Default Target Schema选刚建的库点 Start Import 就行。两种方式效果一样区别只在于 Workbench 对超大 .sql 文件的导入速度慢一些毕设这种几 MB 的脚本完全没压力。导入时最常报的错是Unknown database或Access denied前者是建库步骤没做或库名不一致后者是密码输错或账号没有远程权限按提示处理即可。2.4 配置 Tomcat 并启动IDEA 里的一杯咖啡步骤项目导入 IDEA 并装好 Tomcat 后配置运行方式是最关键的一步。以 IDEA 为例依次操作File Project Structure Artifacts点加号新建一个Web Application: Exploded把 WebContent或 webapp目录指定为 Web 根目录然后在Run Edit Configurations里点加号选Tomcat Server Local在Deployment页签里把这个 Artifact 加进去Application context填/edu。这里的几个参数解释一下Application context是访问路径的前缀填/edu后启动完浏览器访问地址就是http://localhost:8080/edu/login.jspHTTP port默认 8080如果被占用改成 8090、8081 都行但要和后面访问地址保持一致On frame deactivation建议选Update resources改 JSP 不用重启 Tomcat省下大量等待时间配置好后点启动按钮看控制台输出。当出现Server startup in [xxx] milliseconds时Tomcat 就起来了。打开浏览器输入 readme 里写的登录页地址能显示页面并登录成功说明整条链路——JSP→Servlet→DAO→MySQL——已经打通。登录页面出来了但你还不清楚它内部是怎么串起来的下一章就跟住一次登录请求把整个架构拆开看。这也是答辩时老师最喜欢问的部分。3. 把 JSPServletMySQL 三层架构拆开跟住一次登录请求看全流程3.1 请求从哪里来JSP 页面和它的表单跑通归跑通答辩时老师最常问的一句话是“登录这个功能数据是怎么从页面到数据库的”你要能顺着代码把这条链路讲出来。所有流程的起点都在 JSP 页面里一个典型的登录页核心代码长这样% page contentTypetext/html;charsetUTF-8 languagejava % html body form actionLoginServlet methodpost 用户名input typetext nameusername/ 密码input typepassword namepassword/ button typesubmit登录/button /form /body /html注意两个关键点actionLoginServlet和methodpost。action决定请求发到哪个 Servlet实际是 URL 映射路径WebServlet(/LoginServlet)注解或 web.xml 里的servlet-mapping决定methodpost决定参数放在请求体里而不是 URL 问号后面。密码这种情况必须用 post不然地址栏会直接暴露明文密码浏览器历史记录里一查一个准。name属性的值username、password是后面 Servlet 取参数时的唯一依据写成别的名字Servlet 里getParameter就取空了。这一层看懂了你会发现 JSP 本质上就是一个能嵌 Java 代码的 HTML 模板用户看到的是页面浏览器拿到的是纯 HTML 文本。3.2 中间那一跳Servlet 如何接管请求、调 DAO 再决定往哪跳表单提交后请求到达 Servlet。Servlet 在这套架构里扮演“调度员”的角色收参数、调业务、决定页面往哪走。看一段简化后的登录 ServletWebServlet(/LoginServlet) public class LoginServlet extends HttpServlet { Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. 接收页面传过来的参数注意 name 和 getParameter 一致 String username req.getParameter(username); String password req.getParameter(password); // 2. 调用 DAO 层查询数据库 UserDao userDao new UserDao(); User user userDao.findByUsernameAndPassword(username, password); // 3. 根据结果决定跳转方向 if (user ! null) { // 登录成功把用户信息存进 session再重定向到首页 req.getSession().setAttribute(loginUser, user); resp.sendRedirect(index.jsp); } else { // 登录失败带错误提示请求转发回登录页 req.setAttribute(msg, 用户名或密码错误); req.getRequestDispatcher(login.jsp).forward(req, resp); } } }这段代码里有两个很容易被问倒的细节。第一resp.sendRedirect(index.jsp)和req.getRequestDispatcher(login.jsp).forward(req, resp)有什么区别sendRedirect是重定向浏览器地址栏会变成index.jsp相当于浏览器重新发了一次 GET 请求两次请求之间 request 对象不共享forward是请求转发地址栏还是login.jsp但页面内容已经换成了目标资源整个过程只有一次请求。毕设里的登录成功后跳首页基本都用重定向因为刷新页面不会重复提交登录表单这是个很实用的行为差异。第二req.getSession().setAttribute(loginUser, user)这行解决了“登录后怎么记住我是谁”的问题。session 是每个浏览器会话独立的存储区域登录成功后把 user 对象塞进去后续任何页面都能通过session.getAttribute(loginUser)取出来做权限判断。如果这一步漏了即使登录成功跳转后依然不知道当前用户是谁权限控制完全失效。3.3 数据落库与读回DAO 层和 JDBC 连接怎么写Servlet 里没有直接写 SQL而是调了UserDao这是为了把数据库操作和请求控制分开。DAO 层Data Access Object是这套架构里离 MySQL 最近的一层看一个典型实现public class UserDao { public User findByUsernameAndPassword(String username, String password) { Connection conn null; PreparedStatement ps null; ResultSet rs null; try { // 1. 加载驱动不同 MySQL 版本驱动类名不一样详见 4.4 Class.forName(com.mysql.jdbc.Driver); // 2. 建立连接url 里带上编码参数否则中文乱码 String url jdbc:mysql://localhost:3306/edu?useUnicodetruecharacterEncodingutf8; conn DriverManager.getConnection(url, root, 123456); // 3. 预编译 SQL用 ? 占位符防止 SQL 注入 String sql select * from t_user where username? and password?; ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); // 4. 执行查询并封装结果 rs ps.executeQuery(); if (rs.next()) { User user new User(); user.setId(rs.getInt(id)); user.setUsername(rs.getString(username)); user.setRole(rs.getString(role)); return user; } } catch (Exception e) { e.printStackTrace(); } finally { // 5. 逆序关闭资源连接不关会导致连接池耗尽 if (rs ! null) try { rs.close(); } catch (Exception e) {} if (ps ! null) try { ps.close(); } catch (Exception e) {} if (conn ! null) try { conn.close(); } catch (Exception e) {} } return null; } }这段代码有三个点必须能说清楚。第一为什么要用PreparedStatement而不是Statement因为?占位符会让数据库对参数做预编译处理用户输入的单引号、or 11这些 SQL 注入痕迹会被当作字符串内容而不是新的 SQL 语法这是老项目里最低成本的防线。很多流传的毕设源码直接用字符串拼接 SQL你在答辩前把关键查询改成预编译本身就是个可以写进论文里的“安全改进点”。第二Class.forName(com.mysql.jdbc.Driver)这行负责把 MySQL 驱动加载进 JVM。MySQL 8.0 时代这个类名已经变了详见 4.4 节这里先记住“驱动类名和 jar 包版本强相关”。第三finally 块里逆序关闭ResultSet、PreparedStatement、Connection。Java 的老版 JDBC 里连接是稀缺资源不关闭的话连接数耗尽后系统会假死表现就是“用着用着突然卡住重启 Tomcat 就好了”。如果你看到源码里没有这段资源回收直接抄上面的写法补上这算一个能写进论文的优化点。3.4 核心表设计与数据流“骨架”和“动脉”一次看懂数据库这边教务管理系统再简单也要有几张核心表。下面是一份常见的建表结构字段名称可能不同职责基本一致表名关键字段职责t_userid, username, password, role, real_name统一存放管理员、教师、学生账号用 role 区分身份t_studentid, user_id, student_no, class_name, major学生学籍信息和 t_user 通过 user_id 关联t_teacherid, user_id, teacher_no, title, dept教师信息同样关联 t_usert_courseid, course_name, credit, teacher_id课程基本信息teacher_id 关联教师t_select_courseid, student_id, course_id, score选课关系表含成绩字段一个学生可选多门课这几张表的关系用一句话就能讲清一个用户t_user通过 role 字段区分身份一个教师t_teacher可教多门课t_course一个学生t_student可选多门课一门课也能被多个学生选学生和课程是多对多关系中间用 t_select_course 这张关系表来解耦成绩字段就放在关系表上。把登录请求串起来看数据流是这样的浏览器提交表单 → Tomcat 根据 URL 找到 LoginServlet → Servlet 调 UserDao.findByUsernameAndPassword → DAO 用 JDBC 连接 MySQL 执行预编译 SQL → 结果集封装成 User 对象逐层返回 → Servlet 将 User 存入 session 并重定向到首页。这条链路在任何模块里都成立比如选课模块选课页面提交 → SelectCourseServlet → SelectCourseDao → 往 t_select_course 插一条记录 → 跳回选课列表。理解这一条整个系统的代码阅读能力就过关了答辩时的框架图也可以按这条链路来画。4. 二次开发之前先改好这 4 个“必调配置”4.1 数据库账号密码在哪个文件改找不到配置文件才是第一次翻车跑通项目后第一件事把数据库账号密码改成你自己的。这类老项目的配置位置通常在三个地方之一src 目录下的jdbc.properties、db.properties或者一个叫DBUtil.java的工具类里。前面 readme 里如果没写用 IDEA 全局搜索DriverManager.getConnection或jdbc:mysql就能快速定位。jdbc.properties形态的配置长这样# 数据库驱动类名MySQL 5.x 用这个8.x 改成 com.mysql.cj.jdbc.Driver jdbc.drivercom.mysql.jdbc.Driver # 连接地址localhost 为本机3306 为 MySQL 默认端口edu 为库名 jdbc.urljdbc:mysql://localhost:3306/edu?useUnicodetruecharacterEncodingutf8 jdbc.usernameroot jdbc.password123456如果是DBUtil.java里直接写常量格式类似改起来原理一样。改完之后建议顺手验证 MySQL 账号本身能连接打开 Navicat 或 MySQL Workbench用同样的账号密码和库名测一下连接。我见过不少情况是项目代码里密码写对了但 MySQL 里这个账号压根没有这个库的权限导致启动后一直报“Access denied”。确认顺序应该是MySQL 服务在跑 → 账号密码能进 → 库名存在 → 代码里的连接信息一致。这四步串下来数据库层基本不会再有意外。4.2 端口和上下文路径8080 被占用、URL 进不去的解决套路老项目的端口问题几乎人人都会遇到。Tomcat 默认占 8080你电脑上如果装了别的服务或另一个 Tomcat 实例没关启动就会报Port 8080 was already in use。这时有两个选择杀掉占用进程或者改 Tomcat 端口。改端口的文件在 Tomcat 安装目录的conf/server.xml!-- 把 port 改成 8090redirectPort 保持不变HTTPS 端口一般不用动 -- Connector port8090 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /改完重启 Tomcat访问地址同步变成http://localhost:8090/edu/login.jsp。这里有个容易被绕进去的点IDEA 里启动 Tomcat 时有一个“HTTP port”和一个“JMX port”有时候是 Tomcat 自带配置和 IDEA 配置两套端口叠加。以 IDEA 的 Run Configuration 里显示的端口为准改 server.xml 时也要同步核对 IDEA 那边的端口设置不一致会导致“IDEA 显示启动成功但浏览器打不开”。上下文路径Context Path同样影响访问地址。IDEA 的 Deployment 页签里Application context填/edu那么所有 JSP 的相对跳转路径都要以/edu开头。这类老项目里 JSP 页面通常用相对路径或${pageContext.request.contextPath}拼接改了这个值之后很多写死的链接会 404所以上下文路径尽量不要随意改保持和源码里写死的一致才是省事的选择。4.3 乱码三件套JSP 页面、请求过滤器、JDBC URL 一个都不能少中文乱码是这类项目里出现频率最高的问题而且通常是“一个解决了下一个又冒出来”因为乱码的根源有三个不同位置。第一个是 JSP 页面本身的编码声明缺失或不一致解决办法是在页面最顶部写上% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %HTML 的meta charsetUTF-8也要加负责浏览器解析这一侧。第二个是 POST 请求参数的编码。Tomcat 8 之后的版本 GET 请求默认 UTF-8 问题不大但 POST 请求体里的中文必须由代码主动转码。最规范的做法是加一个全局过滤器所有请求都过一遍WebFilter(filterName encodingFilter, urlPatterns /*) public class EncodingFilter implements Filter { Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 请求参数统一按 UTF-8 解码 request.setCharacterEncoding(UTF-8); // 响应内容统一按 UTF-8 编码 response.setCharacterEncoding(UTF-8); response.setContentType(text/html;charsetUTF-8); // 放行到下一个过滤器或目标资源 chain.doFilter(request, response); } }这个过滤器是治本的手段比在每个 Servlet 里重复调setCharacterEncoding要干净得多。压缩包里如果已经这个过滤器那就说明乱码多半出在第三个位置。第三个是 JDBC 连接 URL 里没带编码参数。MySQL 连接时如果不指定字符集会按 MySQL 服务端的默认字符集交互最常见的就是 utf8 和 utf8mb4 不一致导致存取中文变问号。URL 里加上?useUnicodetruecharacterEncodingutf8就能解决。注意 utf8mb4 是 utf8 的超集如果建库时用了 utf8mb4URL 里写characterEncodingutf8是可以正常通讯的反过来不行。三条都检查完JSP 整个链路的中文才会彻底正常。4.4 JDBC 驱动与 MySQL 版本匹配5.x 还是 8.x 的答案连接 MySQL 的驱动 jar 包是这套系统里最容易“带错货”的依赖。压缩包里自带的 lib 目录通常放的是mysql-connector-java-5.1.x.jar它对应 MySQL 5.x 时代。如果你的电脑装的是 MySQL 8.0启动时大概率会报ClassNotFoundException: com.mysql.jdbc.Driver或Communications link failure。原因在于MySQL 8.0 之后官方驱动包升级为mysql-connector-java-8.0.x.jar驱动类名从com.mysql.jdbc.Driver改成了com.mysql.cj.jdbc.Driver同时连接 URL 还要求显式声明serverTimezone否则报时区错误。解决方案有两种。第一种把 lib 里的旧驱动删掉换成 8.0.x 的mysql-connector-java-8.0.30.jar之类然后全局搜索com.mysql.jdbc.Driver改成com.mysql.cj.jdbc.DriverURL 加上serverTimezoneAsia/Shanghai。第二种不换驱动去 MySQL 官网下载页找 5.1.49 版本这是 5.x 系列的最终版本能兼容 MySQL 8.0 服务端保留旧驱动类名只改 URL 加时区参数。两种方案我倾向第一种因为新驱动持续维护且cj驱动对 8.0 新特性支持更好。判断你现在用的是哪版驱动看 lib 目录下的 jar 包文件名就行文件名带着8.0.x就是新版带着5.1.x就是旧版。不要在ClassNotFoundException里纠结太久这类报错十有八九就是 jar 版本和 MySQL 服务端版本不匹配。5. 运行期避坑仓库翻车现象、根本原因、解决步骤5.1 Tomcat 10 报错javax.servlet 包名不存在现象项目在 IDEA 里编译能过但启动 Tomcat 时报java.lang.NoClassDefFoundError: javax/servlet/ServletException或者大量The import javax.servlet cannot be resolved的编译错误。原因2021 年发布的 Tomcat 10 把所有javax.servlet.*包迁移到了jakarta.servlet.*。老的 JSPServlet 项目全部基于javax命名空间编写在 Tomcat 10 下连编译器都过不去。这类毕设源码诞生在 Tomcat 8/9 时代两者不兼容。解决最省事的是把 Tomcat 版本换成 8.5.x 或 9.0.x不用改任何代码。如果你已经装好 Tomcat 10 不想动也可以全局搜索替换源码和 JSP 中所有javax.servlet改成jakarta.servlet但 JSP 里隐式对象如request、session不涉及包名改动量其实不大。还有个折中办法项目里用到的 Servlet 注解和 API 并不多逐个文件的 import 替换即可但不建议因为 Tomcat 10 后续还会牵扯 EL、JSTL 版本兼容问题折腾成本远高于装个老版本。5.2 换了 MySQL 8 后报 ClassNotFoundException: com.mysql.jdbc.Driver现象项目启动后浏览器正常打开但一登录就报ClassNotFoundException: com.mysql.jdbc.Driver后台堆栈里能清晰看到这一行。原因lib 目录里的旧版驱动mysql-connector-java-5.1.x.jar不含com.mysql.jdbc.Driver类不是5.1.x 其实包含这个类但在 MySQL 8.0 服务端下旧驱动的握手协议已不受官方支持很多场景下类加载阶段就中断了。更常见的真实原因是项目 lib 里确实没有这个驱动 jar或者 IDEA 没有把 lib 目录打包进部署产物——Artifacts 配置里漏加了“你所见的 lib 目录不等于部署目录里的 lib”。解决先确认 lib 里有没有 jar有去Project Structure Artifacts Output Layout里检查lib是否在WEB-INF/lib下。缺了就右键 lib 目录选 “Add Copy of”。换成 8.0.x 驱动后把类名改成com.mysql.cj.jdbc.Driver即可。这个坑的隐蔽之处在于很多教程只说改驱动没说检查 IDEA 的 Artifacts 打包配置而后者才是大头。5.3 启动时报 serverTimezone 错误时区问题比你想的更普遍现象Tomcat 启动正常但第一次访问数据库相关功能时控制台抛The server time zone value йʱ is unrecognized or represents more than one time zone。原因MySQL 8.0 的 JDBC 驱动在建立连接时会读取服务器时区而国内 MySQL 默认时区通常是CSTChina Standard Time在驱动校验时识别失败。老版驱动不校验这一项所以用 5.1.x 驱动时大概率遇不到这个错换了 8.x 驱动就冒出来了。解决在 JDBC URL 末尾追加serverTimezoneAsia/Shanghai整个 URL 形如jdbc:mysql://localhost:3306/edu?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai如果你不想改代码也可以在 MySQL 命令行执行set global time_zone 08:00;临时生效但下次重启 MySQL 服务又变回去所以还是改 URL 最可靠。5.4 JSP 页面上的中文全是问号现象页面标题、按钮文字、菜单全是???但数据库里存进去的中文是正常的。原因JSP 文件本身的编码和运行时的响应编码不一致。最常见的是 JSP 文件用 UTF-8 保存但页面顶部只有contentTypetext/html; charsetGBK或者反过来。另一个可能JSP 页面没有pageEncoding指令时服务器按默认 ISO-8859-1 解析文件内容。解决打开出问题的 JSP检查顶部三处是否一致——文件右下角的编码格式通常显示 UTF-8、% page pageEncodingUTF-8 %、contentTypetext/html; charsetUTF-8。三者都改成 UTF-8 后保存。注意 IDEA 里改完编码格式后要确认弹窗里选 “Reload”重新加载而不是 “Convert”转换。选 Convert 会把已有的中文字符重新按新编码解析反而搞乱内容选 Reload 是只改读取方式不动文件字节这才是正解。5.5 访问地址 404 或白屏多半是 Context Path 和端口两处没对齐现象Tomcat 启动成功但浏览器输入http://localhost:8080/login.jsp报 404或者访问后一片空白什么都没有。原因这类问题通常是三个地方没对齐——部署的上下文路径、端口、以及 JSP 页面链接里写死的路径。老项目经常在 JSP 里写死${pageContext.request.contextPath}拼接资源路径如果部署时的 Application context 和源码里的预期不一致CSS、JS 加载不出来页面就显示成白屏但 HTML 结构在。解决先确认 IDEA 的 Deployment 里Application context具体值浏览器按“端口 该值 资源路径”访问。比如 context 是/edu登录页地址就是http://localhost:8090/edu/login.jsp。如果还是 404检查 Tomcat 控制台最后一段日志里Deployment of web application archive ... has finished前一行有没有报错常见的 Resources 加载异常会直接说明是哪个库缺失。白屏的话按 F12 看 Network 标签找到加载失败的 CSS/JS 文件然后回源码里全局搜索这个文件的引用路径改成/edu/css/bootstrap.min.css这种相对工程根的写法。6. 让“教务管理系统”看起来像“你的作品”低成本高回报的改动顺序毕设答辩最尴尬的场景是老师打开你的系统说“这个界面我在隔壁组见过三个一样的”。跑通源码只是第一步想在有限时间内让老师觉得这是独立完成的按下面的顺序做三个改动。第一步改掉最显眼的身份信息。登录页、首页顶部的系统名称、版权信息里的年份和字符全局搜教务管理系统改成带你自己学号或名字变体的系统名比如“XX 大学教学管理平台”。这一步纯文本替换五分钟搞定视觉效果却是很显著的。第二步把“学生选课”模块的数据流换成自己重写的版本。不要直接照抄源码里的写法改成用 Ajax 提交并显示结果这一步能让你在答辩时多讲两分钟“异步刷新如何改善用户体验”。核心代码也就几十行前端发 GET 请求到选课 ServletServlet 返回 JSON前端渲染结果。相比原来的表单整页刷新这个改进足够成为你系统的记忆点。第三步加一个“选课统计”页面用 ECharts 展示各课程选课人数柱状图。后端写一个统计 SQL 查出每门课的选课数量转成 JSON 输出前端引入 ECharts 的 CDN把 JSON 数据渲染成图表即可。这一步技术难度低但视觉效果强老师看到“可视化”三个字就会眼前一亮。交付前最后一小时按这三条习惯过一遍全局搜root和123456确认数据库密码不是压缩包里默认的导出最新的 .sql 文件替换压缩包里的旧脚本否则老师部署时连不上库启动一次“干净版本”——换到未装过任何环境的电脑或清空 Tomcat 后重新跑一遍确保不是只在你的 IDEA 里能跑。做完这些这个项目才算从“别人毕业设计的压缩包”变成“你能讲清楚细节的毕业设计”。我这些年带的学弟学妹里凡是吃透了登录这条链路、亲手跑完三个改动的人答辩没有一个被问倒的。最后一个习惯每改完一个功能就把运行截图存档最后一版论文插图就有着落了不用临到交稿再回翻页面。希望帮到你。本文还有配套的精品资源点击获取
返回列表