Java实现MySQL用户登录注册系统
一、实验目的
掌握 JDBC 连接 MySQL 数据库的方法
实现用户注册与登录功能及完整跳转逻辑
学习 JSP 页面与 Java 后端的交互方式
二、实验环境
开发工具:Eclipse IDE for Java EE Developers
数据库:MySQL 8.0.43
JDK 版本:JDK 24.0.2
数据库驱动:mysql-connector-j-9.5.0.jar
服务器:Tomcat 9.0.109
三、项目结构

DBUtil.java // 数据库连接工具类
User.java // 用户实体类
RegisterServlet.java // 注册处理Servlet
LoginServlet.java // 登录处理Servlet
index.jsp // 首页(登录页)
register.jsp // 注册页面
success.jsp // 登录成功页面
error.jsp // 错误提示页面
mysql-connector-j-9.5.0.jar // 数据库驱动
四、实验步骤与代码实现
1. 数据库准备
启动MySQL服务:

在可视化工具Navicat Premium Lite 17中创建数据库和用户表并插入测试用例:
CREATE DATABASE userdb;
USE userdb;CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(50) NOT NULL,email VARCHAR(100)
);
INSERT INTO users (username, password, email)
VALUES
('test1', '123456', 'test1@example.com'),
('test2', 'abc123', 'test2@example.com'),
('test3', 'qwerty', 'test3@example.com');结果如下:

