构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)
第 1 部分:环境设置
- 安装 Java Development Kit (JDK):下载并安装 JDK。
- 设置 IDE:安装并配置 IDE(如 IntelliJ IDEA 或 Eclipse)。
- 安装数据库:下载并安装 MySQL 数据库。
- 配置数据库:创建数据库和用户,设置权限。
- 确保MySQL数据库服务正在运行。
- 使用数据库管理工具(如终端命令行或Navicat)测试连接。
第 2 部分:创建 Web 应用程序项目
- 创建新项目:在 IDE 中创建新的 Java Web 项目。
- 配置项目结构:设置
src/main/java
和src/main/webapp
目录。 - 添加依赖:如果使用 Maven 或 Gradle,添加 MySQL JDBC 驱动程序依赖。
第 3 部分:设计实体类
- 创建
Student
实体类:定义学生的属性和方法。
package ; // 定义了该类所属的包名 根据自己的项目进行补充
/**
* Student 类用于表示一个学生实体,包含学生的基本信息和相关操作。
*/
public class Student {
private int id; // 学生的ID,唯一标识一个学生
private int age; // 学生的年龄
private String name; // 学生的姓名
private String gender; // 学生的性别
private String password; // 学生的密码,用于系统登录
private String email; // 学生的电子邮件地址
private String hobbies; // 学生的兴趣爱好,以字符串形式存储
private String introduction; // 学生的自我介绍
// 无参构造函数,创建一个Student对象时不初始化任何属性
public Student() {}
// Getter 和 Setter 方法,用于获取和设置Student对象的属性
// ID相关的Getter和Setter
public int getId() {
return id; // 返回学生ID
}
public void setId(int id) {
this.id = id; // 设置学生ID
}
// 年龄相关的Getter和Setter
public int getAge() {
return age; // 返回年龄
}
public void setAge(int age) {
this.age = age; // 设置年龄
}
// 姓名相关的Getter和Setter
public String getName() {
return name; // 返回姓名
}
public void setName(String name) {
this.name = name; // 设置姓名
}
// 性别相关的Getter和Setter
public String getGender() {
return gender; // 返回性别
}
public void setGender(String gender) {
this.gender = gender; // 设置性别
}
// 密码相关的Getter和Setter
public String getPassword() {
return password; // 返回密码
}
public void setPassword(String password) {
this.password = password; // 设置密码
}
// 电子邮件相关的Getter和Setter
public String getEmail() {
return email; // 返回电子邮件地址
}
public void setEmail(String email) {
this.email = email; // 设置电子邮件地址
}
// 兴趣爱好相关的Getter和Setter
public String getHobbies() {
return hobbies; // 返回兴趣爱好
}
public void setHobbies(String hobbies) {
this.hobbies = hobbies; // 设置兴趣爱好
}
// 自我介绍相关的Getter和Setter
public String getIntroduction() {
return introduction; // 返回自我介绍
}
public void setIntroduction(String introduction) {
this.introduction = introduction; // 设置自我介绍
}
}
第 4 部分:数据库连接服务
- 创建
DBConnection
类:实现获取数据库连接的方法。
package ; // 指定该类所在的包名 根据自己的项目进行更改
import java.sql.Connection; // 导入Java SQL Connection接口
import java.sql.DriverManager; // 导入 DriverManager 类,用于加载数据库驱动
import java.sql.SQLException; // 导入 SQLException,用于捕获获数据库异常
/**
* DBConnection 类用于建立和管理与MySQL数据库的连接。
* 提供一个静态方法 getConnection() 用于获取数据库连接实例。
*/
public class DBConnection {
// 定义数据库驱动类名,用于Class.forName() 方法加载驱动
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
// 定义数据库连接URL,包括数据库地址、端口、数据库名以及连接参数
private static final String URL = "jdbc:mysql://localhost:3306/student?useSSL=false&serverTimezone=UTC";
// 定义数据库的用户名
private static final String USERNAME = "root";
// 定义数据库的密码
private static final String PASSWORD = "123456";
// 私有成员变量 conn 用于存储数据库连接对象
private Connection conn;
/**
* 获取数据库连接的方法。
* 首先尝试加载数据库驱动,然后使用 DriverManager 获取数据库连接。
* @return 返回一个 Connection 对象,表示与数据库的连接。
*/
public Connection getConnection() {
try {
// 加载并注册 MySQL JDBC 驱动
Class.forName(DRIVER);
// 通过 DriverManager 获取数据库连接
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
// 如果连接成功,打印确认信息
System.out.println("MySQL JDBC driver is loaded and connection is established.");
} catch (ClassNotFoundException e) {
// 如果找不到 JDBC 驱动类,打印错误信息并输出堆栈跟踪
System.out.println("MySQL JDBC driver is not found.");
e.printStackTrace();
} catch (SQLException e) {
// 如果数据库连接失败,输出堆栈跟踪
e.printStackTrace();
}
// 返回数据库连接对象
return conn;
}
}
- 创建
DatabaseService
类:封装数据库连接逻辑。
第 5 部分:数据访问对象 (DAO)
- 创建
StudentDAO
类:实现插入学生信息到数据库的方法。
package ; // 指定该类所在的包名 根据自己的项目进行更改
import java.sql.Connection; // 导入Java的数据库连接接口
import java.sql.PreparedStatement; // 导入PreparedStatement,用于预编译SQL语句
import java.sql.SQLException; // 导入SQLException,用于捕获数据库异常
import java.util.logging.Level; // 导入日志记录级别
import java.util.logging.Logger; // 导入Java的日志记录器
/**
* StudentDAO类用于处理与学生相关的数据库操作。
*/
public class StudentDAO {
// 获取Logger实例,用于记录日志
private static final Logger logger = Logger.getLogger(StudentDAO.class.getName());
// 数据库连接服务,用于获取数据库连接
private DBConnection dbService = new DBConnection();
/**
* 将学生信息插入数据库的方法。
* @param student 要插入的学生对象
* @return 操作结果,包含是否成功和消息
*/
public Result insertStudent(Student student) {
// 定义SQL插入语句
String sql = "INSERT INTO info (name, email, age, gender, password, hobbies, introduction) VALUES (?, ?, ?, ?, ?, ?, ?)";
try (Connection conn = dbService.getConnection(); // 获取数据库连接
PreparedStatement pstmt = conn.prepareStatement(sql)) { // 创建PreparedStatement对象
// 设置PreparedStatement参数
pstmt.setString(1, student.getName());
pstmt.setString(2, student.getEmail());
pstmt.setInt(3, student.getAge());
pstmt.setString(4, student.getGender());
pstmt.setString(5, student.getPassword());
pstmt.setString(6, student.getHobbies());
pstmt.setString(7, student.getIntroduction());
// 打印接收到的学生数据
logger.log(Level.INFO, "接收到的学生数据: 名字={0}, 邮箱={1}, 年龄={2}, 性别={3}, 爱好={4}, 简介={5}",
new Object[]{student.getName(), student.getEmail(), student.getAge(), student.getGender(),
student.getHobbies(), student.getIntroduction()});
int affectedRows = pstmt.executeUpdate(); // 执行SQL语句
if (affectedRows > 0) {
logger.log(Level.INFO, "数据插入成功,影响行数:{0}", affectedRows);
return new Result(true, "注册成功");
} else {
logger.log(Level.WARNING, "数据插入失败,没有行受到影响");
return new Result(false, "注册失败");
}
} catch (SQLException e) {
logger.log(Level.SEVERE, "数据库错误: " + e.getMessage(), e); // 记录数据库异常
return new Result(false, "数据库错误: " + e.getMessage());
}
}
}
- 异常处理:在 DAO 类中添加异常处理逻辑。
第 6 部分:Servlet 处理 HTTP 请求
- 创建
RegServlet
类:处理用户注册请求。
package ; // 定义了该Servlet类所属的包名 根据自己的项目进行补充
import jakarta.servlet.ServletException; // 导入Servlet异常处理类
import jakarta.servlet.annotation.WebServlet; // 用于定义Servlet的注解
import jakarta.servlet.http.HttpServlet; // 扩展HttpServlet以创建Servlet
import jakarta.servlet.http.HttpServletRequest; // 用于获取客户端请求
import jakarta.servlet.http.HttpServletResponse; // 用于发送响应客户端
import java.io.IOException; // 导入IOException类
// 使用@WebServlet注解将此Servlet映射到"/RegServlet"路径
@WebServlet("/RegServlet")
public class RegServlet extends HttpServlet {
private static final long serialVersionUID = 1L; // 用于序列化
// 处理POST请求的方法
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 从请求中获取表单数据
String name = request.getParameter("name");
String email = request.getParameter("email");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String ageStr = request.getParameter("age");
String[] hobbiesArray = request.getParameterValues("hobby"); // 获取兴趣爱好数组
String introduction = request.getParameter("introduction");
// 将兴趣爱好数组转换为逗号分隔的字符串
String hobbies = (hobbiesArray != null) ? String.join(", ", hobbiesArray) : "";
// 创建Student对象并设置属性
Student student = new Student();
student.setName(name);
student.setEmail(email);
student.setGender(gender);
student.setPassword(password);
student.setAge(Integer.parseInt(ageStr)); // 将年龄字符串转换为整数
student.setHobbies(hobbies);
student.setIntroduction(introduction);
// 创建StudentDAO对象处理数据库操作
StudentDAO studentDAO = new StudentDAO();
// 调用insertStudent方法尝试将学生信息插入数据库
Result result = studentDAO.insertStudent(student);
// 根据数据库操作结果重定向到相应页面
if (result.isSuccess()) {
response.sendRedirect("success.jsp"); // 成功则跳转到成功页面
} else {
response.sendRedirect("error.jsp"); // 失败则跳转到错误页面
}
}
// 处理GET请求的方法,可以选择显示注册表单或重定向到注册页面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("index.jsp"); // 默认重定向到注册页面
}
}
- 获取请求参数:从 HTTP 请求中获取用户输入。
- 调用 DAO 方法:使用获取的数据调用 DAO 类的方法。
- 重定向:根据操作结果重定向到成功或错误页面。
第 7 部分:创建 JSP 页面
- 创建
index.jsp
:用户注册表单页面。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>用户注册页面</title>
<style>
body {
/* 设置页面主体样式,使用Arial字体,居中显示,背景白色 */
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: return 0;
background-color: #fff;
}
.background-image {
/* 设置背景图片样式,固定在底部,覆盖背景 */
position: fixed;
bottom: 0;
left: 0;
width: 500px;
height: 320px;
background-image: url('bg.png');
background-size: cover;
z-index: -1;
}
.container {
/* 设置表单容器样式,半透明背景,圆角,阴影效果 */
width: 600px;
padding: 20px;
background-color: rgba(255, 255, 255, 0.9);
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
backdrop-filter: blur(10px);
display: flex;
flex-direction: column;
}
/* 其他样式类定义,如.form-group, .hobbies, .register-btn 等,用于设置表单元素的布局和外观 */
</style>
</head>
<body>
<div class="background-image"></div>
<div class="container">
<h2>用户注册</h2>
<form action="RegServlet" method="post">
<!-- 昵称输入框 -->
<div class="form-group">
<label for="name">昵称:</label>
<input type="text" id="name" name="name" required>
</div>
<!-- 邮箱输入框 -->
<div class="form-group">
<label for="email">注册邮箱:</label>
<input type="email" id="email" name="email" required>
</div>
<!-- 密码输入框 -->
<div class="form-group">
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
</div>
<!-- 性别单选按钮 -->
<div class="form-group">
<label>性别:</label>
<input type="radio" id="male" name="gender" value="male">
<label for="male">男</label>
<input type="radio" id="female" name="gender" value="female">
<label for="female">女</label>
</div>
<!-- 年龄输入框 -->
<div class="form-group">
<label for="age">年龄:</label>
<input type="number" id="age" name="age" required>
</div>
<!-- 兴趣爱好多选框 -->
<div class="form-group">
<label>兴趣爱好:</label>
<div class="hobbies">
<!-- 爱好1 -->
<input type="checkbox" id="hobby1" name="hobby" value="hobby1">
<label for="hobby1">爱好1</label>
<!-- 爱好2 -->
<input type="checkbox" id="hobby2" name="hobby" value="hobby2">
<label for="hobby2">爱好2</label>
<!-- 爱好3 -->
<input type="checkbox" id="hobby3" name="hobby" value="hobby3">
<label for="hobby3">爱好3</label>
</div>
<div class="hobbies">
<!-- 爱好4 -->
<input type="checkbox" id="hobby4" name="hobby" value="hobby4">
<label for="hobby4">爱好4</label>
<!-- 爱好5 -->
<input type="checkbox" id="hobby5" name="hobby" value="hobby5">
<label for="hobby5">爱好5</label>
<!-- 爱好6 -->
<input type="checkbox" id="hobby6" name="hobby" value="hobby6">
<label for="hobby6">爱好6</label>
</div>
</div>
<!-- 自我介绍文本域 -->
<div class="form-group">
<label for="introduction">自我介绍:</label>
<textarea id="introduction" name="introduction" maxlength="100" required></textarea>
</div>
<!-- 注册按钮 -->
<button type="submit" class="register-btn">立即注册</button>
</form>
</div>
</body>
</html>
- 创建
success.jsp
:注册成功页面。 - 创建
error.jsp
:注册失败页面。
第 8 部分:测试应用程序
- 部署应用程序:将应用程序部署到服务器(如 Tomcat)。
- 测试注册功能:填写表单并提交,检查是否正确重定向。
- 检查数据库:确认数据已正确插入数据库。
第 9 部分:调试和错误处理
- 查看日志:了解如何查看和解读日志文件。
- 常见问题解决:提供一些常见问题的解决方案。
第 10 部分:项目优化和扩展
- 使用连接池:介绍如何使用连接池来优化数据库连接。
- 添加更多功能:提供思路如何添加更多功能到应用程序。
结语
原文地址:https://blog.csdn.net/F2022697486/article/details/143984336
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!