✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:前端案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:JavaWeb酒店管理系统(详细版)
文章目录
- 一、环境版本
- 1、数据库设计(MySQL 5.7):
- 2、后端开发(Java):
- 3、前端开发:
- 4、集成开发工具(Eclipse IDE for Java EE Developers):
- 二、数据库设计
- 1、新建数据库
- 2、建表
- 3、初始化数据
- 4、创建日志记录表
- 5、创建触发器
- 6、添加索引
- 7、存储过程
- 三、Web应用开发
- 1、创建JavaWeb项目
- 2、BaseDao单例模式
- 3、登录功能
- 3.1 登录页面
- 3.2 登录逻辑(使用Servlet处理登录请求)
- 4、展示信息
- 4.1 列表界面(使用JSP展示酒店列表)
- 4.2 列表逻辑(使用Servlet处理登录请求)
- 5、添加功能
- 5.1 添加页面(使用JSP编写)
- 5.2 添加逻辑(使用Servlet处理添加请求)
- 6、修改功能
- 6.1 修改页面(使用JSP编写)
- 6.2 修改逻辑(使用Servlet处理修改请求)
- 7、注释
- 四、示例输入和输出
一、环境版本
1、数据库设计(MySQL 5.7):
- 数据库包括三个表:HotelBrand(酒店品牌表)、HotelStar(酒店星级表)和Hotel(酒店表)。
- HotelBrand表存储酒店品牌信息,HotelStar表存储酒店星级信息,Hotel表存储具体酒店的信息。
- Hotel表中的BrandID和StarID分别作为外键,关联到HotelBrand表和HotelStar表中的对应主键。
2、后端开发(Java):
- 在后端开发中,您需要编写Java类来处理数据库操作,包括连接数据库、查询数据、插入数据等。
- 您可以使用JDBC来连接MySQL数据库,并编写SQL语句来执行数据库操作,如插入新酒店信息、查询特定品牌的酒店等。
3、前端开发:
- 在前端开发中,您可以根据数据库中的数据表结构设计合适的界面,展示酒店品牌、星级和具体酒店信息。
- 可以使用HTML、CSS和JavaScript来构建前端界面,通过后端提供的数据接口来动态展示数据。
4、集成开发工具(Eclipse IDE for Java EE Developers):
- 使用Eclipse IDE来编写和调试Java代码,同时集成Tomcat 9作为Web服务器来运行和测试您的Web应用程序。
- 您可以在Eclipse中创建Java Servlet来处理HTTP请求,并将数据库操作集成到Servlet中,实现与数据库的交互。
二、数据库设计
1、新建数据库
CREATE DATABASE HotelManagement;
2、建表
在数据库设计中,满足三大范式是非常重要的,可以确保数据库结构的合理性和数据的一致性。同时,使用约束可以帮助确保数据的完整性和准确性。下面我将详细阐述如何设计表满足三大范式,并使用主键约束和外键约束:
- 第一范式(1NF):
- 确保每个列都是原子的,不可再分。在建表时,确保每个字段都是不可再分的最小数据单元,不包含重复的数据。
- 例如,在酒店表(Hotel)中,每个字段应该是原子的,如Name字段只存储酒店名称,Price字段只存储价格。
- 第二范式(2NF):
- 确保表中的非主键列完全依赖于主键,而不是部分依赖。如果有部分依赖的情况,需要将其拆分成单独的表。
- 在建表时,将数据分解成多个表,确保每个表中的非主键列都完全依赖于主键。
- 例如,在酒店表(Hotel)中,BrandID和StarID应该完全依赖于HotelID,如果存在部分依赖的情况,需要进行拆分。
- 第三范式(3NF):
- 确保表中的非主键列之间没有传递依赖关系,即不存在传递依赖。如果存在传递依赖,需要进一步拆分表。
- 在建表时,确保每个非主键列都直接依赖于主键,而不是依赖于其他非主键列。
- 例如,在酒店表(Hotel)中,如果存在非主键列之间的传递依赖,需要将其拆分成独立的表以消除这种依赖关系。
- 约束使用:
- 主键约束:在每个表中定义一个主键,用于唯一标识每条记录。主键可以确保表中的每条记录都具有唯一性。
- 外键约束:在表之间建立关联时,使用外键约束来确保参照完整性。外键约束可以确保在一个表中的外键值必须在另一个表的主键中存在。
- 在您的数据库设计中,可以使用主键约束来定义主键字段(如HotelID、BrandID、StarID),并使用外键约束来建立表之间的关联关系(如Hotel表中的BrandID和StarID与HotelBrand表和HotelStar表中的对应主键关联)。
通过满足三大范式和使用主键约束、外键约束,您可以设计出结构合理、数据完整的数据库表,确保数据的一致性和准确性。
酒店表(Hotel)
CREATE TABLE HotelBrand (
BrandID INT PRIMARY KEY AUTO_INCREMENT,
BrandName VARCHAR(255) NOT NULL
);
酒店星级表(HotelStar)
CREATE TABLE HotelStar (
StarID INT PRIMARY KEY,
StarLevel INT NOT NULL
);
酒店品牌表(HotelBrand)
CREATE TABLE Hotel (
HotelID INT PRIMARY KEY AUTO_INCREMENT,
BrandID INT,
StarID INT,
Name VARCHAR(255) NOT NULL,
Price DECIMAL(10, 2),
FOREIGN KEY (BrandID) REFERENCES HotelBrand(BrandID),
FOREIGN KEY (StarID) REFERENCES HotelStar(StarID)
);
3、初始化数据
批量插入酒店数据
INSERT INTO Hotel (BrandID, StarID, Name, Price) VALUES
(1, 5, '五星级酒店A', 1200.00),
(2, 4, '四星级酒店B', 800.00),
(1, 5, '五星级酒店C', 1500.00),
(3, 3, '三星级酒店D', 500.00),
(2, 4, '四星级酒店E', 750.00);
4、创建日志记录表
CREATE TABLE OperationLog (
LogID INT PRIMARY KEY AUTO_INCREMENT,
UserID INT,
OperationType VARCHAR(50),
OperationTime TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (UserID) REFERENCES Hotel (HotelID)
);
5、创建触发器
DELIMITER //
CREATE TRIGGER AfterHotelUpdate
AFTER UPDATE ON Hotel
FOR EACH ROW
BEGIN
INSERT INTO OperationLog (UserID, OperationType)
VALUES (NEW.HotelID, CONCAT('Updated: ', NEW.Name));
END;
//
DELIMITER ;
6、添加索引
CREATE INDEX idx_hotel_name ON Hotel (Name) USING BTREE;
7、存储过程
DELIMITER //
CREATE PROCEDURE AddHotel(IN brandID INT, IN starID INT, IN name VARCHAR(255), IN price DECIMAL(10, 2))
BEGIN
INSERT INTO Hotel (BrandID, StarID, Name, Price) VALUES (brandID, starID, name, price);
END;
//
DELIMITER ;
三、Web应用开发
1、创建JavaWeb项目
在创建JavaWeb项目并导入相关JAR包时,您需要遵循一系列步骤来确保项目的顺利开发和运行。下面我将详细阐述如何创建JavaWeb项目并导入常用的JAR包(如Servlet、JDBC、JSTL等):
- 创建JavaWeb项目:
- 打开Eclipse IDE,选择“File” -> “New” -> “Dynamic Web Project”来创建一个新的JavaWeb项目。
- 输入项目名称和选择合适的目标运行时环境(如Apache Tomcat 9),然后点击“Finish”来创建项目。
- 导入相关JAR包:
- Servlet JAR包:Servlet是用于处理HTTP请求和生成动态内容的Java类。您可以在Apache官网下载Servlet API的JAR包(如servlet-api.jar)。
- 将下载的Servlet JAR包复制到项目的WebContent/WEB-INF/lib目录下。
- JDBC JAR包:JDBC用于连接数据库并执行SQL操作。您可以在MySQL官网下载MySQL Connector/J的JAR包。
- 将下载的JDBC JAR包也复制到项目的WebContent/WEB-INF/lib目录下。
- JSTL JAR包:JSTL(JavaServer Pages Standard Tag Library)是用于在JSP页面中编写更简洁的代码的标签库。您可以在Apache标准标签库的官网下载JSTL的JAR包。
- 同样,将下载的JSTL JAR包复制到项目的WebContent/WEB-INF/lib目录下。
- 配置项目构建路径:
- 在Eclipse中右键单击项目,选择“Properties” -> “Java Build Path” -> “Libraries”选项卡。
- 点击“Add JARs”按钮,选择刚刚导入的JAR包,以将它们添加到项目的构建路径中。
- 编写代码:
- 开发Servlet类来处理HTTP请求和与数据库交互。
- 编写JSP页面来生成动态内容并展示数据。
- 部署和运行项目:
- 将项目部署到Tomcat服务器上,启动Tomcat服务器并访问项目的URL来查看Web应用程序运行情况。
2、BaseDao单例模式
public class BaseDao {
private static BaseDao instance;
private Connection conn;
private BaseDao() {
// 初始化数据库连接
}
public static synchronized BaseDao getInstance() {
if (instance == null) {
instance = new BaseDao();
}
return instance;
}
public Connection getConnection() {
return conn;
}
}
3、登录功能
3.1 登录页面
<!DOCTYPE html>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<h2>用户登录</h2>
<%-- 显示错误信息 --%>
<c:if test="${not empty error}">
<p style="color: red;">${error}</p>
</c:if>
<form action="login" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required><br><br>
<input type="submit" value="登录">
</form>
</body>
</html>
在上面的代码中,我添加了一个用于显示错误信息的部分,并使用JSTL标签库来实现。具体优化包括:
- <c:if> 标签用于判断是否存在错误信息,如果存在则显示红色的错误提示。
- ${error} 用于显示具体的错误信息,这个信息是在Servlet中设置的。
- 表单的 action 属性指向了Servlet的URL,确保提交表单时数据发送到正确的地方。
3.2 登录逻辑(使用Servlet处理登录请求)
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证用户名和密码
if (validateUser(username, password)) {
request.getSession().setAttribute("username", username);
response.sendRedirect("hotelList.jsp");
} else {
request.setAttribute("error", "用户名不存在/密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
private boolean validateUser(String username, String password) {
// 这里添加验证逻辑
return true;
}
}
4、展示信息
4.1 列表界面(使用JSP展示酒店列表)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>酒店列表</title>
</head>
<body>
<h2>酒店列表</h2>
<table border="1">
<tr>
<th>酒店名称</th>
<th>价格</th>
<th>星级</th>
</tr>
<c:forEach var="hotel" items="${hotels}">
<tr>
<td>${hotel.name}</td>
<td>${hotel.price}</td>
<td>${hotel.starLevel}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
在上面的代码中:
- 使用
<c:forEach> 标签
遍历名为 hotels 的列表,该列表包含要展示的酒店信息。 ${hotel.name}、${hotel.price} 和 ${hotel.starLevel}
分别显示每个酒店的名称、价格和星级。- 通过在
Servlet中将酒店信息存储在 hotels 属性
中,并将其传递到该JSP页面,以便在页面上动态展示酒店列表信息。
4.2 列表逻辑(使用Servlet处理登录请求)
@WebServlet("/hotelList")
public class HotelListServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 模拟从数据库中获取酒店列表数据
List<Hotel> hotels = getHotelListFromDatabase();
// 将酒店列表数据存储在request属性中
request.setAttribute("hotels", hotels);
// 转发到展示酒店列表的JSP页面
RequestDispatcher dispatcher = request.getRequestDispatcher("hotelList.jsp");
dispatcher.forward(request, response);
}
private List<Hotel> getHotelListFromDatabase() {
// 模拟从数据库中获取酒店列表数据的逻辑
List<Hotel> hotels = new ArrayList<>();
hotels.add(new Hotel("Hotel A", 100, "5-star"));
hotels.add(new Hotel("Hotel B", 80, "4-star"));
hotels.add(new Hotel("Hotel C", 120, "5-star"));
return hotels;
}
}
5、添加功能
5.1 添加页面(使用JSP编写)
<!DOCTYPE html>
<html>
<head>
<title>添加酒店信息</title>
</head>
<body>
<h2>添加酒店信息</h2>
<form action="addHotel" method="post">
<label for="name">酒店名称:</label>
<input type="text" id="name" name="name" required><br><br>
<label for="price">价格:</label>
<input type="text" id="price" name="price" required><br><br>
<label for="starLevel">星级:</label>
<input type="text" id="starLevel" name="starLevel" required><br><br>
<input type="submit" value="添加">
</form>
</body>
</html>
5.2 添加逻辑(使用Servlet处理添加请求)
@WebServlet("/addHotel")
public class AddHotelServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
int price = Integer.parseInt(request.getParameter("price"));
String starLevel = request.getParameter("starLevel");
// 在实际应用中,这里可以将酒店信息保存到数据库中
// 重定向到酒店列表页面
response.sendRedirect("hotelList");
}
}
在上面的代码中:
- addHotel.jsp 页面包含一个表单,用户可以输入酒店名称、价格和星级信息。
- AddHotelServlet Servlet 接收表单提交的数据,将酒店信息保存到数据库(在实际应用中),然后重定向到展示酒店列表的页面。
6、修改功能
6.1 修改页面(使用JSP编写)
<!DOCTYPE html>
<html>
<head>
<title>修改酒店信息</title>
</head>
<body>
<h2>修改酒店信息</h2>
<form action="editHotel" method="post">
<label for="name">酒店名称:</label>
<input type="text" id="name" name="name" value="${hotel.name}" required><br><br>
<label for="price">价格:</label>
<input type="text" id="price" name="price" value="${hotel.price}" required><br><br>
<label for="starLevel">星级:</label>
<input type="text" id="starLevel" name="starLevel" value="${hotel.starLevel}" required><br><br>
<input type="hidden" name="hotelId" value="${hotel.id}">
<input type="submit" value="修改">
</form>
</body>
</html>
6.2 修改逻辑(使用Servlet处理修改请求)
@WebServlet("/editHotel")
public class EditHotelServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int hotelId = Integer.parseInt(request.getParameter("hotelId"));
String name = request.getParameter("name");
int price = Integer.parseInt(request.getParameter("price"));
String starLevel = request.getParameter("starLevel");
// 在实际应用中,根据hotelId更新数据库中对应的酒店信息
// 重定向到酒店列表页面
response.sendRedirect("hotelList");
}
}
在上面的代码中:
- editHotel.jsp 页面包含一个表单,显示当前酒店信息并允许用户修改。
- EditHotelServlet Servlet 接收表单提交的数据,根据酒店ID更新数据库中对应的酒店信息,然后重定向到展示酒店列表的页面。
7、注释
在类和方法以及重要代码中添加注释。
当为Java类和方法添加注释时,通常遵循以下几个原则:
- 在类的顶部添加类级注释,描述类的作用、功能和重要信息。
- 在方法的前面添加方法级注释,描述方法的作用、参数、返回值和可能的异常。
- 在重要的代码块或逻辑部分添加行级注释,解释代码的目的和实现细节。
以下是一个示例,展示如何为类和方法添加注释:
@WebServlet("/editHotel")
public class EditHotelServlet extends HttpServlet {
/**
* 处理POST请求,用于修改酒店信息
* @param request HTTP请求对象
* @param response HTTP响应对象
* @throws ServletException Servlet异常
* @throws IOException IO异常
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取表单提交的数据
int hotelId = Integer.parseInt(request.getParameter("hotelId"));
String name = request.getParameter("name");
int price = Integer.parseInt(request.getParameter("price"));
String starLevel = request.getParameter("starLevel");
// 在实际应用中,根据hotelId更新数据库中对应的酒店信息
// 重定向到酒店列表页面
response.sendRedirect("hotelList");
}
}
在上面的代码中,我们为 EditHotelServlet 类添加了类级注释,描述了类的作用。同时,在 doPost() 方法前添加了方法级注释,描述了方法的作用和参数。在代码中也添加了行级注释,解释了关键代码块的作用。
四、示例输入和输出
示例输入:
- 用户名:example_user
- 密码:example_password
示例输出:
- 如果输入的用户名和密码与系统中的匹配:
- 登录成功,跳转到酒店列表页面。
- 如果输入的用户名或密码不匹配:
- 登录失败,显示错误信息,例如:“用户名不存在/密码错误”。
码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识,点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。