新闻详情

新闻详情

首页 / 资讯中心 / 详情

手写Servlet+JSP+MySQL学生宿舍管理系统实战指南

发布时间:2026/10/1 10:36:54来源:尧图网络
手写Servlet+JSP+MySQL学生宿舍管理系统实战指南
简介本资源是一套基于ServletJSPMySQL实现的JavaWeb学生宿舍管理系统完整源码及配套教程面向计算机专业本科生、Java初学者及毕业设计/期末大作业需求者聚焦于Web基础技术栈的工程化实践与业务逻辑落地。压缩包共202个文件7.21MB涵盖21个核心Java后端类、22个JSP页面、73个前端交互脚本JS、35张界面图标PNG及16个样式文件CSS辅以SQL建表语句、Maven依赖JAR包和Bootstrap等主流前端库体现典型三层架构与MVC分层思想。已有248人学习下载源码经本地编译验证可直接运行评审得分98分内容由助教审定难度适中、模块完整包含用户管理、宿舍分配、报修登记、权限控制等核心功能模块并提供清晰部署说明与使用指引适合课程设计实战与能力进阶训练。1. 为什么现在还要手写 Servlet JSP MySQL 的学生宿舍管理系统——不是怀旧是看清 JavaWeb 底层逻辑的必经之路你可能刚在招聘网站上刷到一条 JD“熟悉 Spring Boot了解传统 JavaWebServlet/JSP”心里一愣JSP 都被标成“了解”了这玩意儿还有人真用但当你打开某高校计算机学院《Java Web 程序设计》课程设计要求第一页赫然写着“基于 Servlet JSP MySQL 实现学生宿舍管理系统要求包含登录、床位分配、报修登记、管理员审核四大核心模块禁止使用 Spring Boot 或任何框架封装”。这不是复古表演而是教学闭环里最硬的一环只有亲手把 request.getParameter() 拼成 SQL、看着 response.getWriter().println() 在浏览器里吐出表格、在 web.xml 里一行行配 servlet-mapping你才真正理解 HTTP 请求怎么穿过容器、会话怎么靠 Cookie 维持、SQL 注入为何能从一个 input 框直捅数据库。这个标题下的源码不是过时遗产而是一套可调试、可打断点、无黑匣子的 JavaWeb 运行教科书。它适合两类人大三学生赶课设 deadline 时需要立刻跑通的最小可行系统以及 Spring Boot 写得飞起但某天 debug 时突然卡在 Filter 链里、想回溯看 request 是怎么被 HttpServletRequestWrapper 包裹的工程师。别急着喷“都 2024 年了还写 JSP”先看看你 IDE 里 Tomcat 控制台输出的第一行GET /login.jsp HTTP/1.1——那才是所有 Web 框架的起点。2. 从零搭起运行环境Tomcat 9 JDK 8 MySQL 5.7 的黄金组合与避坑配置2.1 为什么锁定 Tomcat 9 JDK 8而不是最新版很多新手一上来就装 Tomcat 10、JDK 17结果跑 JSP 页面直接 500 错误控制台报org.apache.jasper.JasperException: Unable to compile class for JSP。根本原因在于JSP 规范与 Servlet 规范的版本绑定关系JSP 2.3对应 JSP 文件默认语法严格依赖 Servlet 4.0而 Servlet 4.0 是 Tomcat 9.0.x 的专属特性。Tomcat 10 虽然更“新”但它实现了 Servlet 5.0 和 JSP 3.0包名已从javax.servlet.*升级为jakarta.servlet.*——这意味着你源码里所有import javax.servlet.http.HttpServlet;全部失效连编译都过不去。JDK 方面Tomcat 9 官方明确要求 JDK 8但 JDK 11 的模块化Module System会让tools.jarJSP 编译器依赖加载失败导致 JSP 编译阶段报ClassNotFoundException: com.sun.tools.javac.Main。所以稳定压倒一切Tomcat 9.0.87 JDK 8u231 是当前最省心的组合。验证方式很简单解压 Tomcat 后进入bin目录执行startup.batWindows或./startup.shLinux看到控制台输出Server startup in [xxx] ms且浏览器访问http://localhost:8080显示 Apache Tomcat 首页即成功。2.2 MySQL 5.7 配置要点字符集、用户权限与连接 URL 的三重校验学生宿舍管理系统对中文支持要求极高如学生姓名、宿舍楼名、报修描述MySQL 字符集配置不当会导致乱码且这种乱码往往在插入时无声无息查询时才暴露。必须在 MySQL 安装后立即执行三步校验全局字符集设置编辑my.cnfLinux或my.iniWindows在[mysqld]下添加character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci提示utf8mb4而非utf8因为 MySQL 的utf8实际只支持 3 字节 UTF-8无法存储 emoji 和部分生僻汉字如“”而utf8mb4才是真正的 UTF-8 四字节实现。创建专用数据库与用户不要用 root 连接应用按最小权限原则建库建用户CREATE DATABASE dorm_management CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER dorm_userlocalhost IDENTIFIED BY D0rmPss2024; GRANT SELECT, INSERT, UPDATE, DELETE ON dorm_management.* TO dorm_userlocalhost; FLUSH PRIVILEGES;JDBC 连接 URL 必须显式声明编码与时区在WEB-INF/web.xml同级目录下新建db.properties内容如下jdbc.urljdbc:mysql://localhost:3306/dorm_management?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/ShanghaiuseSSLfalse jdbc.usernamedorm_user jdbc.passwordD0rmPss2024注意serverTimezoneAsia/Shanghai解决时间字段如报修时间datetime存取偏差问题useSSLfalse是开发环境简化配置生产环境必须启用 SSL 并配置证书。2.3 在 IntelliJ IDEA 中正确导入并运行 JSP 项目不是“新建 Maven 项目”而是“添加外部 Web 模块”很多同学在 IDEA 里点 “File → New → Project”选 “Maven”然后把下载的源码拖进去结果发现.jsp文件不识别、web.xml不生效、lib下的servlet-api.jar报红。这是因为IDEA 默认将项目识别为纯 Java 项目而非 Dynamic Web Module。正确做法是关闭当前项目选择 “File → Open”定位到源码根目录含src、WebContent、WEB-INF文件夹的目录IDEA 会弹出 “Import Project” 对话框勾选 “Create project from existing sources”点击 OK在向导中关键一步当出现 “Project SDK” 选择后务必勾选 “Add framework support” → 勾选 “Web Application” → Version 4.0对应 Servlet 4.0点击 “OK” 后右键项目 → “Open Module Settings” → “Project Settings → Modules” → 选中你的模块 → “Dependencies” 标签页 → 点 “” → “JARs or directories” → 添加tomcat/lib/servlet-api.jar注意不是项目lib下的 jar而是 Tomcat 自带的最后配置 Tomcat ServerRun → Edit Configurations → → Tomcat Server → Local在 “Deployment” 标签页点击 “” → “Artifact” → 选择你的项目名称带:war exploded后缀。逻辑说明JSP 文件本质是 Servlet 的模板需要由 Tomcat 的 Jasper 编译器实时编译。IDEA 的 “Web Application” 框架支持会自动配置web.xml解析路径、JSP 编译输出目录默认out/artifacts/xxx_war_exploded/而手动添加servlet-api.jar是为了让 IDEA 的代码提示和编译器知道HttpServletRequest等类的定义避免红色波浪线。3. 核心功能落地从登录验证到床位分配手写 Servlet 如何串联请求-响应全流程3.1 登录 ServletdoPost()里如何安全比对密码MD5 加盐是底线学生宿舍管理系统登录页login.jsp提交表单到LoginServlet其doPost()方法是整个系统的入口守门员。常见错误是直接String password request.getParameter(password);然后SELECT * FROM user WHERE username? AND password?—— 这等于把明文密码裸奔在 SQL 里。正确做法分三步前端密码输入框必须加typepassword基础但常被忽略后端获取参数后立即 MD5 加盐哈希使用MessageDigest生成不可逆摘要盐值salt应为每个用户独立生成的随机字符串存入数据库user表的salt字段// LoginServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String rawPassword request.getParameter(password); // 1. 查询用户信息含 salt UserDAO userDAO new UserDAO(); User user userDAO.findByUsername(username); if (user null) { request.setAttribute(error, 用户名不存在); request.getRequestDispatcher(login.jsp).forward(request, response); return; } // 2. 使用用户 salt 对输入密码做 MD5 String saltedPassword rawPassword user.getSalt(); String md5Password DigestUtils.md5Hex(saltedPassword); // 使用 commons-codec 工具类 // 3. 比对数据库存储的 hashed_password if (md5Password.equals(user.getHashedPassword())) { // 登录成功存入 session request.getSession().setAttribute(currentUser, user); response.sendRedirect(main.jsp); } else { request.setAttribute(error, 密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } }参数说明DigestUtils.md5Hex()来自 Apache Commons Codec 库需在WEB-INF/lib下放入commons-codec-1.15.jaruser.getSalt()是从数据库查出的 16 位随机字符串如aB3xK9mNpQrT7vWz确保即使两个用户密码相同哈希值也不同。3.2 床位分配 Servlet如何用 JDBC 手写事务保证“分配床位”与“更新学生状态”原子性宿舍管理员在assignBed.jsp页面选择学生 ID 和床位号如A栋301-01点击提交后需同时完成两件事① 更新student表的bed_id字段② 更新bed表的status字段为occupied。若只执行①失败学生显示已分配但床位仍空闲会造成数据不一致。必须用 JDBC 事务包裹// AssignBedServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String studentId request.getParameter(studentId); String bedId request.getParameter(bedId); Connection conn null; PreparedStatement ps1 null; PreparedStatement ps2 null; try { conn DBUtil.getConnection(); // 从 db.properties 读取连接 conn.setAutoCommit(false); // 关闭自动提交 // 语句1更新学生床位 String sql1 UPDATE student SET bed_id ? WHERE id ?; ps1 conn.prepareStatement(sql1); ps1.setString(1, bedId); ps1.setString(2, studentId); ps1.executeUpdate(); // 语句2更新床位状态 String sql2 UPDATE bed SET status occupied WHERE bed_id ?; ps2 conn.prepareStatement(sql2); ps2.setString(1, bedId); ps2.executeUpdate(); conn.commit(); // 两步都成功才提交 request.setAttribute(msg, 床位分配成功); } catch (SQLException e) { if (conn ! null) { try { conn.rollback(); // 任一步失败则回滚 } catch (SQLException rollbackEx) { rollbackEx.printStackTrace(); } } request.setAttribute(error, 分配失败 e.getMessage()); e.printStackTrace(); } finally { // 关闭资源此处省略 close 代码实际必须写 DBUtil.close(ps1, ps2, conn); } request.getRequestDispatcher(assignBed.jsp).forward(request, response); }逻辑说明conn.setAutoCommit(false)是事务开启的开关conn.commit()是成功标记conn.rollback()是兜底保险。注意DBUtil.close()必须按PreparedStatement→Connection顺序关闭且放在finally块中防止连接泄漏。3.3 JSP 页面动态渲染用 JSTL 替代 scriptlet让studentList.jsp既安全又易维护早期 JSP 习惯写% while(rs.next()) { %trtd% rs.getString(name) %/td/tr% } %但 scriptlet% %混杂 Java 代码难以调试且易 XSS 攻击。现代写法是JSTL EL 表达式前提是WEB-INF/lib下有jstl-1.2.jar和standard-1.1.2.jarTomcat 9 自带无需额外下载!-- studentList.jsp -- % taglib prefixc urihttp://java.sun.com/jsp/jstl/core % % page contentTypetext/html;charsetUTF-8 languagejava % html headtitle学生列表/title/head body table border1 trth学号/thth姓名/thth性别/thth所在床位/th/tr c:forEach items${studentList} varstudent tr td${student.id}/td td${fn:escapeXml(student.name)}/td !-- fn:escapeXml 防 XSS -- td${student.gender M ? 男 : 女}/td td${empty student.bedId ? 未分配 : student.bedId}/td /tr /c:forEach /table /body /html参数说明c:forEach替代while循环${student.name}是 EL 表达式自动调用 getter${fn:escapeXml()}来自 JSTL Functions 库需% taglib prefixfn urihttp://java.sun.com/jsp/jstl/functions %对输出内容做 HTML 转义防止scriptalert(1)/script注入${empty student.bedId ? 未分配 : student.bedId}是 EL 三元运算比 scriptlet 的if-else更简洁。4. 避坑指南那些让新手调试到凌晨三点的 ServletJSPMySQL 经典翻车现场4.1 现象JSP 页面中文显示为??但数据库里明明是 UTF-8原因JSP 文件本身编码、Tomcat 响应编码、MySQL 连接编码三者未统一。常见错误是只改了 MySQL 的character-set-server却忘了 JSP 文件保存为 UTF-8IDEA 默认是 GBK也忘了在 JSP 顶部声明% page contentTypetext/html;charsetUTF-8 %。解决IDEA 中右下角点击文件编码 → Convert to UTF-8所有 JSP 文件第一行必须是% page contentTypetext/html;charsetUTF-8 %Tomcat 的conf/server.xml中Connector标签添加URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /4.2 现象request.getParameter(username)总是 null原因HTML 表单的method属性写错或name属性缺失。例如input typetext value张三没有nameusername或者表单写成form methodpost但 Servlet 只写了doGet()。解决检查表单 HTMLform actionLoginServlet methodpostinput nameusername /Servlet 必须重写doPost()不是doGet()且web.xml中servlet-mapping的url-pattern必须与 form action 一致如/LoginServlet在doPost()开头加System.out.println(Received: request.getParameterMap());查看实际接收参数。4.3 现象MySQL 报错Communications link failure或Cant connect to local MySQL server through socket /tmp/mysql.sock原因MySQL 服务未启动或 JDBC URL 中的 host/port 错误。Linux 下常见/tmp/mysql.sock路径不匹配MySQL 5.7 默认 sock 路径是/var/lib/mysql/mysql.sock。解决先确认 MySQL 是否运行systemctl status mysqldCentOS或brew services list | grep mysqlMac查看 MySQL 实际 sock 路径mysql -u root -p -e SHOW VARIABLES LIKE socket;若 URL 用localhostMySQL 会走 Unix socket若用127.0.0.1则走 TCP/IP。推荐 URL 写jdbc:mysql://127.0.0.1:3306/...避免 socket 路径问题。4.4 现象Tomcat 启动后访问http://localhost:8080正常但访问http://localhost:8080/dorm/login.jsp报 404原因项目未正确部署到 Tomcat 的webapps目录或 IDEA 的 Artifact 配置路径错误。解决检查 IDEA 的 “Deployment” 配置Application context应为/dorm与 URL 路径匹配Deploy at the server的路径应为webapps/dorm手动验证打开tomcat/webapps/目录确认存在dorm文件夹且其下有WEB-INF/web.xml和login.jsp清理缓存删除tomcat/work/Catalina/localhost/下的dorm文件夹重启 Tomcat。4.5 现象jsp:include pageheader.jsp/包含失败页面空白原因jsp:include是运行时包含page属性必须是相对路径相对于当前 JSP且被包含文件不能有htmlbody等重复标签。解决header.jsp只写div classheader欢迎来到宿舍系统/div不写!DOCTYPE和htmlinclude标签写在body内且路径正确jsp:include pagecommon/header.jsp/表示common文件夹在当前 JSP 同级目录替代方案用% include fileheader.jsp %静态包含编译时合并性能更好。5. 数据库设计与 SQL 脚本一张student表如何支撑起整个宿舍管理业务流5.1 五张核心表的设计逻辑为什么bed表要拆出building和floor字段学生宿舍管理系统看似简单但数据库设计决定后期扩展性。常见错误是把床位号如A栋301-01全存在student.bed_id字符串里导致按楼栋统计空床位时只能用LIKE A栋%效率极低。正确做法是垂直拆分 外键关联表名字段类型说明buildingid(PK),name,descriptionINT, VARCHAR, TEXT宿舍楼信息A栋、B栋floorid(PK),building_id(FK),numberINT, INT, TINYINT楼层1-6层building_id关联building.idbedid(PK),floor_id(FK),room_number,bed_number,statusINT, INT, VARCHAR, VARCHAR, ENUM(free,occupied)床位301-01status用 ENUM 而非 VARCHAR节省空间且约束值域studentid(PK),name,gender,class,bed_id(FK)VARCHAR, VARCHAR, CHAR(1), VARCHAR, INT学生表bed_id外键指向bed.idrepairid(PK),student_id(FK),content,status,create_time,handle_timeINT, INT, TEXT, ENUM(pending,done), DATETIME, DATETIME报修记录status分待处理/已处理逻辑说明floor表通过building_id关联building实现“一栋楼有多个楼层”bed表通过floor_id关联floor实现“一层楼有多个房间和床位”。这样查“A栋空床位数”只需SELECT COUNT(*) FROM bed b JOIN floor f ON b.floor_id f.id JOIN building d ON f.building_id d.id WHERE d.name A栋 AND b.status free;5.2 初始化 SQL 脚本带注释的建表与测试数据插入以下脚本可直接复制到 MySQL 命令行或 Navicat 执行包含外键约束与初始数据-- 创建 building 表 CREATE TABLE building ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL COMMENT 楼栋名称如A栋, description TEXT COMMENT 楼栋描述 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 创建 floor 表 CREATE TABLE floor ( id INT PRIMARY KEY AUTO_INCREMENT, building_id INT NOT NULL, number TINYINT NOT NULL COMMENT 楼层号1-6, FOREIGN KEY (building_id) REFERENCES building(id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 创建 bed 表 CREATE TABLE bed ( id INT PRIMARY KEY AUTO_INCREMENT, floor_id INT NOT NULL, room_number VARCHAR(10) NOT NULL COMMENT 房间号如301, bed_number VARCHAR(5) NOT NULL COMMENT 床号如01, status ENUM(free,occupied) DEFAULT free COMMENT 床位状态, FOREIGN KEY (floor_id) REFERENCES floor(id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 创建 student 表 CREATE TABLE student ( id VARCHAR(15) PRIMARY KEY COMMENT 学号主键, name VARCHAR(20) NOT NULL, gender CHAR(1) NOT NULL COMMENT M/F, class VARCHAR(30) NOT NULL COMMENT 班级如计科2021-1班, bed_id INT COMMENT 外键指向 bed.id, FOREIGN KEY (bed_id) REFERENCES bed(id) ON DELETE SET NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 创建 repair 表 CREATE TABLE repair ( id INT PRIMARY KEY AUTO_INCREMENT, student_id VARCHAR(15) NOT NULL, content TEXT NOT NULL COMMENT 报修内容, status ENUM(pending,done) DEFAULT pending, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, handle_time DATETIME NULL, FOREIGN KEY (student_id) REFERENCES student(id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 插入测试数据A栋ID1、B栋ID2 INSERT INTO building (name, description) VALUES (A栋, 男生宿舍), (B栋, 女生宿舍); -- 插入A栋1-6层 INSERT INTO floor (building_id, number) VALUES (1,1),(1,2),(1,3),(1,4),(1,5),(1,6); -- 插入A栋301房间的4个床位01-04 INSERT INTO bed (floor_id, room_number, bed_number, status) SELECT id, 301, 01, free FROM floor WHERE building_id1 AND number3 UNION ALL SELECT id, 301, 02, free FROM floor WHERE building_id1 AND number3 UNION ALL SELECT id, 301, 03, free FROM floor WHERE building_id1 AND number3 UNION ALL SELECT id, 301, 04, free FROM floor WHERE building_id1 AND number3;参数说明ON DELETE CASCADE表示删除楼栋时自动删掉其所有楼层ON DELETE SET NULL表示学生退学时其床位字段置为 NULL 而非删除床位记录符合业务逻辑DATETIME DEFAULT CURRENT_TIMESTAMP让create_time自动填充无需代码干预。6. 从源码到可交付打包 WAR、部署到 Linux 服务器与 Nginx 反向代理实战6.1 在 IDEA 中生成标准 WAR 包不是Build → Build Artifacts而是Build → Prepare Artifact很多同学右键项目 → “Build Artifact”结果生成的 WAR 包里没有WEB-INF/lib下的 jar或者web.xml被漏掉。根源在于 IDEA 的 Artifact 配置未包含依赖。正确流程File → Project Structure → Artifacts→ 点 “” → “Web Application: Archive” → “For dorm production”在右侧 “Output Layout” 标签页展开Available Elements→ 将dorm:war exploded下的WEB-INF/lib文件夹拖到WEB-INF/lib目录下确保所有 jar 在内展开dorm:war exploded→WEB-INF→ 将web.xml拖到WEB-INF/目录下点击 “OK”然后Build → Build Artifacts → Build生成的 WAR 包位于out/artifacts/dorm_war/文件名如dorm.war。逻辑说明war exploded是解压目录结构war archive是压缩包。IDEA 默认只打包war exploded的内容必须手动将lib和web.xml显式加入Output Layout否则 Tomcat 启动时会报ClassNotFoundException或No web.xml错误。6.2 Linux 服务器部署用 systemd 管理 Tomcat告别./startup.sh手动启停在 CentOS 7 或 Ubuntu 16.04 上不应再用./startup.sh启动 Tomcat而应注册为 systemd 服务实现开机自启、日志统一管理、进程守护创建服务文件sudo vim /etc/systemd/system/tomcat.service[Unit] DescriptionApache Tomcat Web Application Container Afternetwork.target [Service] Typeforking EnvironmentJAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 EnvironmentCATALINA_PID/opt/tomcat/temp/tomcat.pid EnvironmentCATALINA_HOME/opt/tomcat EnvironmentCATALINA_BASE/opt/tomcat EnvironmentCATALINA_OPTS-Xms512M -Xmx1024M -server -XX:UseParallelGC ExecStart/opt/tomcat/bin/startup.sh ExecStop/opt/tomcat/bin/shutdown.sh Usertomcat Grouptomcat UMask0007 RestartSec10 Restartalways [Install] WantedBymulti-user.target创建 tomcat 用户并授权sudo groupadd tomcat sudo useradd -s /bin/false -r -g tomcat -d /opt/tomcat tomcat sudo chown -R tomcat:tomcat /opt/tomcat sudo chmod x /opt/tomcat/bin/*.sh启用服务sudo systemctl daemon-reload sudo systemctl enable tomcat sudo systemctl start tomcat sudo systemctl status tomcat # 查看是否 active (running)6.3 Nginx 反向代理配置让https://dorm.yourschool.edu指向 Tomcat 的 8080 端口直接暴露 Tomcat 的 8080 端口不安全且无法启用 HTTPS。Nginx 作为反向代理既能隐藏后端端口又能提供 SSL 终止、静态资源缓存安装 Nginxsudo apt install nginxUbuntu或sudo yum install nginxCentOS获取 SSL 证书以 Lets Encrypt 为例sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d dorm.yourschool.edu编辑 Nginx 配置sudo vim /etc/nginx/sites-available/dormserver { listen 443 ssl; server_name dorm.yourschool.edu; ssl_certificate /etc/letsencrypt/live/dorm.yourschool.edu/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dorm.yourschool.edu/privkey.pem; location / { proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # 静态资源直接由 Nginx 服务不转发给 Tomcat location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { root /opt/tomcat/webapps/dorm; expires 1y; } } # HTTP 重定向到 HTTPS server { listen 80; server_name dorm.yourschool.edu; return 301 https://$server_name$request_uri; }启用配置并重启sudo ln -s /etc/nginx/sites-available/dorm /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx逻辑说明proxy_pass http://127.0.0.1:8080/的末尾斜杠/至关重要——它表示将https://dorm.yourschool.edu/login.jsp的路径/login.jsp完整转发给 Tomcat而非拼成http://127.0.0.1:8080/login.jsplocation ~* \.(jpg|...)$规则让图片、CSS、JS 由 Nginx 直接返回减少 Tomcat 负载expires 1y设置强缓存提升页面加载速度。我带过三届学生做这个课设每次都会强调一件事**别急着抄源码里的web.xml先自己手敲一遍servlet和servlet-mapping哪怕只是HelloWorldServlet。当你在浏览器地址栏输入/HelloWorldServlet看到那行Hello, World!时你就真正摸到了 JavaWeb 的脉搏——不是框架的 API而是容器如何把字节流变成对象、又把对象变成字节流。这套系统不会让你写出高并发秒杀但它会让你在 Spring Boot 的RestController里一眼看出哪个RequestBody对应着request.getInputStream()的原始字节。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

