ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Servlet+JSP+JDBC房屋租赁系统教学实践指南

Servlet+JSP+JDBC房屋租赁系统教学实践指南 简介本资源是一套完整的Java Web毕业设计实战项目面向计算机专业本科生及Java初学者解决毕业设计选题难、环境配置复杂、功能模块不全等实际痛点。压缩包为ZIP格式大小13.69MB包含可直接运行的ServletJSP源码、SQL Server数据库脚本、系统部署配置指南、毕业论文文档及答辩用PPT覆盖开发、调试、部署、汇报全流程。已有250人学习下载项目经Eclipse或IDEA严格验证支持JDK8环境一键启动。读者可获得结构清晰的MVC分层代码、前后端交互完整实现含jQuery动态交互与CSS美化界面、管理员与会员双角色权限体系以及出租/求租/出售/求购四大核心业务模块的完整数据流与统计报表功能特别适合毕设开题、代码复现与Web开发能力强化训练。1. 为什么用 ServletJSPJDBC 做房屋租赁系统反而比 Spring Boot 更适合教学落地这不是一个“过时技术堆砌”的毕设凑数项目——它是一套被高校实训、专升本答辩、JavaWeb 入门课反复验证过的「最小可行教学闭环」用最轻量的原生 JavaWeb 技术栈Servlet 处理请求流转、JSP 渲染页面逻辑、JDBC 直连数据库把「用户登录→房源发布→租约查询→后台审核」这条业务线从零跑通到可演示、可调试、可答辩。你不需要理解 Spring 的 Bean 生命周期也不用纠结 MyBatis 的 XML 映射嵌套所有控制流都在doGet/doPost里明明白白所有 SQL 都在.java文件里清清楚楚所有页面跳转都靠request.getRequestDispatcher().forward()一行代码决定。尤其当你的开发环境是 IDEA 2023 或 VS Code配好 Tomcat 插件、数据库是 SQL Server 2019不是 MySQL注意驱动兼容性这套组合反而比 Spring Boot Thymeleaf 更少黑匣子、更易定位ClassNotFoundException是缺 jar 还是路径错、更方便在web.xml里一眼看清整个请求路由拓扑。它不追求高并发或微服务拆分但能让你在 72 小时内亲手把「房东上传房源图片失败」这种问题从浏览器报错 → 查console.log→ 看 Tomcat 日志 → 定位到FileUploadServlet中Part.getSubmittedFileName()返回空字符串 → 发现enctypemultipart/form-data漏写了一气呵成闭环排查。这才是教学级项目该有的确定性。2. 搭建运行环境Tomcat SQL Server JDBC 驱动三件套的硬核配置2.1 Tomcat 9.0.x 是当前最稳的 Servlet 容器选择不是 Tomcat 10很多同学卡在第一步用 IDEA 新建 JavaWeb 项目后点击 Run 却提示HTTP Status 404 – Not Found。根本原因常是 Tomcat 版本与 Servlet 规范不匹配。Tomcat 10 默认使用 Jakarta EE 9 命名空间jakarta.servlet.*而本项目源码中所有 import 仍是javax.servlet.*——这是 Servlet 3.1/4.0 的标准包名。强行升级会导致编译报错Cannot resolve symbol HttpServlet。提示下载 Tomcat 9.0.87官方最后稳定版支持 Servlet 4.0解压后在 IDEA 中 File → Project Structure → Project Settings → Artifacts → → Web Application: Exploded → Output directory 指向tomcat/webapps/ROOT同时在 Run Configuration → Server → Application server 选中该 Tomcat 目录。不要勾选 “After launch” 自动打开浏览器先确保控制台输出INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [xxx] ms。2.2 SQL Server 2019 安装必须启用 TCP/IP 协议并开放 1433 端口学生机常见翻车点本地安装了 SQL Server 2019但 JDBC 连接死活报Connection refused。不是密码错而是 SQL Server 默认禁用远程连接。具体操作路径Windows打开SQL Server 配置管理器非 SSMS→ 展开左侧「SQL Server 网络配置」→ 右键「MSSQLSERVER 的协议」→ 启用TCP/IP双击 TCP/IP → 切换到「IP 地址」页签 → 拉到底部找到IPAll→ 清空TCP Dynamic Ports留空在TCP Port填1433重启 SQL Server (MSSQLSERVER) 服务服务管理器中右键重启关闭 Windows 防火墙或添加入站规则端口 1433TCP域/专用/公用全选验证是否生效在命令行执行telnet 127.0.0.1 1433若窗口变黑无提示说明连通若提示“无法连接到远程主机”则上述步骤未完成。2.3 JDBC 驱动必须用mssql-jdbc-9.4.1.jre11.jar不是 12.xSQL Server 官方 JDBC 驱动版本迭代极快但本项目基于 Java 11 编译pom.xml或项目 SDK 设为 11而mssql-jdbc-12.x要求 Java 17。若错误引入mssql-jdbc-12.6.1.jre17.jar启动时会直接抛UnsupportedClassVersionError。正确做法访问 Microsoft 官方 Maven 仓库https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc找到9.4.1.jre11版本发布于 2021 年兼容性极佳下载 jar 包复制到项目WEB-INF/lib/目录下不是src/lib在web.xml中无需额外声明但需确保Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver)在DBUtil.java中被调用参数说明JDBC URL 格式为jdbc:sqlserver://localhost:1433;databaseNameHouseRentDB;usersa;passwordYourPass123;encryptfalse;trustServerCertificatetrue注意encryptfalse和trustServerCertificatetrue是绕过 SSL 证书校验的必要开关学生机无证书否则报错The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL)。3. 数据库设计与初始化SQL Server 2019 下的 5 张核心表建模逻辑3.1 表结构必须遵循「租客-房源-订单」三层主外键约束本系统不是单表 CRUD而是典型的关系型业务模型。5 张表并非随意设计而是由业务动作反推表名主要字段关键约束业务意义t_userid,username,password,roletenant/landlord/adminPKid统一用户池角色字段区分权限t_houseid,title,price,area,address,landlord_idFKlandlord_id → t_user.id房源归属明确避免房东删号后房源丢失t_orderid,house_id,tenant_id,statuspending/confirmed/canceledFKhouse_id → t_house.id,tenant_id → t_user.id租约状态机驱动前端按钮显隐t_imageid,house_id,img_pathFKhouse_id → t_house.id支持多图上传路径存相对路径如/upload/101_1.jpgt_messageid,sender_id,receiver_id,content,send_timeFKsender_id/receiver_id → t_user.id私信功能避免硬编码用户类型血泪经验建表时务必用nvarchar(255)而非varchar(255)存中文字段如title,address否则插入中文会变成??price字段用decimal(10,2)不用float精度丢失导致租金计算偏差。3.2 初始化脚本必须包含INSERT测试数据且关闭IDENTITY_INSERT学生导入.sql脚本后常发现首页空白——因为t_user表没数据登录页查不到roleadmin用户。以下是最小可用初始化脚本保存为init.sql在 SSMS 中执行-- 启用自增列手动插入 SET IDENTITY_INSERT t_user ON; INSERT INTO t_user (id, username, password, role) VALUES (1, admin, e10adc3949ba59abbe56e057f20f883e, admin), -- MD5(123456) (2, landlord1, e10adc3949ba59abbe56e057f20f883e, landlord), (3, tenant1, e10adc3949ba59abbe56e057f20f883e, tenant); SET IDENTITY_INSERT t_user OFF; -- 房源数据关联 landlord_id2 INSERT INTO t_house (title, price, area, address, landlord_id) VALUES (朝阳区精装一居室, 4500.00, 42.5, 北京市朝阳区建国路88号, 2), (海淀中关村合租单间, 2800.00, 18.0, 北京市海淀区中关村大街1号, 2); -- 订单数据关联 tenant_id3, house_id1 INSERT INTO t_order (house_id, tenant_id, status) VALUES (1, 3, pending);注意e10adc3949ba59abbe56e057f20f883e是123456的 MD5 值登录验证时用MessageDigest.getInstance(MD5).digest(password.getBytes())计算比对而非明文存储。4. 核心 Servlet 开发从登录验证到文件上传的 3 个关键实现细节4.1 登录 Servlet 必须用HttpSession传递用户身份而非 URL 参数新手常把登录成功后的跳转写成response.sendRedirect(main.jsp?usernameusername)这会导致URL 泄露用户名敏感信息暴露刷新 main.jsp 时重新触发登录逻辑无 session 校验无法做登出功能session 未销毁正确做法是在LoginServlet.java中// 验证通过后 HttpSession session request.getSession(true); session.setAttribute(user, user); // user 是从 DB 查询出的 User 对象 session.setMaxInactiveInterval(1800); // 30 分钟无操作自动失效 request.getRequestDispatcher(/main.jsp).forward(request, response);对应地main.jsp开头必须加校验% User user (User) session.getAttribute(user); if (user null) { response.sendRedirect(login.jsp); return; } %参数说明session.setMaxInactiveInterval(1800)单位是秒不是毫秒request.getRequestDispatcher().forward()是服务器端跳转URL 不变response.sendRedirect()是客户端重定向URL 变——登录后用 forward登出用 redirect 到 login.jsp。4.2 房源上传 Servlet 必须用Part接收文件且MultipartConfig注解不可少JSP 表单必须带enctypemultipart/form-data否则request.getPart(file)返回 null。Servlet 类上必须加注解WebServlet(/uploadHouse) MultipartConfig( fileSizeThreshold 1024 * 1024, // 1MB maxFileSize 1024 * 1024 * 10, // 10MB maxRequestSize 1024 * 1024 * 15 // 15MB ) public class UploadHouseServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Part filePart request.getPart(houseImage); // namehouseImage String fileName Paths.get(filePart.getSubmittedFileName()).getFileName().toString(); // 保存路径webapp/upload/ String uploadPath request.getServletContext().getRealPath() upload/; Files.createDirectories(Paths.get(uploadPath)); filePart.write(uploadPath fileName); // 同时插入 t_house 和 t_image 表事务处理 // ... JDBC 插入逻辑 } }避坑点getSubmittedFileName()返回的是原始文件名含路径必须用Paths.get().getFileName()提取纯文件名否则 Windows 下可能得到C:\Users\XXX\Desktop\1.jpg导致写入失败。4.3 租约状态更新必须用PreparedStatement防止 SQL 注入学生常写String sql UPDATE t_order SET status status WHERE id orderId;这在statusconfirmed; DROP TABLE t_order;场景下直接被注入。正确写法在UpdateOrderServlet.java中String sql UPDATE t_order SET status ? WHERE id ?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, request.getParameter(status)); // confirmed ps.setInt(2, Integer.parseInt(request.getParameter(orderId))); int rows ps.executeUpdate(); if (rows 0) { request.setAttribute(msg, 状态更新成功); } }逻辑说明?占位符由 JDBC 驱动自动转义特殊字符ps.setString(1, ...)中的1指第一个?顺序必须严格对应 SQL 中?出现位置。5. 常见问题排查5 个真实踩坑记录与现场解决方案5.1 现象JSP 页面中文显示为乱码但数据库里中文正常原因JSP 文件本身编码是 UTF-8但 Tomcat 默认用 ISO-8859-1 解析请求参数解决在每个 Servlet 的doPost开头加request.setCharacterEncoding(UTF-8);在 JSP 页面顶部加% page contentTypetext/html;charsetUTF-8 %在web.xml中全局配置过滤器推荐filter filter-nameCharacterEncodingFilter/filter-name filter-classorg.apache.catalina.filters.SetCharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter filter-mapping filter-nameCharacterEncodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping5.2 现象上传图片后页面显示http://localhost:8080/upload/xxx.jpg404原因upload/目录不在webapp下而是在webapp/WEB-INF/内WEB-INF 是受保护目录Tomcat 不允许外部访问解决将upload/文件夹建在webapp/根目录下与WEB-INF同级确保路径为webapp/upload/这样http://localhost:8080/upload/才能被 Tomcat 映射为静态资源。5.3 现象SQL Server 连接成功但执行SELECT * FROM t_user报Invalid object name t_user原因SQL Server 默认数据库是master而你的表建在HouseRentDB库中但 JDBC URL 未指定databaseName解决检查 JDBC URL 是否含;databaseNameHouseRentDB;且该数据库已存在SSMS 中右键「数据库」→「新建数据库」→ 名称填HouseRentDB。5.4 现象IDEA 中运行项目报java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver原因jar 包放在了错误位置如src/lib或lib目录未被 Tomcat 加载解决必须将mssql-jdbc-9.4.1.jre11.jar复制到WEB-INF/lib/目录IDEA 中右键项目 →Add Framework Support→Web Application→ 确认WEB-INF/lib被识别为 Library。5.5 现象登录后跳转到main.jsp但页面顶部显示usernull原因request.getRequestDispatcher().forward()时未传参或main.jsp中 session 获取时机错误解决确认LoginServlet中session.setAttribute(user, user)已执行在main.jsp中用% session.getAttribute(user) ! null ? 欢迎 : 未登录 %立即验证排除 JSP 编译缓存问题删掉tomcat/work/Catalina/localhost/_/下所有文件重启。6. 系统加固与答辩技巧让毕设演示不再卡在「老师点不动按钮」6.1 用 CSSJS 实现「房东只能看到自己房源」的权限隔离业务逻辑不能只靠后端拦截if (user.getRole().equals(landlord))前端也必须做视觉收敛。在landlord_houses.jsp中c:forEach items${houseList} varhouse c:if test${house.landlordId sessionScope.user.id} div classhouse-card h3${house.title}/h3 p¥${house.price}/月/p a hrefdeleteHouse?id${house.id}删除/a /div /c:if /c:forEach技巧sessionScope.user.id是 EL 表达式比% out.print(session.getAttribute(user).getId()); %更安全简洁c:if标签需在 JSP 顶部声明% taglib prefixc urihttp://java.sun.com/jsp/jstl/core %并确保jstl-1.2.jar在WEB-INF/lib/下。6.2 PPT 演示页必须包含「三张关键截图」和「一个可复现 Bug」答辩 PPT 不是代码截图堆砌。我坚持放这三张图图1Tomcat 控制台日志—— 显示Server startup in [2345] ms和INFO [main] org.apache.catalina.core.StandardContext.startInternal Context [] started证明环境跑通图2SSMS 查询结果—— 执行SELECT * FROM t_order WHERE statusconfirmed返回 2 条记录证明业务数据真实图3Chrome Network Tab—— 点击「确认租约」按钮后updateOrder请求返回200 OKResponse 是{success:true}证明前后端通信正常。再加一页「已知问题与修复方案」BugIE11 下图片上传失败原因IE11 不支持FormData.append()的Blob参数修复在upload.js中增加兼容判断if (window.FormData window.File window.FileReader) { // Chrome/Firefox/Edge 正常流程 } else { // IE11 回退到 iframe 方案略 }6.3 论文写作避开「技术堆砌陷阱」聚焦「为什么选这个方案」很多论文写成“Servlet 是 Java 编写的服务器端小程序……JSP 是 Sun 公司推出的……JDBC 是 Java 数据库连接技术……”。这毫无价值。真正加分的写法是第三章 系统架构选型依据本系统放弃 Spring Boot 框架选用原生 ServletJSPJDBC 组合主要基于三点现实约束1教学场景要求技术可见性——学生需清晰追踪从 HTTP 请求进入doPost()到PreparedStatement.executeUpdate()提交 SQL再到request.getRequestDispatcher().forward()跳转的完整链路Spring 的自动装配会掩盖这一过程2部署环境受限——目标服务器为 Windows Server 2012 SQL Server 2019Tomcat 9.0.x 在该环境下经 3 届学生验证无兼容性问题而 Spring Boot 2.7.x 对 Windows 服务注册支持较弱3答辩验证效率——教师可在 5 分钟内通过修改web.xml中servlet-mapping路径快速验证路由配置能力无需理解RequestMapping注解扫描机制。最后说一句实在话我带过 17 届毕设凡是把web.xml里 5 个 servlet-mapping 路径手写默写出来的学生答辩通过率 100%。不是因为他们代码多牛而是他们真的摸透了这个技术栈的毛细血管。这套房子租赁系统从来就不是为了做个软件而是为了让你亲手把 JavaWeb 的「请求-响应」循环从黑匣子变成掌心纹路。希望帮到你。本文还有配套的精品资源点击获取
返回列表