2. 数据库连接工具类(DBUtil.java)
package com.example;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBUtil {// 数据库连接信息Private static final String URL = "jdbc:mysql://localhost:3306/userdb?useSSL=false&serverTimezone=UTC";private static final String USER = "root";private static final String PASSWORD = "123456";// 获取数据库连接public static Connection getConnection() throws SQLException {try {// 加载驱动Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}return DriverManager.getConnection(URL, USER, PASSWORD);}}3. 用户实体类(User.java)
package com.example;public class User {private int id;private String username;private String password;private String email;// 构造方法public User() {}public User(String username, String password, String email) {this.username = username;this.password = password;this.email = email;}// getter和setter方法public int getId() { return id; }public void setId(int id) { this.id = id; }public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getPassword() { return password; }public void setPassword(String password) { this.password = password; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }}4. 登录处理 Servlet(LoginServlet.java)
package com.example;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import jakarta.servlet.http.HttpSession;@WebServlet("/login")public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取表单数据String username = request.getParameter("username");String password = request.getParameter("password");Connection conn = null;PreparedStatement pstmt = null;ResultSet rs = null;try {// 连接数据库conn = DBUtil.getConnection();// 查询用户String sql = "SELECT * FROM users WHERE username = ? AND password = ?";pstmt = conn.prepareStatement(sql);pstmt.setString(1, username);pstmt.setString(2, password);rs = pstmt.executeQuery();if (rs.next()) {// 登录成功,创建用户对象User user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setEmail(rs.getString("email"));// 将用户信息存入SessionHttpSession session = request.getSession();session.setAttribute("user", user);// 跳转到成功页面response.sendRedirect("success.jsp");} else {// 登录失败,跳转错误页面request.setAttribute("errorMsg", "用户名或密码错误");request.getRequestDispatcher("error.jsp").forward(request, response);}} catch (SQLException e) {e.printStackTrace();request.setAttribute("errorMsg", "数据库操作失败:" + e.getMessage());request.getRequestDispatcher("error.jsp").forward(request, response);} finally {// 关闭资源try {if (rs != null) rs.close();if (pstmt != null) pstmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}}}5. 注册处理 Servlet(RegisterServlet.java)
package com.example;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;@WebServlet("/register")public class RegisterServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置请求编码request.setCharacterEncoding("UTF-8");// 获取表单数据String username = request.getParameter("username");String password = request.getParameter("password");String email = request.getParameter("email");Connection conn = null;PreparedStatement pstmt = null;try {// 连接数据库conn = DBUtil.getConnection();// 检查用户名是否已存在String checkSql = "SELECT * FROM users WHERE username = ?";pstmt = conn.prepareStatement(checkSql);pstmt.setString(1, username);if (pstmt.executeQuery().next()) {request.setAttribute("errorMsg", "用户名已存在");request.getRequestDispatcher("register.jsp").forward(request, response);return;}// 插入新用户String insertSql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)";pstmt = conn.prepareStatement(insertSql);pstmt.setString(1, username);pstmt.setString(2, password);pstmt.setString(3, email);int rows = pstmt.executeUpdate();if (rows > 0) {// 注册成功,跳转到登录页并提示request.setAttribute("msg", "注册成功,请登录");request.getRequestDispatcher("index.jsp").forward(request, response);} else {request.setAttribute("errorMsg", "注册失败,请重试");request.getRequestDispatcher("register.jsp").forward(request, response);}} catch (SQLException e) {e.printStackTrace();request.setAttribute("errorMsg", "数据库操作失败:" + e.getMessage());request.getRequestDispatcher("register.jsp").forward(request, response);} finally {// 关闭资源try {if (pstmt != null) pstmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}}}}6. 登录页面(index.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><%-- 显示注册成功提示 --%><% if (request.getAttribute("msg") != null) { %><p style="color: green;"><%= request.getAttribute("msg") %></p><% } %><form action="login" method="post"><div><label>用户名:</label><input type="text" name="username" required></div><br><div><label>密码:</label><input type="password" name="password" required></div><br><div><input type="submit" value="登录"></div></form><p>还没有账号?<a href="register.jsp">立即注册</a></p></body></html>7. 注册页面(register.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><%-- 显示错误信息 --%><% if (request.getAttribute("errorMsg") != null) { %><p style="color: red;"><%= request.getAttribute("errorMsg") %></p><% } %><form action="register" method="post"><div><label>用户名:</label><input type="text" name="username" required></div><br><div><label>密码:</label><input type="password" name="password" required></div><br><div><label>邮箱:</label><input type="email" name="email"></div><br><div><input type="submit" value="注册"></div></form><p>已有账号?<a href="index.jsp">返回登录</a></p></body></html>8. 登录成功页面(success.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" import="com.example.User"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>登录成功</title></head><body><%// 从Session获取用户信息User user = (User) session.getAttribute("user");if (user == null) {// 如果未登录,重定向到登录页response.sendRedirect("index.jsp");return;}%><h2>登录成功!</h2><p>欢迎您,<%= user.getUsername() %>!</p><p>您的用户ID:<%= user.getId() %></p><p>您的邮箱:<%= user.getEmail() != null ? user.getEmail() : "未设置" %></p><p><a href="index.jsp?action=logout">退出登录</a></p></body></html>9. 错误提示页面(error.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><p style="color: red;"><%= request.getAttribute("errorMsg") != null ? request.getAttribute("errorMsg") : "未知错误" %></p><p><a href="javascript:history.back()">返回上一页</a></p><p><a href="index.jsp">返回登录页</a></p></body></html>五、系统功能说明及其验证
注册流程:
访问 register.jsp 填写注册信息

测试用例:
用户名:test01
密码:123
邮箱:aaa@test.com
提交到 RegisterServlet 处理
验证用户名是否存在,不存在则创建新用户
注册成功后跳转至登录页,失败则返回注册页提示错误
用户test01尚未注册过,所以注册成功后跳转到登录页.


如图:数据库中已保存测试用例test01的信息
登录流程:
访问 index.jsp 填写登录信息
提交到 LoginServlet 处理
验证用户名和密码,正确则将用户信息存入 Session
登录成功跳转至 success.jsp,失败则显示错误信息

如图:test01用例登录成功

如图:若输错密码,则登录失败.
六、实验总结
成功实现了基于 JDBC 的用户登录注册功能,掌握了数据库连接与操作方法
理解了 Servlet 与 JSP 的交互方式,学会了使用请求转发和重定向
完成了登录与注册之间的完整跳转逻辑,增强了用户体验