CSDN企业账号运营全攻略:从开通到内容增长实战手册 2026/10/1 11:23:42

CSDN企业账号运营全攻略:从开通到内容增长实战手册

1. 从“个人写博客”到“企业做内容阵地”,CSDN企业账户到底解决什么问题先说一个很现实的问题:很多公司到现在还把CSDN当成“个人程序员写笔记的地方”,团队里谁有技术沉淀就自己注册一个号,零零散散发几篇“环境搭建踩坑记”&am…

阅读更多 →
Python界面元素控件库工具:可视化预览与参数速查指南 2026/10/1 11:23:42

Python界面元素控件库工具:可视化预览与参数速查指南

有一段时间我老在 tkinter 和 PyQt 之间反复横跳。当时接了个小需求,要给内网数据巡检脚本加个图形界面,需求不复杂——几个输入框、一个下拉框、一个日志输出区。按说一个小时就能搞定,可我硬是花了一晚上。原因不是不会写代码,而…

阅读更多 →
Keil逻辑分析仪报错Unknown Signal?一文讲透原因与解决方法 2026/10/1 11:23:42

Keil逻辑分析仪报错Unknown Signal?一文讲透原因与解决方法

Keil 5的波形仿真是个好东西,尤其是你想直观看看某个引脚翻转、某段延时程序到底跑了多久的时候,逻辑分析仪窗口能省很多事。但不少人在添加信号时会遇到一个很扎眼的报错:Unknown Signal。这行红字一出现,信号加不进去&#xff0…

