简介:这是面向Java课程设计及期末大作业场景的校园管理系统完整项目,基于JavaWeb技术栈实现,配有可直接导入的数据库脚本。资源定位清晰,适合需要完成高校教务、学生信息等常见管理模块的在校学生参考。包内共有20个文件,压缩包仅1.33MB,包含SQL数据库脚本、XML配置、PNG运行截图、Markdown说明及IDE工程文件等,结构精简,便于快速导入IDE运行。源码已经本地编译通过,助教老师审定,评审得分95分以上,难度适中,可用于理解JavaWeb分层设计、Servlet/JSP或相关框架的基础整合。数据库脚本与代码配合完整,能够还原系统运行环境,适合在课程验收前用来对照排错、梳理业务流程。目前已有108人学习下载,作为期末设计参考或提升项目完整度,都有一定实用价值。
1. 拿 JavaWeb 课设凑不出页面?这套校园管理系统源码把“高分设计”拆给你看
又到课设季,后台私信里问得最多的就是“有没有 JavaWeb 完整项目”。说实话,校园管理系统在课设选题里属于“既不出格、又能把 JavaWeb 核心考点全带出来”的那一类,但很多同学卡在同一个地方:前端页面拼凑感太强,后台逻辑和数据库表对不上,答辩时一跑就报 500。这套基于 JavaWeb 的智慧校园管理系统源码 + 数据库资源,本地编译过、可运行,评审分能到 95 分以上,正适合想找一份“完整可跑、结构清楚、能讲明白”的 JavaWeb 课设来拆解复现的从业者和学生。它覆盖了从登录鉴权、信息管理到数据统计的完整闭环,难度适中,拿来二次开发做毕业设计打底也完全可以。
2. 拆项目结构:先从压缩包里认识这份“校园管理系统”源码的底细
2.1 项目整体轮廓:Maven 结构、JDK 版本和分层思路
拿到压缩包后,先别急着双击导入 IDEA。先把目录结构在文件管理器里展开,弄清楚里面有几个子工程、谁依赖谁,这决定了你后续配置 Tomcat 和数据库时会不会翻车。这套资源根目录下能看到smart-campus-system-master、smart_campus-master、image、campus.sql、.idea、module_campus、README.md这些条目,其中smart-campus-system-master和smart_campus-master通常是一份主项目的两种命名拷贝,实际编译时用其中一个即可,别一起导入导致 Maven 冲突。
文件里的campus.sql就是整套系统的数据库初始化脚本,它直接决定了系统能跑哪些功能模块。按常见做法,我一般会先打开README.md确认项目说明,再进module_campus或smart-campus-system-master内部看pom.xml,确定依赖版本和打包方式。这类 JavaWeb 校园管理系统多数采用 Servlet + JSP + JDBC/MyBatis + MySQL 的组合,前端会配套 Bootstrap 或 LayUI 这类成熟样式库——因为课设要求“页面好看”,纯手写 CSS 很难在短时间内达到评审要的效果。
# 解压后先在终端里看目录树(Windows 用 tree /F,macOS/Linux 用 tree -L 2) tree -L 2 ./smart-campus-system-master执行这条命令后,你应该能直观看到标准 Maven Web 工程的影子:src/main/java下按controller/service/mapper/entity分包,src/main/webapp/WEB-INF下放着 JSP 页面和配置文件。判断一份 JavaWeb 课设源码质量高低,最粗暴的标准就看 Controller 层是否瘦、Service 层是否做了事务边界划分、SQL 是写在 XML 里还是散落在 Java 字符串里。这套资源既然能拿到 95 分以上评审分,分层基本是按主流规范来的。
2.2 核心依赖和技术栈选型:为什么这种组合最适合做课设
看 JavaWeb 项目,第一件事就是打开pom.xml查依赖树。课设项目不会用太新的框架版本,因为评审老师看的不是“谁用的版本新”,而是“基础功扎实不扎实”。这套系统如果用到了 Servlet 3.0+、JSTL、MySQL Connector/J 和 MyBatis(或 DBUtils),那版本适配性就很好——Tomcat 8.5/9.x、JDK 1.8 是它最舒适的运行环境。
<!-- pom.xml 里通常会看到这几个核心依赖,版本号可以根据本机环境微调 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency>上面这段依赖配置说明几个关键点:provided作用域的 Servlet API 意味着运行时要靠 Tomcat 容器提供,编译时不会被一起打进 WAR 包;MySQL 驱动用的 5.1.49 适配 MySQL 5.7 及以下,如果你本机装的是 MySQL 8.x,运行时大概率会报Public Key Retrieval is not allowed或驱动类加载异常——解决方法是升级驱动版本到 8.0.x,或者在 JDBC URL 后面拼useSSL=false&allowPublicKeyRetrieval=true。MyBatis 3.5.6 对应的是较稳定版本,适合课设这种“追求能跑通+能讲清楚原理”的场景。
如果这套系统没用 MyBatis 而是直接 JDBC,那pom.xml里会少很多配置,但 Service 层代码量会明显增加。无论是哪种,理解“前端发起请求 → Controller 接收参数 → Service 处理业务 → Mapper/JDBC 操作数据库 → 返回 JSP 渲染”这条链路是答辩时最基本的要求。
2.3 数据库视角先看功能边界:campus.sql 里装着哪些业务
打开campus.sql,直接用文本编辑器搜索CREATE TABLE,数一下表数量。校园管理系统的表大多围绕学生、教师、课程、班级、宿舍、公告这六类实体展开,表数量在 8~15 张之间比较合理。少于此数说明功能面偏窄,多于这个数可能是把请假、报修、选课等扩展功能也做进去了。
-- 常见的表结构片段,课设里几乎必出:学生表 + 用户表 CREATE TABLE `t_student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `stu_no` varchar(20) NOT NULL COMMENT '学号', `name` varchar(30) NOT NULL COMMENT '姓名', `class_id` int(11) DEFAULT NULL COMMENT '所属班级ID', `phone` varchar(15) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_stu_no` (`stu_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;这个表设计里有三个值得注意的细节:一是stu_no加了唯一索引,防止学号重复录入,这在业务上是硬约束;二是class_id用外键逻辑关联班级表但没有物理外键,课设里常用这种方式降低删除数据的耦合负担,答辩时可以说“用应用层保证引用完整性”;三是字符集用utf8mb4而不是utf8,为了存 emoji 和不生僻字——如果你本机 MySQL 字符集不一致,导入后中文乱码的概率会很高,趁早统一成utf8mb4省得后面返工。
3. 在 IDEA 里跑起来:环境配置、数据库导入和 Tomcat 部署全流程
3.1 JDK、MySQL、Tomcat 版本匹配是第一步,别忽略
见过太多人卡在“项目导入就红一片”这一步,回头一看是本机 JDK 版本太高或 Tomcat 版本太新,跟项目年代对不上。这套 JavaWeb 校园管理系统的目标运行环境很明确:JDK 1.8 + MySQL 5.7 + Tomcat 8.5。如果你本机已经装了 JDK 17 或更新版本,建议直接在 IDEA 里给这个项目单独指定一个 Project SDK 为 1.8——通过File → Project Structure → Project → SDK选择已经安装的 JDK 1.8,或者用 IDEA 自带的下载功能自动拉取。用高版本 JDK 编译老项目时,javax.xml.bind缺失、模块访问权限报错这类问题会接踵而来,不要在这一步偷懒。
MySQL 版本同理。如果你本机只有 MySQL 8.x,也不是不能跑,但要处理好驱动版本和认证插件两件事:把pom.xml里的 mysql-connector-java 版本提到 8.0.x;同时 MySQL 8 默认的caching_sha2_password认证插件会让老驱动认不出来,解决办法是在连接 URL 上配置allowPublicKeyRetrieval=true&useSSL=false,或者给项目单独建一个用mysql_native_password认证的数据库账号。我一般会顺手把 SQL 文件里的utf8和utf8mb4统一,避免后面页面显示“???”占位符。
下面列一张版本速查表,相当于一个“后悔药”,照着配就不会在环境上折腾一晚上:
| 组件 | 推荐版本 | 注意事项 |
|---|---|---|
| JDK | 1.8 | 高版本 JDK 会遇到 javax.xml.bind 等老 API 缺失问题 |
| MySQL | 5.7.x | 8.x 需升级驱动并调整认证插件 |
| Tomcat | 8.5.x | 9.x 兼容性尚可,但和部分老 JSP 语法有冲突 |
| Maven | 3.6.x | IDEA 自带的 Bundled 3.x 可以,不建议单独装太新版本 |
3.2 数据库导入:用命令行执行 campus.sql,别用 GUI 工具一股脑跑
IDE 的数据库面板里直接右键执行整个 SQL 文件虽然方便,但很多 GUI 工具默认不会切库,或者遇到底部有空行、注释里有特殊字符时容易半路报错。更稳的做法是先用 MySQL 命令行建库,再指定库导入。如果 SQL 文件里已经写了CREATE DATABASE和USE指令,那你只需要执行:
mysql -u root -p < campus.sql但更保险的拆法是分两步走——先手动建一个独立的库,再导入表和数据。这样即使 SQL 文件里没有USE语句也不会把数据灌错地方:
# 第一步:创建数据库(库名以项目 README 或 jdbc.properties 为准) CREATE DATABASE IF NOT EXISTS campus_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 第二步:在命令行指定库导入 mysql -u root -p campus_db < campus.sql导入完成后不要急着启动项目,先验证几类核心表的数据量是否符合预期。用SELECT COUNT(*) FROM t_user;看管理员账号在不在,用SELECT COUNT(*) FROM t_student;看学生数据条数。正常来讲,课设资源里会预置几百条学生数据和若干管理账号,如果发现数据量是 0,说明 SQL 文件里可能只有表结构没有数据,或者导入时INSERT语句被 GUI 工具的批量执行模式吞掉了错误——这时候要回看终端输出里的 WARNING。
3.3 配置数据库连接:找到 db.properties 或 jdbc.properties 并修改
这一步是整个配置过程中最容易踩坑的节点。项目的数据库连接配置一般集中在db.properties或jdbc.properties这类资源文件里,放在src/main/resources目录下,但有些老项目会把它放在WEB-INF/classes下。配置项里要改的永远是三件事:连接地址、账号、密码。
# jdbc.properties 核心配置,按本机环境修改 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/campus_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=123456关于serverTimezone=Asia/Shanghai这个参数——如果你的 MySQL 是 8.x,不加时区参数会在查询时间字段时直接抛异常;如果是 5.7 且没有该异常,保持默认即可。useSSL=false是老生常谈,因为开发环境的 MySQL 默认没有配 SSL 证书,驱动尝试建立加密连接反而会浪费时间、偶尔还会因为证书问题失败。改完这些配置后,建议在 IDEA 的 Maven 面板里执行clean,把之前的编译残留清掉,再执行package重新构建。看到BUILD SUCCESS之后,再进行下一步的 Tomcat 配置。
3.4 部署到 Tomcat:IDEA 里配置 Artifact 和启动项
在 IDEA 里运行 JavaWeb 项目,核心是让 Tomcat Server 认识你的 Web 项目。打开Run → Edit Configurations,新建一个Tomcat Server → Local。在Deployment选项卡里点+,选择Artifact,这里要注意选xxx:war exploded而不是直接选war——exploded 模式让 IDEA 直接把编译后的类、资源同步到 Tomcat 的 webapps 下,修改 JSP 或 Java 代码后不需要重新打 war 包就能热部署,对调试课设项目来说体验好很多。
# 启动前确认端口和 Tomcat 运行目录 # 默认 8080 端口,如果被占用可以改成 8081 或 8090 # edit configurations -> Tomcat Server -> HTTP port / JMX port配置完启动 Tomcat,打开浏览器访问http://localhost:8080/,看到登录页就算成功了。如果报 404,先检查 Artifact 名称和访问路径是否一致——在 Deployment 选项卡里,Application context的值定义了访问前缀。比如它显示/smart_campus_war_exploded,那访问地址就要带这个路径。另外注意控制台日志里如果有SEVERE: Error configuring application listener这样的句子,多半是项目里某个类缺失,直接看 Caused by 后面的类全名定位,比满屏找错要高效得多。
4. 核心功能过一遍:登录鉴权、信息管理 JSP 与业务代码的对应关系
4.1 登录过程的技术走向:从 JSP 表单到数据库验证
课设答辩时你必然要演示“管理员登录”这个过程,而登录逻辑设计得是否完整直接决定评审老师对项目的第一印象。这套系统既然能拿 95 分,它的登录设计大概率不止“用户名密码比对成功跳转”这么简单,至少会包含角色判断、会话维护和密码加密这几层。先看 JSP 表单侧:
<!-- login.jsp 中核心表单,前端不做太多校验,交给后端处理 --> <form action="${pageContext.request.contextPath}/login" method="post"> <input type="text" name="username" placeholder="用户名" required /> <input type="password" name="password" placeholder="密码" required /> <select name="role"> <option value="admin">管理员</option> <option value="student">学生</option> <option value="teacher">教师</option> </select> <button type="submit">登 录</button> </form>这个表单里的role下拉框算是一个加分设计——系统能区分不同角色跳转到对应主页。很多低分课设只有一个用户表,全部用户走同一个页面,而好一点的系统会有t_user表存账户信息,再关联t_student、t_teacher等业务表。你答辩时如果被问到“不同权限怎么控制”,就可以拿这张表的结构来回答:user_type字段或独立的role_id字段决定了登录后跳转逻辑。
后端 Controller 层处理登录的代码通常会这样写:
@WebServlet("/login") public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String username = req.getParameter("username"); String password = req.getParameter("password"); String role = req.getParameter("role"); // 调用 Service 层做验证 User user = userService.login(username, password, role); if (user != null) { // 登录成功,把用户信息放进 session req.getSession().setAttribute("loginUser", user); // 按角色跳转到不同主页 resp.sendRedirect(req.getContextPath() + "/index_" + role + ".jsp"); } else { // 登录失败,回登录页并带错误提示 req.setAttribute("error", "用户名或密码错误,或角色不匹配"); req.getRequestDispatcher("/login.jsp").forward(req, resp); } } }上面这段逻辑有几个答辩亮点:用sendRedirect做 PRG(POST-Redirect-GET)模式,防止刷新页面时重复提交表单;把用户对象放进Session,为后面拦截器或过滤器做权限控制留了入口;失败时setAttribute+forward而不再 redirect,保证错误提示能带到 JSP 上显示。你自己写项目时,一定要在登录成功后的页面上把<%=session.getAttribute("loginUser") %>这行展示出来——既能证明会话机制有效,也是答辩时容易说清楚的点。
4.2 学生信息管理:一张表牵动的 CRUD 全链路
校园管理系统的核心演示模块基本落在“学生信息管理”上。从界面上看是表格分页展示学生列表,但内部流程跨了 JSP → Controller → Service → Mapper → MySQL 五层。拿着这份源码去复现时,你会找到类似StudentListServlet或StudentController的类,里面按操作类型拆分了action=list/add/update/delete参数或 RESTful 路径。以下是一段典型的查询列表代码,注意分页参数的处理方式:
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 页码,默认从第 1 页开始 int pageNum = Integer.valueOf(req.getParameter("page") == null ? "1" : req.getParameter("page")); int pageSize = 10; // 每页条数 // Service 层返回分页对象 PageResult<Student> pageResult = studentService.queryPage(pageNum, pageSize); req.setAttribute("pageResult", pageResult); // 转发到 student_list.jsp req.getRequestDispatcher("/WEB-INF/jsp/student_list.jsp").forward(req, resp); }PageResult这个类在课设项目里很常见,内部至少封装了total、list、pageNum、totalPages四个字段。JSP 页面上会通过 JSTL 的<c:forEach>遍历列表,并用<c:if>控制分页按钮的显隐逻辑。这里要提醒一句:如果是用 MyBatis 做的分页,不要在 Java 代码里手动LIMIT拼接——用 PageHelper 插件或直接在 XML 里写<if>条件的LIMIT #{offset}, #{pageSize}更规范。
增删改的操作你要注意一个约定俗成的安全设计:删除操作通常走 POST 而不是 GET。很多低分项目用<a href="student?action=delete&id=1">删除</a>,被爬虫或预加载脚本一访问就会误删数据。高分的做法是前端弹确认框,后端用 POST 提交或通过 JSP 里嵌隐藏表单提交:
<%-- 用表单提交 DELETE 请求(实际仍是 POST 包裹)--%> <form action="${ctx}/student?action=delete" method="post" onsubmit="return confirm('确认删除该学生?');"> <input type="hidden" name="id" value="${student.id}" /> <button type="submit">删除</button> </form>4.3 战报图表和数据统计:课设答辩时可以秀一手的视觉亮点
校园管理系统如果只有 CRUD,评分很难上 95。高分的另一个加分项通常会在“数据统计”和“可视化”上做文章——比如按班级统计男女生比例、按学院统计学生人数,用 ECharts 或 Chart.js 在前端渲染图表。如果这份源码里有statistics相关 Servlet 或 JSP 页面,那它的做法一般是后端查询聚合结果,转成 JSON 返回给前端 JS,再交给图表库渲染。
// 统计各个班级学生人数 public List<Map<String, Object>> countStudentByClass() { String sql = "SELECT c.class_name AS name, COUNT(s.id) AS value " + "FROM t_class c LEFT JOIN t_student s ON c.id = s.class_id " + "GROUP BY c.id ORDER BY value DESC"; return jdbcTemplate.queryForList(sql); }这段 SQL 里面的LEFT JOIN是刻意为之——保证没有学生的空班级也会出现在统计结果里,避免右表缺失导致图表少一块。你在答辩时如果被问到“为什么用 LEFT JOIN 而不是 INNER JOIN”,这就是标准答案。前端拿到 JSON 后通过ajax渲染,这部分代码基本是固定的,不用自己从零写。
5. 避坑指南:JavaWeb 校园管理系统从导库到答辩的常见翻车现场
5.1 中文乱码:JSP、Servlet、MySQL、Tomcat 四处编码不一致
现象:页面表单提交中文姓名后,数据库里存的是“???”或者显示乱码;数据库里查出来是正确中文,但页面显示乱码。
原因:这是课设项目里最典型的“四层编码不一致”问题——JSP 页面编码、Servlet 请求解析编码、MySQL 连接编码、Tomcat URI 编码四处各管各。最常见的是 JSP 页面设了UTF-8,但 Servlet 的request.setCharacterEncoding("UTF-8")没写在doPost第一行,导致前端传来的参数在 Servlet 里就已经是乱码,后续存库自然错。另一种场景是 Tomcat 8 及以上URIEncoding默认就是 UTF-8,但老项目从 Tomcat 7 迁移过来时,浏览器传 GET 参数的编码没有被正确解析。
解决:把四处编码拉齐。JSP 页面头部的pageEncoding和contentType都设为UTF-8;在 Servlet 的doPost/doGet最上面加request.setCharacterEncoding("UTF-8");response.setContentType("text/html; charset=UTF-8");JDBC URL 里加characterEncoding=utf8。配置完这三处,绝大多数乱码能立刻解决。
5.2 启动 Tomcat 时报 ClassNotFoundException 或 NoClassDefFoundError
现象:Tomcat 启动时不报错,但访问某个页面时 500,日志提示java.lang.ClassNotFoundException: com.mysql.jdbc.Driver或org.springframework.web.context.ContextLoaderListener找不到。
原因:这是 IDE 里常见的 Artifact 打包问题——依赖包没有同步到WEB-INF/lib下。在 IDEA 里,Web 项目的 Artifact 默认会收集 Maven 依赖并输出到 lib 目录,但如果 Artifact 类型建错、或者修改过pom.xml后没有重新构建,class 文件里引用的类就不会出现在运行环境里。
解决:打开File → Project Structure → Artifacts,找到这个 Web 项目的 Artifact,在Output Layout选项卡里确认WEB-INF/lib下面有所有 Maven 依赖列表。缺失的话,右键Available Elements里的Library,选择Put into WEB-INF/lib。然后重新执行 Mavenclean,再重启 Tomcat。
5.3 数据库连接报错:Access denied for user 或 Public Key Retrieval 不允许
现象:页面能打开,但一点登录就报Access denied for user 'root'@'localhost',或者 MySQL 8.x 下报Public Key Retrieval is not allowed for user。
原因:前者是db.properties里的密码拼错了,或者 MySQL 里 root 账号的访问权限只允许本机特定 socket 登录,你通过 TCP/IP 连接被拒。后者是 MySQL 8.x 的caching_sha2_password认证插件对老驱动不友好,连接握手时驱动要求服务器返回公钥但被拒绝。
解决:前者去 MySQL 命令行里执行ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';并把连接配置里的密码改一致;如果权限表有问题,再执行GRANT ALL PRIVILEGES ON campus_db.* TO 'root'@'localhost' FLUSH PRIVILEGES;。后者要么把驱动升级到 8.x,要么在 JDBC URL 上拼allowPublicKeyRetrieval=true。如果条件允许,创建一个独立账号campus_app只授权campus_db库,比直接用 root 安全得多,也因为“最小权限原则”能在答辩时加分。
5.4 项目导入 IDEA 后,Maven 依赖全部爆红
现象:pom.xml打开后一堆<dependency>上飘红条,Maven 面板里仓库更新失败,或者阿里云私服根本连不上。
原因:多数是本地 Maven 仓库没有这些 jar,且默认的中央仓库访问慢、被墙或超时。如果你所在环境访问默认 Maven 中央仓库不稳定,依赖下载就会悬在半路。
解决:在settings.xml里配置阿里云 Maven 镜像。改<mirror>节点,把mirrorOf设为central,url设为https://maven.aliyun.com/repository/public。改完后在 IDEA 的 Maven 面板点上Reload All Maven Projects,等进度条跑完。如果有些 jar 提示校验和失败(常见是 IDEA 缓存了损坏文件),找到本地repository目录下对应的.lastUpdated文件删掉重新下载即可。注意:这里只聊 Maven 镜像,本质上属于国内可直连的公共仓库,不是任何网络代理工具,别往那个方向想。
6. 部署到云服务器上的技巧:用宝塔面板把本地项目放上线
本地跑通只是第一步,课设答辩时如果能把系统部署到云服务器上、给出访问链接,评审老师的好感度会有质的提升。这里说一条成本最低的路线——用一台轻量服务器和宝塔面板,把本地 WAR 包或 exploded 目录直接部署到远程 Tomcat。
# 在服务器上安装 Tomcat 和 MySQL # 宝塔面板 -> 软件商店 -> 搜索 Tomcat8 / MySQL5.7 一键安装 # 安装完成后,设置数据库密码并导入 campus.sql # 上传工程 # 宝塔文件管理 -> 进入 /www/server/tomcat8/webapps # 将本地打包好的 war 文件直接拖拽上传上传完 WAR 后,Tomcat 会自动解压部署。这里有个关键操作:把/www/server/tomcat8/webapps/ROOT目录里默认的 index.jsp 覆盖或直接替换成项目的登录页。默认 ROOT 应用是 Tomcat 的欢迎页,想要让用户直接通过域名(不接项目路径)访问系统,就先把 ROOT 目录整个删掉或改名备份,再把解压出来的项目重命名为ROOT。
cd /www/server/tomcat8/webapps mv ROOT ROOT_BAK # 备份默认应用 mv campus_war ROOT # 将项目部署为根应用改完后在宝塔面板里重启 Tomcat,访问http://服务器IP/就能直接看到系统登录页。到这里你会遇到一个数据库连接上的差异问题:本地jdbc.properties连接的localhost:3306在服务器上要改成127.0.0.1:3306或服务器内网 IP,密码也换成服务器上 MySQL 的密码。放行端口时注意,如果在云厂商控制台只开了 80 端口,而 Tomcat 跑在 8080,需要额外在安全组里入站规则放行 8080——这一步容易漏,漏了你本地浏览器永远访问不到。
部署完成后,还有三个自己动手做一遍的小验证:第一,用curl -I http://127.0.0.1:8080/确认本机返回HTTP/1.1 200;第二,看 MySQL 字符集,执行SHOW VARIABLES LIKE 'character_set%';,确保全是utf8mb4或utf8;第三,检查 Tomcat 日志catalina.out没有异常栈,特别是数据库连接池刷满或死锁。从那以后,我自己每次拿到一份 JavaWeb 课设资源,都强制在本地先跑通、再部署远程、再把catalina.out里的启动时间从 5 秒看到 20 秒——这个过程能暴露出的隐藏坑,比读一百遍 README 都管用。希望帮到你。
本文还有配套的精品资源,点击获取