首页 / 资讯中心 / 文章详情

JSP酒店管理系统课设:B/S架构与MySQL数据库实战全解析

JSP酒店管理系统课设:B/S架构与MySQL数据库实战全解析 ★ FEATURED ARTICLE
简介这是一套基于JSPMySQL的酒店管理系统采用B/S模式开发适合Java Web初学者、课程设计或毕业设计人员参考可帮助理解JSP页面与后台Java逻辑的配合以及数据库表结构与增删改查操作。压缩包共186个文件约1.28MB以JSP页面为主96个配以GIF和JPG图片资源及CSS样式另含Java类、SQL脚本、配置文件等页面结构清晰便于按模块拆解学习。系统提供完整源代码与数据库部署于Myeclipse/Eclipse、jdk、tomcat环境即可运行已有381人学习浏览。若配合CSDN介绍链接阅读能更好理解整体设计流程适合作为WEB课程设计或入门实战项目。1. JSP 酒店管理系统一份能跑通的 B/S 结构课设样本如果你正在做 JSP 相关的课程设计或者网络编程大作业手头缺一套「能打开、能登录、能连数据库」的完整参考那这份 JSP 酒店管理系统值得花半小时拆一遍。它不只是几个 JSP 页面堆在一起而是一套基于 B/S 模式、用 java JSP MySQL 实现的 Web 应用开发环境是 Myeclipse 或 Eclipse配合 JDK 和 Tomcat 就能跑起来。我最初拿到手是冲着「有源码有数据库」去的实际打开后发现里面还有 DBO.class、StaticMethod.class 这类封装好的工具类以及 web.xml.bak 和 index.jsp.bak 这两个备份文件对理解 JSP 请求处理、数据库连接、页面跳转都有很直接的参考价值。适合谁正在做数据库课程设计、JSP 网页编程课设、或者想抄一套完整 Web 项目结构的人尤其适合第一次接触 JSP Servlet MySQL 组合的在校生。2. 项目结构与运行逻辑先从备份文件和解压后的目录看起2.1 拿到压缩包后先做什么解压、辨认备份文件、导入工作区这套资源下载下来是一个压缩包里面不是单一文件夹而是直接裸露的工程文件。我第一次解压后看到的是一堆 .class、.jsp、.css、.bak 混在一起第一反应是「这怎么不是个完整工程目录」。实际上这是典型的 Myeclipse 导出方式把 WebRoot 下的文件直接打出来了你需要自己动手重建一个 Web 项目再把文件放进对应位置。我建议的导入顺序是先在 Myeclipse 里新建一个 Dynamic Web Project项目名随意比如 hotel然后把压缩包里的 index.jsp.bak 改名为 index.jspweb.xml.bak 改名为 web.xml再按 WebRoot 的目录结构放进去。注意 .classpath 文件是 Eclipse 工程识别的关键如果你是用 Eclipse 而不是 Myeclipse 导入直接复制 .classpath 能省去配置构建路径的麻烦。# 在项目根目录执行把备份文件批量改名 mv index.jsp.bak index.jsp mv web.xml.bak web.xml # 如果缺少 WEB-INF 目录手动创建 mkdir -p WEB-INF/classes这段命令的作用是把两个 .bak 备份文件恢复成 Tomcat 能识别的标准文件名。index.jsp 是应用的入口页面web.xml 是 Servlet 映射和欢迎页面的配置文件缺了这两个文件Tomcat 启动后访问项目会直接报 404 或者找不到资源。改完名后把 .class 文件放回 WEB-INF/classes 目录把 .css 文件放回 WebRoot 下对应的样式目录。关于 .class 文件有一点要提醒这些是编译后的字节码不是源码。如果你拿到的压缩包里只有 .class 而没有对应的 .java 文件那这些类的内部实现是看不到的但可以通过反编译工具或者直接调用去理解它的功能。DBO.class 从名字看就是 Database Operator负责数据库连接和增删改查StaticMethod.class 大概率是公共静态方法集合比如字符串校验、日期格式化这类工具。在实际课设答辩时你完全可以自己重写这两个类只要接口方法名保持一致业务层代码不需要改动。2.2 B/S 模式下的请求流转index.jsp 如何走到数据库再回到页面这套系统采用的是 B/S 模式也就是浏览器端发请求Tomcat 容器接收JSP 页面负责展示Java 类负责业务逻辑MySQL 负责数据存储。它的请求流转路径是用户在浏览器输入 http://localhost:8080/hotel/Tomcat 根据 web.xml 中的欢迎文件配置找到 index.jspindex.jsp 里通过表单或超链接把请求提交给对应的 Servlet 或者直接由 JSP 内置对象处理业务层调用 DBO.class 里的方法去连接 MySQL 执行 SQL结果集返回到 JSP 页面渲染成 HTML 表格或表单。我不建议你在这个项目里继续沿用 JSP 直接写 JDBC 的旧套路但如果你只是想快速跑通并理解原理那看 DBO.class 的调用方式就够了。下面是这类项目中最常见的数据库连接写法几乎每个 JSP 课设都长这样import java.sql.*; public class DBO { private static final String DRIVER com.mysql.jdbc.Driver; private static final String URL jdbc:mysql://localhost:3306/hotel?useUnicodetruecharacterEncodingutf-8; private static final String USER root; private static final String PASSWORD 123456; public static Connection getConnection() { Connection conn null; try { Class.forName(DRIVER); conn DriverManager.getConnection(URL, USER, PASSWORD); } catch (Exception e) { e.printStackTrace(); } return conn; } }这段代码的关键参数有三个URL 中的数据库名 hotel 必须和你导入的 SQL 脚本建的库名一致USER 和 PASSWORD 要改成你自己 MySQL 的用户名密码默认 root / 123456 是常见配置很多人翻车就翻在这里DRIVER 用的是 com.mysql.jdbc.Driver这是老版本 MySQL 驱动如果你的 MySQL 是 8.x需要换成 com.mysql.cj.jdbc.Driver同时 URL 里最好加上 serverTimezoneAsia/Shanghai 防止时区报错。实际项目里的 DBO.class 方法命名可能不是 getConnection但职责是一样的。你可以在 JSP 页面里用 %% 脚本片段直接 new 一个 DBO 实例来调用这就是 JSP 早期开发的典型风格。理解了这个流程你就明白为什么这套系统叫「网络编程」课设——它本质上是把 Servlet、JSP、JDBC、MySQL 四个东西串成一条完整的请求链。2.3 数据库初始化导入 SQL、建库、处理中文乱码这套项目自带数据库脚本文件名一般是 hotel.sql 或者 database.sql。导入方式有两种一种是在 MySQL 命令行里执行 source 命令另一种是在 Navicat 里直接运行 SQL 文件。我建议用命令行因为 Navicat 在某些版本下导入带 BOM 头的 SQL 文件会报语法错误。mysql -u root -p123456 hotel.sql执行后可以验证一下表是否建成功SHOW TABLES; DESC t_room; -- 假设房间表叫这个实际以 SQL 脚本为准导入数据库最容易踩的坑是字符集。SQL 文件里如果建表语句没有显式指定 utf8mb4而你的 MySQL 默认字符集是 latin1那页面显示中文就是问号。所以导入前建议确认 MySQL 的 character_set_database 是不是 utf8mb4如果不是就在 my.ini 里配置默认字符集后再导入。另一个坑是 SQL 文件里可能有 DROP TABLE IF EXISTS这会覆盖你已经建好的同名表如果你之前手动录入过测试数据执行前记得先备份。3. 核心模块与页面映射从前台展示到后台管理完整走一遍3.1 用户端页面查看房间、在线预订、订单确认这套酒店管理系统从功能上分至少包含两个端用户端和管理员端。用户端页面主要围绕房间浏览和预订操作展开。index.jsp 作为入口页一般展示酒店简介、房间类型列表和登录入口。房间列表页通过 JSP 内置的 request 对象接收数据库查询结果集然后用 while 循环遍历 ResultSet 生成表格行。典型的前台查询代码如下% Connection conn DBO.getConnection(); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT * FROM room WHERE status 空闲); while (rs.next()) { int id rs.getInt(id); String type rs.getString(room_type); double price rs.getDouble(price); % tr td%id%/td td%type%/td td%price%/td tda hrefbook.jsp?id%id%立即预订/a/td /tr % } rs.close(); stmt.close(); conn.close(); %这段代码是最原始的 JSP JDBC 查询方式适合课设展示但不适合真实项目。注意几个细节第一book.jsp 这个链接用 GET 方式传了一个 id 参数接收端用 request.getParameter(id) 就能拿到第二ResultSet 遍历之后必须关闭否则连接会一直占着第三如果 room 表里的字段名跟这里不一致比如叫 type 而不是 room_type页面会直接报 Column not found 错误。在线预订这个功能点很多同学的实现就是一个简单的 INSERT 语句把表单里的姓名、联系方式、房间号、入住日期插进去就算完了。但如果你想把项目做得更完整可以加状态判断——比如预订前先查一下这个房间是否已经被人订走避免超卖。加一个事务处理会让代码更严谨这也是答辩时老师最爱问的点。3.2 管理员端登录验证、房间管理、订单处理管理员端通常有独立的登录页面账号密码存储在数据库的 admin 表里。登录逻辑很简单表单提交用户名和密码到 login.jsp页面里通过 SQL 查询比对如果匹配就 session.setAttribute 写入登录状态跳到管理首页不匹配就返回错误提示。这里有个常见但很严重的隐患密码明文存储。如果你是课设无所谓但如果想在后端做自我提升建议用 MD5 加盐。房间管理模块的功能无非是增删改查。新增房间的表单页提交后在另一个 JSP 页面里拼 INSERT 语句执行删除操作则是在列表页加一个带 id 的删除链接。这些功能代码不复杂但每个页面都要写一遍连接数据库的样板代码代码冗余很严重。如果你愿意花时间重构可以把所有数据库操作收拢到一个 DAO 类里页面只调用方法代码量能少一半。订单处理是整个系统里最值得细看的部分。订单表一般包含预订人、房间号、入住时间、退房时间、总金额等字段。总金额的计算有两种方式一种是在 SQL 里直接算用 DATEDIFF 把入住天数算出来再乘单价另一种是在 Java 代码里取到两个日期后手动计算。SQL 方式更简洁但要特别注意日期空值的情况——如果退房时间为空DATEDIFF 会返回 NULL金额就变 NULL 了。SELECT DATEDIFF(check_out, check_in) AS days, price, DATEDIFF(check_out, check_in) * price AS total FROM orders o JOIN room r ON o.room_id r.id这条 SQL 是计算入住天数和总金额的常见写法。注意 DATEDIFF 是两个日期相减得到天数差MySQL 中日期格式默认是 yyyy-MM-dd如果你的表单传过来的是带时间的 timestamp 格式DATEDIFF 会忽略时间部分只按日期算。如果入住和退房是同一天DATEDIFF 结果是 0这个边界值得在课设文档里提一句。3.3 前端样式与 JSP 页面加载技巧css.css 和 admin.css 的配合这套系统里有两个样式文件css.css 管前台用户端admin.css 管后台管理端。如果你看到页面样式没生效先检查 web.xml 里有没有配置欢迎页以及 JSP 页面引入 CSS 的路径是不是写死了。JSP 页面引入 CSS 的常见写法是link relstylesheet typetext/css hrefcss/css.css这里有个经典的坑如果你的 JSP 页面在子目录里比如 admin/login.jsp那 href 里的相对路径就变成了 admin/css/css.css浏览器找不到文件就会样式全丢。正确的做法是用绝对路径从项目根目录出发link relstylesheet typetext/css href%request.getContextPath()%/css/admin.cssrequest.getContextPath() 会动态返回当前项目的根路径比如 /hotel这样不管你页面放在几级目录下都能正确找到 CSS 文件。这个细节在你自己新建页面往里套样式时特别有用也是网络编程课设里很常见的失分点。另外看到热搜里有人搜「jsp页面让加载完后刷新一次」如果你需要在页面加载后自动刷新一次可以在 里加一行meta http-equivrefresh content0; urlindex.jsp?t%System.currentTimeMillis()%加时间戳参数是为了防止浏览器缓存页面每次刷新都会读最新数据这个技巧在页面跳转后又想重新拉取列表的场景下很好使。但要注意不要写成死循环比如 index.jsp 里刷新到自身会导致页面无限刷新。4. Myeclipse 部署全过程从 JDK 到 Tomcat 再到 MySQL 的一次打通4.1 运行环境配置JDK、Tomcat、MySQL 三者版本怎么匹配这套项目是典型的 JSP 老项目对环境的兼容性要求不高但版本乱配还是会出问题。我建议的搭配是这样的JDK 用 1.7 或 1.8Tomcat 用 7 或 8MySQL 用 5.5 或 5.7。JDK 1.8 是目前课设环境里最温和的版本新的 JDK 11 以上对老代码的兼容性反而差比如某些反射和类加载行为会有变化。Tomcat 版本主要在 web.xml 的 schema 版本上有差异。如果你看到 web.xml 里写的是 2.3 或 2.4 版本的头声明那 Tomcat 9 可能不太友好因为 Tomcat 9 默认 Servlet 4.0对老版本 web.xml 的解析虽然支持但会有警告。建议直接用 Tomcat 8.5兼容性最稳。MySQL 驱动的问题前面提过。老项目自带的驱动 jar 一般是 mysql-connector-java-5.x如果数据库是 MySQL 8.x连接会报 Unable to load authentication plugin caching_sha2_password。解决方法是换成 8.x 的驱动包并且建连接时在 URL 后加 allowPublicKeyRetrievaltrueuseSSLfalse。这个坑几乎每隔一段时间就有人问一次。4.2 部署到 Tomcat 的两种方式Myeclipse 内部部署与手动部署Myeclipse 里部署 Web 项目有两种方式。第一种是右键项目名选择 Run As - MyEclipse Server ApplicationMyeclipse 会自动把项目发布到它自己管理的 Tomcat 实例中。这种方式适合开发调试因为你改了 JSP 代码后Tomcat 会自动重新加载页面不用手动重启。第二种是手动部署到外部 Tomcat把 WebRoot 下的所有文件复制到 tomcat 的 webapps/hotel 目录下然后启动 bin/startup.bat。手动部署的好处是你可以看到完整的物理文件结构方便排查问题也方便在没有 Myeclipse 的机器上演示。缺点是你改完代码需要手动重新编译和复制不能热更新。如果你想把项目打包成 war 文件在命令行里执行jar -cvf hotel.war .然后把 hotel.war 放到 Tomcat 的 webapps 目录下启动 Tomcat 后它会自动解压。这是最接近线上部署的方式答辩演示前用这种方式准备一份 war 文件是个不错的习惯。4.3 Myeclipse 打包可执行文件不是这个项目的刚需但要防坑最近搜 Myeclipse 打包可执行 exe 文件的人不少。这个需求通常是把 Java 程序打包成 exe一般用 exe4j 或者 launch4j 工具把 jar 包和启动参数包装成 Windows 可执行文件。但这套 JSP 酒店管理系统是 Web 应用它跑在 Tomcat 容器里不是桌面应用所以不需要也不可能打包成 exe。如果你搜到这类内容是为了理解 Java 程序分发方式那要注意区分Web 项目分发的是 war 包或整个 webapp 目录不是 exe。如果你的课设老师要求做一个可执行的东西那通常是要求你一键启动 Tomcat。常见做法是用一个批处理脚本把启动 Tomcat、检查 MySQL 服务、打开浏览器这三步串起来这样双击一个 bat 文件就能完成演示。echo off net start mysql call startup.bat start http://localhost:8080/hotel/这个脚本的逻辑是先确保 MySQL 服务已启动因为项目连接数据库需要它然后启动 Tomcat最后自动打开浏览器访问项目首页。注意 startup.bat 要在 Tomcat 的 bin 目录下执行所以脚本里要先用 cd 切到 bin 目录。如果 MySQL 服务名不是 mysqlnet start 会报错你需要先在服务管理器里查一下实际服务名再改脚本。5. 避坑指南JSP MySQL 课设最常见的 6 个翻车现场5.1 页面报 500 错误ClassNotFoundException 找驱动现象浏览器访问 index.jsp页面直接显示 HTTP Status 500后台日志里报 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。原因mysql-connector-java 的 jar 包没有放到 WEB-INF/lib 目录下或者放的位置不对。很多新手把 jar 复制到了项目根目录或 desktop但 Tomcat 只看 WEB-INF/lib 下和 Tomcat 自身的 lib 目录。解决把驱动的 jar 复制到项目的 WEB-INF/lib 目录下然后在 Myeclipse 里右键项目 - Build Path - Configure Build Path - Add JARs 把它加进编译路径。如果你用的是 Maven 工程那就要在 pom.xml 里加依赖而不是手动复制 jar但老项目这么干的不多。5.2 中文乱码页面、数据库、URL 三个环节都有一个编码坑现象页面显示中文变成 ??????或者插入数据库的中文在查询时显示乱码。原因三个地方不一致JSP 页面本身的编码、请求传输编码、数据库表字符集。JSP 页面顶部要写 % page languagejava contentTypetext/html; charsetutf-8 pageEncodingutf-8%缺少 pageEncoding 会导致 Tomcat 按默认的 ISO-8859-1 解码中文必乱。解决第一JSP 页面统一 utf-8第二如果是 POST 请求在接收参数前执行 request.setCharacterEncoding(utf-8)第三MySQL 建库语句加上 DEFAULT CHARSETutf8mb4第四连接 URL 里加上 characterEncodingutf-8。四个环节全对齐乱码问题才能根除缺一个都可能复发。5.3 404 找不到页面web.xml.bak 改名后映射没生效现象访问 http://localhost:8080/hotel/ 显示 404或者点了登录按钮后提示登录页面不存在。原因web.xml.bak 还是备份文件状态没有改名为 web.xmlTomcat 根本不读取它。另一个可能是 web.xml 里的 配置没有指到 index.jspTomcat 默认找 welcome-file 列表里的资源找不到就 404。解决先把 web.xml.bak 改成 web.xml打开后检查 welcome-file 节点是否包含 index.jsp。如果你是手动部署到 Tomcat还要确认 webapps/hotel 目录下确实有 index.jsp而不是 index.jsp.bak。welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list这段配置是让访问项目根路径时自动跳转到 index.jsp。如果你改了文件名但没改这个配置Tomcat 会优先匹配列表里的文件顺序从上到下找到第一个存在的文件就停止。index.jsp 如果不在列表里那永远打不开首页。5.4 Tomcat 端口被占用Address already in use现象eclipse 启动 Tomcat 报 Port 8080 required by Tomcat v8.0 Server at localhost is already in use或者是 Address already in use: JVM_Bind。原因上一个 Tomcat 实例没有正常关闭或者其它程序占了 8080 端口。常见场景是之前手动启动过 startup.bat然后直接关了命令行窗口实际上 Tomcat 的 java 进程还在后台跑着。解决在命令行里执行 netstat -ano | findstr 8080 查到占用进程的 PID再到任务管理器里结束对应进程。也可以把 Tomcat 改成 8081 端口改 conf/server.xml 里的 Connector 节点即可netstat -ano | findstr 8080 taskkill /PID PID /F5.5 MySQL 连接池要不要用老项目别乱加现象高并发访问时数据库连不上提示 Too many connections或者连接超时。原因每个 JSP 页面都 new 一个连接用完直接关在 Tomcat 这种线程池环境下频繁开关连接不仅慢还容易把 MySQL 的最大连接数打完。但如果你只是把这份课设跑通没有并发压力不引入连接池也能交差。解决如果想做得规范一点请用连接池。但要记住一件事修改 JSP 代码里的数据库获取方式是全局性的不是改一个页面就行。你需要把所有 getConnection 的调用收拢到一个工具类里然后切换成 Tomcat 的 JNDI 数据源或者 c3p0/Druid。我建议课设阶段用 Druid因为它自带监控页面答辩时还能多一个讲解点。5.6 Excel 或图片坐标定位的误区JSP 里做图片定位不如用 CSS现象在 JSP 页面里插入图片后发现位置怎么调都不对有人甚至去找「jsp图片如何对坐标定位」的答案。原因JSP 是服务端渲染页面图片的定位是浏览器 CSS 的活跟 JSP 没关系。你看到的坐标定位应该用 CSS 的 position、margin、padding 去实现。解决如果想在房间图片上叠加文字或标签用 CSS 定位div styleposition:relative; img srcroom1.jpg stylewidth:300px;height:200px; span styleposition:absolute;top:10px;left:20px;background:#fff;豪华大床房/span /div这个写法是给外层 div 设 relative 定位绝对定位的 span 会相对 div 来定位top 和 left 控制偏移量。这种技巧在酒店房间展示页面里很实用比如在房间图片上标注价格或状态标签。别去 JSP 里找坐标定位的方法那是方向错了。6. 进阶改造给这份课设加上参数化查询与上传下载支持把这份 JSP 酒店管理系统跑通之后如果你想在答辩里多拿几分我建议做三件事把 SQL 拼接改成 PreparedStatement、给系统加上文件上传功能、以及把密码改成 MD5 存储。这三件事分别对应设计模式、Servlet 3.0 特性和安全基础都是课设答辩时老师爱追问的点。先看 PreparedStatement 的改造。老项目里大概率全是 Statement 直接拼 SQL比如 String sql SELECT * FROM room WHERE id id。这有两个问题一是拼接时如果 id 是字符串字段容易出 SQL 注入漏洞二是每次执行都要先编译。改成 PreparedStatement 后参数用 ? 占位代码这样写String sql SELECT * FROM room WHERE room_type ? AND status ?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, roomType); ps.setString(2, status); ResultSet rs ps.executeQuery();参数说明setString 的下标从 1 开始对应 SQL 里第一个问号。这套写法的好处是 SQL 模板只编译一次参数值由驱动处理转义不会因为用户输入的单引号把 SQL 搞挂。我一般在课设里会用这个改造点当卖点因为老师看到 Statement 拼接第一反应就是问 SQL 注入。再来看文件上传。如果系统需要支持房间图片上传在老 Servlet 里要手动解析 multipart/form-data非常痛苦。如果你用的 Tomcat 7 以上直接在 JSP 里用 Servlet 3.0 的注解接口就行代码量小很多。上传保存路径建议放到项目的 WebRoot/upload 目录下注意要在 web.xml 里确认目录存在不然保存文件时路径找不到会抛异常。密码 MD5 改造也简单工具方法直接用 JDK 自带的 MessageDigestpublic static String md5(String password) { try { MessageDigest md MessageDigest.getInstance(MD5); byte[] bytes md.digest(password.getBytes(utf-8)); StringBuilder sb new StringBuilder(); for (byte b : bytes) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (Exception e) { throw new RuntimeException(MD5加密失败, e); } }这段代码把密码字符串先转成字节数组然后做 MD5 摘要再把每个字节格式化成两位十六进制数拼接。存储层改造就是在登录注册时把调用改为 md5(password) 再入库。需要注意纯 MD5 依然不够安全但如果课设场景够用。如果要让答辩更有亮点就加一个随机盐值。最后验证整个改造是否成功最有用的方式是给项目加一个 JSON 接口不需要装任何框架用 Servlet 写就行。比如查看某房间在指定日期段是否可订返回 JSON 布尔值。这样可以让 JSP 页面通过 AJAX 异步刷新房间状态用户端体验质的提升而且纯 JSON 的 Servlet 也更容易测试。从那以后我每次拿到这种课设包都会先跑一遍陈旧代码的安全排查强制自己把连接串、SQL 拼接、密码处理三个位置过一遍再决定怎么改。这套 JSP 酒店管理系统作为原始样本不算完美但正因为不完美才给了你足够的改造空间和讲解素材。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站