阅读更多 →
俯视航拍小目标三轮车检测数据集:5756张双格式标注与YOLO训练实战 2026/10/1 11:23:42

俯视航拍小目标三轮车检测数据集:5756张双格式标注与YOLO训练实战

简介:面向俯视航拍场景中的小型交通工具检测任务,这份数据集包含五千七百五十六张现场图片及对应标注,类别覆盖遮阳蓬三轮车与三轮车两个类别,总计两万零二百七十七个标注框,能直接用于小目标检测模型的训练与评测。压…

阅读更多 →
NSGA-II求解水光互补多目标优化调度:Python实现与约束处理 2026/10/1 11:23:42

NSGA-II求解水光互补多目标优化调度:Python实现与约束处理

做水光互补调度这类问题,最头疼的不是仿真模型难搭,也不是数据清洗繁琐,而是目标太多、互相打架。既要发电量尽量大,又要出力曲线尽量平缓,还想尽量减少弃水弃光,这三个目标放到一个模型里,单目…

阅读更多 →
Java实现数值分析与机器学习算法:从矩阵到源码的工程实践 2026/10/1 11:23:36

Java实现数值分析与机器学习算法:从矩阵到源码的工程实践

简介:这是一套基于Java实现的数值分析、线性代数与机器学习算法设计源码包,面向科研人员、工程师及对数学建模和智能算法感兴趣的开发者。包内代码覆盖数值积分、微分方程求解、插值、最优化等常用数值方法,同时提供矩阵运算、行列式计算、特…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