ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JSP+Servlet+JDBC三层架构酒店管理系统:从部署到二次开发全解析

JSP+Servlet+JDBC三层架构酒店管理系统:从部署到二次开发全解析 简介一套基于Java Web的在线酒店管理系统设计与实现源码包主要面向Java Web方向学习者、课程设计与毕业设计人群可作为完整项目参考。系统覆盖前台会员注册/登录、网上预订/退房以及后台客房、入住、预订、退房、会员、系统管理等六大管理模块从界面操作到SQL数据表设计均包含在源码中整体闭环清晰。包内共221个文件以72个java源码、72个class编译文件、42个jsp页面为主体同时配有数据库脚本、样式表、脚本交互、说明文档及图片素材等压缩包大小为5.91MB目录划分便于按前端展示、后台逻辑、数据持久层查阅。从内容预览可见包含多种DAO实现类和Excel导出工具类有助于理解JSP、Servlet与JavaBean的分层协作方式以及预订历史、退房记录等报表导出思路。资源还附带数据库文件与部署说明可在Tomcat、MySQL、MyEclipse环境下直接运行体验。目前已有376人学习下载适合用于Java Web项目实战练习、毕业设计参照或酒店管理系统的二次开发。1. 在线酒店管理系统十年前的技术栈为什么今天依然值得跑一遍找 Java web 项目源码做课设或毕设最常见的翻车点不是功能太少而是环境配不起来。Spring Boot 项目上手要先对付一大串 starter 和依赖老手都头疼更别说还要现场演示。这套在线酒店管理系统走的是完全相反的路子JSP 直接连 ServletServlet 调 DAODAO 里写 JDBC整条链路从登录到退房没有任何框架黑匣子。系统覆盖前台会员注册、登录、网上预订、退房后台客房、入住、预订、退房、会员、系统管理还附带数据库脚本、课程设计文档和外文翻译拿来做 Java web 课设模板、复习 Servlet/JSP/DAO 的实操蓝本都合适十分钟就能把业务链路理清剩下的时间全在写代码和调页面上。2. 从十个DAO类反推数据模型表结构、业务链路与三层架构2.1 从类名还原表结构每张表存什么资源展示的十个类名信息量其实很大。RoomtypeDAOImpl、RoomLeibieDAOImpl、RoomreserveDAOImpl、HuiyuanDAOImpl、UserDAOImpl、RoomreserveHistoryDAOImpl、DengjiDAOImpl、TuifangDAOImpl再加上两个带 Excel 后缀的导出类基本就是这套系统的数据模型地图。Huiyuan 是“会员”的拼音Dengji 是“登记”Tuifang 是“退房”老一代 Java web 项目里这种命名很常见看到拼音类名反查数据库表是接手这类项目的第一个实用技巧。按命名习惯还原核心表大致是这么一张DAO 类名对应表关键字段按常见设计推断UserDAOImpluser后台管理员账号、密码、角色HuiyuanDAOImplhuiyuan会员编号、用户名、密码、手机号、证件号、注册时间RoomtypeDAOImplroomtype房型编号、房型名称、价格、面积、可住人数RoomLeibieDAOImplroomleibie类别编号、类别名称、描述RoomreserveDAOImplroomreserve预订编号、会员编号、房间编号、入住时间、离店时间、状态RoomreserveHistoryDAOImpl预订历史表结构类似 roomreserve增加归档时间DengjiDAOImpldengji登记编号、房间编号、入住时间、押金TuifangDAOImpltuifang退房编号、房间编号、退房时间、消费金额表格里标了“按常见设计推断”因为我没打算替你把每个字段都背出来但按这套命名习惯MySQL 脚本里的结构应该八九不离十。拿到资源后先把 show tables 和 desc 各表过一遍比直接看代码更快建立全局观。这里还有个容易被忽略的细节项目正文展示的是编译后的 .class 类名说明资源里同时存在源码目录和编译产物学习时看 .java部署运行时用编译好的 .class两边要对应得上别改完源码忘记重新编译。2.2 两条业务主线前台预订和后台管理的状态流转这套系统实际在跑两条业务主线。前台会员注册后登录查房型、提交预订在 roomreserve 表里生成一条“待确认”记录管理员在后台确认预订客人到店后做登记DengjiDAOImpl房间变成“已入住”离店时办理退房TuifangDAOImpl计算消费金额把记录归档到历史表同时可以导出 Excel 报表。整个过程是一张清晰的状态机可预订 → 已预订 → 已确认 → 已入住 → 已退房。后台这条线更长一点管理员用 user 表登录后客房管理维护 roomtype 和 roomleibie预订管理处理会员提交的预订请求入住管理负责登记退房管理负责结算和归档系统管理管用户和基础配置。前后台共用同一套数据库靠状态字段区分阶段这种设计在管理类课设里非常典型。理解了状态流转后面看代码就不会在 DAO 之间转晕尤其是预订、登记、退房三个 DAO 的边界全由这条状态线划死。2.3 三层调用关系JSP 页面、Servlet、DAOImpl 各干各的活代码组织是标准的 JSP Servlet DAO 三层。JSP 页面负责展示和收集表单Servlet 接收请求、取参数、调 DAODAOImpl 里写 JDBC 语句读写 MySQL。一次订房请求的调用链大致是这样netroomreserve.jsp 页面的表单提交到预订相关的 ServletServlet 把提交的房型、入住日期、离店日期取出来组装成 Roomreserve 对象调用 RoomreserveDAOImpl 的插入方法最终落到 roomreserve 表。任何一个环节的代码都是打开的不需要翻框架源码。这套结构和现在 Spring Boot 项目的 Controller → Service → Mapper 是一一对应的只是把注解换成了 new 对象、把 MyBatis 换成了原生 JDBC。所以对还在背 java 基础面试题的新手来说把这份老源码从头读一遍Servlet 生命周期、request/response、PreparedStatement 这些概念全部变成看得见摸得着的东西对熟手来说它是一个轻量级课设骨架删掉业务表就能改成会议室预订、车辆调度等其他管理场景。唯一要适应的风格是老代码的变量命名偏拼音化注释可能不多但胜在结构极简每个 DAO 对应一张表职责一眼能看出来。3. 把老项目跑起来JDK 6、Tomcat 6、MySQL 5.x 的部署全过程3.1 版本怎么配Tomcat 6、JDK、MySQL 的兼容关系部署前先把版本关系理清这一步决定后面是顺风顺水还是连环翻车。这套项目指定 Tomcat 6.0对应的 JDK 最好是 1.6 或 1.7MySQL 用 5.x 系列最稳MyEclipse 6.0 只是开发工具不装它也能把项目跑起来。版本匹配按这张表来就不会迷路组件推荐版本备注JDK1.6 / 1.7Tomcat 6 官方支持到 JDK 1.7JDK 8 有兼容风险Tomcat6.0.x端口默认 8080MySQL5.0 5.7驱动用 mysql-connector-java 5.xIDEMyEclipse 6.0不强求Eclipse JEE 或命令行均可我见过最多的问题就是机器上只有 JDK 8Tomcat 6 启动时直接报错或闪退。如果你的环境只有新 JDK优先单独装一个 JDK 1.7把环境变量 JAVA_HOME 指到它其他开发工具用哪个 JDK 无所谓Tomcat 只认 JAVA_HOME。这一步是部署成本最低、收益最大的一处后悔药比你改代码换框架便宜多了。3.2 先把数据库倒进去MySQL 命令行导入与编码拿到资源先把数据库脚本导进 MySQL。启动 MySQL 服务后在命令行执行mysql --default-character-setutf8 -uroot -p hotel.sql如果脚本文件名不是 hotel.sql按资源里的实际文件名替换。--default-character-setutf8 这个参数不能省老脚本的建表语句和注释常常是 UTF-8 编码不加参数会在导入阶段就出现中文乱码甚至语法报错-uroot 是用户名-p 回车后会提示输入密码。导入完成后连进去验证一下mysql -uroot -p show databases; use hotel; show tables;表清单里应该能看到 user、huiyuan、roomtype、roomreserve、dengji、tuifang 这一批表。select * from user; 看一下默认管理员账号后面登录要用。如果导入时报 1064 语法错误先不要怀疑脚本有问题多半是命令行客户端的字符集和脚本不一致把 --default-character-setutf8 参数加上再导一次九成能解决。3.3 工程怎么进 Tomcat两种发布方式工程发布有两种走法。第一种是按摘要里的标准路径MyEclipse 里 File → Import → Existing Projects into Workspace 选中 webproject然后在 Servers 视图把工程 Add Deployment 到 Tomcat 6.0启动服务器。这种做法的好处是利用 IDE 的增量发布改 JSP 不用重启缺点是你得有 MyEclipse老版本在现在的高分屏上界面比较难受。第二种是我更常用的方式完全绕开 IDE直接把 webproject 目录复制到 Tomcat 的 webapps 下cp -r webproject /usr/local/tomcat6/webapps/ cd /usr/local/tomcat6/bin ./startup.shWindows 下对应的是把 webproject 文件夹拷到 Tomcat 安装目录的 webapps 里然后双击 startup.bat。Tomcat 启动时会自动扫描 webapps 目录把 webproject 当成一个 web 应用加载目录名就是访问路径里的上下文名不需要额外配置。启动成功后浏览器访问 http://localhost:8080/webproject/login.jsp能打开登录页就说明 web 容器这一环通了。注意项目目录里必须有 WEB-INF/web.xml否则 Tomcat 不认为它是一个 web 应用目录拷进去也不加载。3.4 两个入口 URL 背后对应哪些功能这套系统有两个入口对应前台和后台两套界面。后台登录入口是 http://localhost:8080/webproject/login.jsp用 user 表里的管理员账号登录后进管理后台前台入口是 http://localhost:8080/webproject/netroomreserve.jsp会员在这里注册、登录、选房型提交预订。摘要里写的 URL 没有 8080 端口说明原环境把 Tomcat 端口改成了 80你本地默认端口是 8080访问时把端口带上就行。上下文路径这个概念要搞明白URL 里中间的 webproject 是上下文路径和工程名一致改端口、改目录名都会直接反映到访问地址上。前台和后台共用同一套 MySQL 数据会员在前台提交预订管理员在后台立刻就能看到待确认记录这套联动逻辑是系统演示时最出效果的地方。4. 核心功能走读从 login.jsp 到退房 Excel 导出的完整链路4.1 登录怎么拦的从 login.jsp 到 UserDAOImpl登录功能是所有管理系统的第一道门。login.jsp 页面提交用户名和密码Servlet 接收后调 UserDAOImpl 查 user 表判断账号密码是否匹配再把登录对象丢进 session。按这套代码的惯例校验逻辑大致是这个结构String name request.getParameter(username); String pwd request.getParameter(password); User user userDAO.findByUsername(name); if (user ! null user.getPassword().equals(pwd)) { session.setAttribute(loginUser, user); response.sendRedirect(admin/index.jsp); } else { request.setAttribute(msg, 用户名或密码不正确); request.getRequestDispatcher(login.jsp).forward(request, response); }request.getParameter 从表单取参数userDAO.findByUsername 是 DAO 接口里定义、UserDAOImpl 里用 JDBC 实现的查询方法。登录成功后把 user 对象放进 session后续每个后台管理页面在开头检查 session 里的 loginUser 有没有值没有就跳回 login.jsp这是老项目最常见的权限控制写法。失败分支用 forward 把错误消息带回登录页用户看到提示后重新输入而不是跳到一个新页面这个细节值得照着写。4.2 网上订房完整链路netroomreserve.jsp 提交了什么前台订房页面 netroomreserve.jsp 提交的核心字段是房型、入住日期、离店日期、会员标识。Servlet 收到请求后调 RoomreserveDAOImpl插入一条 state 为“待确认”的预订记录。这背后有一个容易漏掉的业务判断同一个房间在重叠时间段内不能被重复预订。常见做法是插入前先查一次冲突记录String checkSql select count(*) from roomreserve where room_id? and status ! 3 and begin_time ? and end_time ?; PreparedStatement ps conn.prepareStatement(checkSql); ps.setInt(1, roomId); ps.setString(2, endTime); ps.setString(3, beginTime); ResultSet rs ps.executeQuery();这段 SQL 的逻辑是找“结束时间比新预订开始时间晚且开始时间比新预订结束时间早”的未退房记录只要 count 大于 0就说明时间段重叠需要提示用户换房或换时间。room_id 是房间编号status ! 3 过滤掉已退房的旧记录beginTime 和 endTime 是页面传来的入住和离店日期。能看懂这一段就理解了酒店预订系统最核心的防冲突逻辑也是一般课设里最容易糊弄过去的地方。4.3 后台的登记、退房与 Excel 导出后台几个 DAO 的职责非常清楚。DengjiDAOImpl 负责办理入住客人到店后管理员从预订列表里挑出已确认的记录登记入住把房间状态改成“已入住”TuifangDAOImpl 负责退房按房价乘以入住天数计算消费金额写退房记录恢复房间状态为可预订同时把这条业务归档到历史表。RoomreserveHistoryDAOImpl 和两个 Excel 类就是这一步的配套历史数据落库后可以按条件导出报表。退房记录的 Excel 导出是这套系统里比较有含金量的功能核心是用 POI 生成 xls 文件HSSFWorkbook wb new HSSFWorkbook(); HSSFSheet sheet wb.createSheet(退房记录); HSSFRow header sheet.createRow(0); header.createCell(0).setCellValue(退房单号); header.createCell(1).setCellValue(房间编号); header.createCell(2).setCellValue(退房时间); header.createCell(3).setCellValue(消费金额); // 循环写入数据行 response.setContentType(application/vnd.ms-excel); response.setHeader(Content-Disposition, attachment;filenametuifang.xls); wb.write(response.getOutputStream());createRow(0) 是第一行通常放表头createCell 按列索引写单元格。这里用的是 HSSF对应 Excel 97-2003 的 .xls 格式老项目里基本都是这个写法想导出 xlsx 得用 XSSFWorkbook但对课设和二开场景xls 用 WPS 和 Excel 都能直接打开没必要折腾。Content-Disposition 里 attachment 表示下载而不是浏览器直接打开filename 是下载后的文件名汉字文件名要注意 URL 编码否则部分浏览器会乱码。5. 部署避坑清单五条血泪经验与排查顺序5.1 Tomcat 启动闪退窗口一闪就没了现象双击 startup.bat黑窗口一闪而过Tomcat 没起来浏览器访问 8080 打不开。原因绝大多数是 JAVA_HOME 环境变量没配或者指向的 JDK 版本超出 Tomcat 6 的兼容范围。解决先配置 JAVA_HOME 指向 JDK 1.7 的安装目录再把 %JAVA_HOME%\bin 加进 PATH然后重新启动如果还是闪退打开 cmd 手动执行 startup.bat这样能看到完整错误输出比双击窗口猜原因高效得多。5.2 8080 被占Tomcat 起不来现象startup.bat 执行后显示 Address already in use: JVM_Bind或者只出现一个 Tomcat 图标后很快消失。原因8080 端口被其他程序占用最常见的占用者是另一个 Tomcat 实例、Oracle 或某些开发工具内置的 HTTP 服务。解决命令行执行 netstat -ano | findstr 8080 查占用进程的 PID任务管理器结束掉对应进程或者改 Tomcat 端口。改端口在 conf/server.xml 里找 Connector port8080 ...把 8080 改成 8081然后访问 http://localhost:8081/webproject/login.jsp。改完端口要同步改访问地址不然就是“Tomcat 起来了但页面打不开”这种怪状。5.3 页面全是问号和乱码现象登录页和后台页面显示中文全是 “??” 或方格。原因三个环节只要有一个不一致就会乱码——JSP 文件的 pageEncoding、Tomcat 收到的请求字符集、MySQL 表字段的字符集。老项目在这三个地方常常写得不统一。解决先确认 JSP 头部有 % page contentTypetext/html;charsetutf-8 pageEncodingutf-8 %再在接收参数的 Servlet 里加 request.setCharacterEncoding(UTF-8)最后检查 MySQL 建库语句有没有 DEFAULT CHARACTER SET utf8。数据库乱码的补救措施是把库和表都改成 utf8 后重新导入脚本页面乱码的补救是在 JSP 和 Servlet 两处都补上字符集设置。5.4 数据库连不上驱动、URL、密码逐个查现象点击登录或提交预订页面报 Communications link failure、ClassNotFoundException或者直接提示无法连接数据库。原因连接失败集中在三个点——数据库驱动 jar 没有放进 WEB-INF/lib、连接 URL 写错、MySQL 用户名或密码与代码配置不一致。解决先检查 WEB-INF/lib 里有没有 mysql-connector-java 的 jar没有就从资源里找出来放进去再打开 DAO 或工具类里的连接配置确认 URL 是 jdbc:mysql://localhost:3306/hotel?useUnicodetruecharacterEncodingutf8 这种格式数据库名 hotel 要和实际库名一致最后核对用户名密码。如果换成 MySQL 8老驱动连不上需要把驱动类换成 com.mysql.cj.jdbc.Driver并在 URL 后面加 serverTimezoneAsia/Shanghai。5.5 首页 404上下文路径没搞明白现象Tomcat 正常启动但访问 http://localhost:8080/login.jsp 报 404或访问不带工程名的地址打不开页面。原因web 应用部署在 webapps 的 webproject 目录下访问时必须带上下文路径 /webproject。解决确认目录是 webapps/webproject 而不是 webapps 下散落一堆 jsp访问地址写成 http://localhost:8080/webproject/login.jsp。另一个常见原因是工程里缺 WEB-INF/web.xmlTomcat 不认它是 web 应用这种直接看目录结构就能发现。把上下文路径和端口理解成 URL 的前两段遇到 404 先检查这两段比乱试链接快得多。6. 二次开发小改造给酒店管理系统做两处现代修补6.1 把硬编码 JDBC 换成连接池老项目每个 DAO 方法里都 DriverManager.getConnection 拿连接用完再关。并发一高光建连接就够服务器喝一壶。最常见的改造是把连接来源换成 DBCP 连接池改动量很小只需要在工具类里换一种拿连接的方式BasicDataSource ds new BasicDataSource(); ds.setDriverClassName(com.mysql.jdbc.Driver); ds.setUrl(jdbc:mysql://localhost:3306/hotel?characterEncodingutf8); ds.setUsername(root); ds.setPassword(123456); ds.setInitialSize(5); ds.setMaxActive(20); Connection conn ds.getConnection();initialSize 是池子初始连接数maxActive 是最大活跃连接数这两个值根据演示环境调课设场景分别设 5 和 20 足够。把 commons-dbcp 和 commons-pool 两个 jar 放进 WEB-INF/lib再把原来 DBUtil 里 getConnection 的静态方法替换成从 ds 拿连接DAO 层代码完全不用动。注意替换时先只改工具类不要全局搜索连接字符串否则容易改乱。6.2 给预订列表加一个时间筛选后台预订管理页面一般只展示全部记录演示时想查“某个日期段内有哪些预订”得加一个筛选。核心是给 DAO 增加一个带参数的查询方法public ListRoomreserve findReserveByDate(String begin, String end) { String sql select * from roomreserve where begin_time ? and end_time ? order by begin_time; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, begin); ps.setString(2, end); return toList(ps.executeQuery()); }这里刻意不用字符串拼接参数而是用 PreparedStatement 的 ? 占位符一是防止 SQL 注入二是参数类型由 JDBC 驱动处理日期格式不对时数据库会直接报错而不是给你脏数据。begin 和 end 是页面传来的日期字符串前台表单里放两个 typedate 的输入框就行。加上这个筛选后预订管理页就从一个“死列表”变成了可查可导的报表入口演示效果会好很多。这套从 JDBC 到连接池、从硬查询到参数化查询的改法是我在课堂设计和二次开发里反复用到的两板斧每次都能让老系统明显变顺。这套酒店管理系统我在本地完整跑过从解压到两个入口都通大约花了一个小时多数时间耗在 JDK 版本上。从那以后我每次接手这类老项目都强制先看 lib 目录和 web.xml再决定从哪里下手改这套习惯帮我少绕了很多弯路。希望帮到你。本文还有配套的精品资源点击获取
返回列表