简介这是一套面向高校计算机相关专业学生的房产中介系统毕业设计参考资料采用JSP与SqlServer技术栈实现适合作为毕设项目、课程设计或工程实训的参考方案。系统涵盖用户注册登录、房屋供求信息录入出租、出售、求购、求租、个人信息管理及个人已发布房源维护等前台模块并包含论文文档可帮助读者理解从需求分析到功能落地的完整流程。资源包共151个文件以86个jsp页面文件为核心辅以jpg、gif等图片素材、htm静态页、db数据库文件及doc论文文档压缩包约6.65MB结构清晰便于按模块查阅。目前已有41人学习适合具备一定Java Web基础、能自行调试代码并在此基础上扩展功能的进阶学习者参考借鉴。1. 房产中介系统毕设JSPSqlServer 这套老技术栈为什么还值得做每年毕业季计算机专业的学生都会面临同一个问题选题。有人选大数据有人选深度学习但真正能在两周内跑通、答辩时不被老师问倒的往往是那些看起来“老”的技术栈。JSPSqlServer 实现的房产中介系统就是这样一个典型——它不新但它完整、可控、资料多而且能覆盖 JavaWeb 的核心知识点。这个系统的本质是一套信息管理系统核心业务围绕房源、客户、员工三条线展开。房源录入、客户登记、成交记录、权限管理这些模块拆开看都不复杂但合在一起就是一个完整的 Web 应用。适合谁做适合 JavaWeb 课程刚学完、想找一个能写进简历、能通过答辩、代码量在可控范围内的本科生。你不需要会 Spring Boot不需要懂微服务只要理解 Servlet 和 JSP 的请求响应模型就能把整套系统搭起来。提示这套技术栈在高校答辩场景中接受度很高老师熟悉、环境好配、出问题容易定位不要因为“技术旧”就否定它的实用价值。2. 环境搭建与数据库设计从 SqlServer 安装到建表脚本2.1 SqlServer 安装与配置管理器设置SqlServer 的安装是很多人的第一个翻车点。常见做法是下载 Developer 版或 Express 版安装时选择“混合模式”认证设置 sa 账号密码。安装完成后打开 SqlServer 配置管理器确认 TCP/IP 协议已启用端口默认 1433。如果安装后连不上先检查服务是否启动再看防火墙有没有放行 1433 端口。安装过程中有一个容易忽略的选项排序规则。建议保持默认的 Chinese_PRC_CI_AS避免中文乱码。安装路径不要带空格和中文否则后续附加数据库时可能报错。-- 创建数据库 CREATE DATABASE HouseAgencyDB ON PRIMARY ( NAME HouseAgencyDB_data, FILENAME D:\SQLData\HouseAgencyDB_data.mdf, SIZE 10MB, FILEGROWTH 5MB ) LOG ON ( NAME HouseAgencyDB_log, FILENAME D:\SQLData\HouseAgencyDB_log.ldf, SIZE 5MB, FILEGROWTH 2MB ); GO这段脚本创建了一个名为 HouseAgencyDB 的数据库数据文件和日志文件分开存放。FILEGROWTH 设置为 5MB 和 2MB避免一次性增长过大。路径根据自己机器实际情况修改建议放在非系统盘。2.2 核心表结构设计与建表语句房产中介系统的表不多但关系要理清。核心表包括用户表t_user、房源表t_house、客户表t_customer、成交记录表t_deal。用户表区分管理员、员工、普通用户三种角色用 role 字段标识。房源表关联发布员工客户表关联负责员工成交记录表关联房源和客户。-- 用户表 CREATE TABLE t_user ( user_id INT IDENTITY(1,1) PRIMARY KEY, username NVARCHAR(50) NOT NULL UNIQUE, password NVARCHAR(50) NOT NULL, real_name NVARCHAR(50), phone NVARCHAR(20), role INT DEFAULT 0, -- 0普通用户 1员工 2管理员 create_time DATETIME DEFAULT GETDATE() ); -- 房源表 CREATE TABLE t_house ( house_id INT IDENTITY(1,1) PRIMARY KEY, title NVARCHAR(100) NOT NULL, address NVARCHAR(200), area DECIMAL(10,2), price DECIMAL(18,2), house_type NVARCHAR(50), -- 如两室一厅 floor NVARCHAR(20), description NVARCHAR(500), status INT DEFAULT 0, -- 0待售 1已售 2下架 agent_id INT, create_time DATETIME DEFAULT GETDATE(), FOREIGN KEY (agent_id) REFERENCES t_user(user_id) );建表时注意字段类型的选择。金额用 DECIMAL 而不是 FLOAT避免精度丢失。状态字段用 INT 配合注释比直接存中文更规范。外键约束保证数据一致性但插入数据时要注意顺序先插用户再插房源。注意SqlServer 中 NVARCHAR 和 VARCHAR 的区别要搞清楚中文内容一律用 NVARCHAR否则可能出现问号乱码。3. JSP 页面开发与 Servlet 请求处理从登录到房源列表3.1 IDEA 新建 JSP 项目与目录结构用 IDEA 新建一个 Java Enterprise 项目勾选 Web Application。目录结构如下src 下放 Java 代码web 下放 JSP 页面和 WEB-INF。WEB-INF 里放 web.xml 和 lib 目录。lib 目录需要手动加入 SqlServer 的 JDBC 驱动 jar 包常见的是 mssql-jdbc-9.4.1.jre8.jar 或更高版本。项目配置中Artifacts 要确认输出目录正确。部署到 Tomcat 时Application context 建议设为 /house这样访问地址就是 http://localhost:8080/house/。// DBUtil.java 数据库连接工具类 public class DBUtil { private static final String URL jdbc:sqlserver://localhost:1433;databaseNameHouseAgencyDB;encryptfalse; private static final String USER sa; private static final String PASSWORD your_password; public static Connection getConnection() throws SQLException { try { Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver); } catch (ClassNotFoundException e) { e.printStackTrace(); } return DriverManager.getConnection(URL, USER, PASSWORD); } }连接字符串中 encryptfalse 是必须的否则新版驱动会报 SSL 错误。这个坑很多人踩过现象是连接直接超时或抛出 SSLException。把驱动 jar 放到 WEB-INF/lib 下IDEA 里还要在 Project Structure 的 Libraries 中确认已引用。3.2 登录功能JSP 表单 Servlet 处理登录是最基础的模块但涉及请求接收、数据库查询、Session 存储三个关键点。login.jsp 负责展示表单LoginServlet 负责处理请求。!-- login.jsp 核心表单 -- form actionLoginServlet methodpost 用户名input typetext nameusername requiredbr 密码input typepassword namepassword requiredbr input typesubmit value登录 /form// LoginServlet.java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username request.getParameter(username); String password request.getParameter(password); String sql SELECT * FROM t_user WHERE username? AND password?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { HttpSession session request.getSession(); session.setAttribute(user, rs.getString(real_name)); session.setAttribute(role, rs.getInt(role)); response.sendRedirect(houseList.jsp); } else { request.setAttribute(msg, 用户名或密码错误); request.getRequestDispatcher(login.jsp).forward(request, response); } } catch (SQLException e) { e.printStackTrace(); } }这里用 PreparedStatement 而不是 Statement防止 SQL 注入。登录成功后把用户信息存入 Session后续页面通过 Session 判断权限。如果登录失败用 forward 而不是 redirect这样才能把错误信息带回页面。3.3 房源列表与分页查询房源列表是系统的主页面需要从数据库读取数据并展示。分页用 SQL Server 的 OFFSET FETCH 语法注意这个语法需要 SQL Server 2012 及以上版本。-- 分页查询房源 SELECT * FROM t_house ORDER BY create_time DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY;// HouseListServlet.java 分页逻辑 int page request.getParameter(page) null ? 1 : Integer.parseInt(request.getParameter(page)); int pageSize 10; int offset (page - 1) * pageSize; String sql SELECT * FROM t_house ORDER BY create_time DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setInt(1, offset); ps.setInt(2, pageSize); ResultSet rs ps.executeQuery(); ListHouse list new ArrayList(); while (rs.next()) { House h new House(); h.setTitle(rs.getString(title)); h.setPrice(rs.getBigDecimal(price)); // 其他字段省略 list.add(h); } request.setAttribute(houseList, list); request.getRequestDispatcher(houseList.jsp).forward(request, response); }分页参数 page 从 URL 获取默认第一页。OFFSET 的计算是 (page-1)*pageSize。如果数据库版本低于 2012需要用 ROW_NUMBER() 的方式改写这是常见兼容性问题。提示SqlServer 字符串转数字用 CAST 或 CONVERT比如 CAST(123 AS INT)。如果字符串包含非数字字符转换会报错先用 ISNUMERIC 判断。4. 避坑与排查JSPSqlServer 毕设中最容易翻车的 5 个点4.1 中文乱码现象、原因与解决现象页面提交中文后数据库里显示问号或者页面显示乱码。原因通常有三层JSP 页面编码、请求编码、数据库编码。解决方法是三层统一。JSP 页面顶部加% page contentTypetext/html;charsetUTF-8 %Servlet 中在获取参数前设置request.setCharacterEncoding(UTF-8)数据库字段用 NVARCHAR连接字符串不需要额外加字符集参数。4.2 驱动加载失败ClassNotFoundException现象启动 Tomcat 后访问页面控制台报 ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver。原因是驱动 jar 没有放到 WEB-INF/lib 下或者 IDEA 的 Artifact 中没有包含该 jar。解决方法是确认 jar 在 lib 目录然后在 Project Structure 的 Artifacts 中检查 Output Layout 是否包含 lib 下的所有文件。4.3 分页查询报错OFFSET 语法不支持现象执行分页 SQL 时提示“OFFSET 附近有语法错误”。原因是 SQL Server 版本低于 2012不支持 OFFSET FETCH。解决方法是改用 ROW_NUMBER() 子查询或者升级数据库版本。如果不想改 SQL也可以在 Java 层用 List 的 subList 做内存分页但数据量大时性能差。4.4 数据库连接超时TCP/IP 未启用现象程序启动后连接数据库一直超时报“连接被拒绝”。原因是 SqlServer 配置管理器中 TCP/IP 协议未启用。解决方法是打开配置管理器找到 SQL Server 网络配置启用 TCP/IP重启 SQL Server 服务。同时确认防火墙放行 1433 端口。4.5 Session 丢失浏览器禁用 Cookie 或超时现象登录后跳转到其他页面Session 中的用户信息取不到。原因可能是浏览器禁用了 Cookie或者 Session 超时时间太短。解决方法是在 web.xml 中配置 session-config延长超时时间如果 Cookie 被禁用可以用 URL 重写的方式传递 sessionid但更推荐提示用户开启 Cookie。5. 从能跑到能答辩论文写作与代码整理的几个实用技巧5.1 论文结构怎么搭才不被老师挑刺毕业论文的结构一般是绪论、需求分析、系统设计、系统实现、测试与总结。绪论部分不要抄太多背景重点写“为什么选这个题目”和“国内外现状”。需求分析用用例图系统设计用 E-R 图和功能结构图系统实现贴关键代码和运行截图。测试部分写几个典型测试用例比如登录失败、分页边界、权限拦截。代码整理时把核心代码按模块归类不要把所有代码都贴进论文。一般选 3-5 个关键类或方法即可比如 DBUtil、LoginServlet、分页查询。截图要清晰标注图号和图名。5.2 答辩时老师最常问的 3 个问题第一个问题通常是“你的系统有什么创新点”。不要硬编创新可以说“在权限控制上做了细粒度区分”或者“分页查询做了参数校验”。第二个问题是“数据库设计为什么这样建表”。回答时强调三范式和外键约束。第三个问题是“如果并发量大了怎么办”。可以说“目前是单机部署后续可以引入连接池和缓存”不要不懂装懂。5.3 代码打包与部署WAR 包导出与 Tomcat 运行IDEA 中通过 Build Artifacts 生成 WAR 包把 WAR 放到 Tomcat 的 webapps 目录下启动 Tomcat 会自动解压部署。访问地址是 http://localhost:8080/项目名/。如果部署后 404检查 web.xml 中的 welcome-file 配置以及 Artifact 的输出目录是否正确。# 打包命令示例在项目根目录执行 # 如果使用 Maven mvn clean package # 如果使用 IDEA 手动打包 # Build - Build Artifacts - 选择 war - Build打包前确认 web.xml 版本与 Tomcat 版本匹配。Tomcat 9 用 Servlet 4.0Tomcat 10 用 Servlet 5.0包名从 javax 变成 jakarta升级时要注意。5.4 一个我踩过的坑数据库附加失败有次把项目拷到另一台机器附加数据库时提示“无法打开物理文件操作系统错误 5”。原因是 SQL Server 服务账户没有权限访问该目录。解决方法是把 mdf 和 ldf 文件放到 SQL Server 默认数据目录或者给 Everyone 账户加读写权限。这个坑花了我两个小时希望帮到你。做毕设这件事代码能跑只是及格线能把设计思路讲清楚、把踩过的坑说明白才是真正拉开差距的地方。我一般会建议学弟学妹在答辩前把系统完整跑三遍每遍都换一台机器确保环境依赖都写清楚了。本文还有配套的精品资源点击获取