简介:这是一套面向高校计算机相关专业学生的房产中介系统毕业设计参考资料,采用JSP与SqlServer技术栈实现,适合作为毕设项目、课程设计或工程实训的参考方案。系统涵盖用户注册登录、房屋供求信息录入(出租、出售、求购、求租)、个人信息管理及个人已发布房源维护等前台模块,并包含论文文档,可帮助读者理解从需求分析到功能落地的完整流程。资源包共151个文件,以86个jsp页面文件为核心,辅以jpg、gif等图片素材、htm静态页、db数据库文件及doc论文文档,压缩包约6.65MB,结构清晰便于按模块查阅。目前已有41人学习,适合具备一定Java Web基础、能自行调试代码并在此基础上扩展功能的进阶学习者参考借鉴。
1. 房产中介系统毕设:JSP+SqlServer 这套老技术栈为什么还值得做
每年毕业季,计算机专业的学生都会面临同一个问题:选题。有人选大数据,有人选深度学习,但真正能在两周内跑通、答辩时不被老师问倒的,往往是那些看起来“老”的技术栈。JSP+SqlServer 实现的房产中介系统就是这样一个典型——它不新,但它完整、可控、资料多,而且能覆盖 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;databaseName=HouseAgencyDB;encrypt=false"; 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); } }连接字符串中 encrypt=false 是必须的,否则新版驱动会报 SSL 错误。这个坑很多人踩过,现象是连接直接超时或抛出 SSLException。把驱动 jar 放到 WEB-INF/lib 下,IDEA 里还要在 Project Structure 的 Libraries 中确认已引用。
3.2 登录功能:JSP 表单 + Servlet 处理
登录是最基础的模块,但涉及请求接收、数据库查询、Session 存储三个关键点。login.jsp 负责展示表单,LoginServlet 负责处理请求。
<!-- login.jsp 核心表单 --> <form action="LoginServlet" method="post"> 用户名:<input type="text" name="username" required><br> 密码:<input type="password" name="password" required><br> <input type="submit" 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(); List<House> 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. 避坑与排查:JSP+SqlServer 毕设中最容易翻车的 5 个点
4.1 中文乱码:现象、原因与解决
现象:页面提交中文后,数据库里显示问号,或者页面显示乱码。原因通常有三层:JSP 页面编码、请求编码、数据库编码。解决方法是三层统一。JSP 页面顶部加<%@ page contentType="text/html;charset=UTF-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.0,Tomcat 10 用 Servlet 5.0,包名从 javax 变成 jakarta,升级时要注意。
5.4 一个我踩过的坑:数据库附加失败
有次把项目拷到另一台机器,附加数据库时提示“无法打开物理文件,操作系统错误 5”。原因是 SQL Server 服务账户没有权限访问该目录。解决方法是把 mdf 和 ldf 文件放到 SQL Server 默认数据目录,或者给 Everyone 账户加读写权限。这个坑花了我两个小时,希望帮到你。
做毕设这件事,代码能跑只是及格线,能把设计思路讲清楚、把踩过的坑说明白,才是真正拉开差距的地方。我一般会建议学弟学妹在答辩前把系统完整跑三遍,每遍都换一台机器,确保环境依赖都写清楚了。
本文还有配套的精品资源,点击获取