构建 Java Web 应用程序:从 Servlet 到数据库交互(Eclipse使用JDBC连接Mysql数据库)

第 1 部分:环境设置
  1. 安装 Java Development Kit (JDK):下载并安装 JDK。
  2. 设置 IDE:安装并配置 IDE(如 IntelliJ IDEA 或 Eclipse)。
  3. 安装数据库:下载并安装 MySQL 数据库。
  4. 配置数据库:创建数据库和用户,设置权限。
  5. 确保MySQL数据库服务正在运行。
  6. 使用数据库管理工具(如终端命令行或Navicat)测试连接。
第 2 部分:创建 Web 应用程序项目
  1. 创建新项目:在 IDE 中创建新的 Java Web 项目。
  2. 配置项目结构 :设置src/main/javasrc/main/webapp目录。
  3. 添加依赖:如果使用 Maven 或 Gradle,添加 MySQL JDBC 驱动程序依赖。
第 3 部分:设计实体类
  1. 创建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 部分:数据库连接服务
  1. 创建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;

        }

        }

  2. 创建DatabaseService:封装数据库连接逻辑。

第 5 部分:数据访问对象 (DAO)
  1. 创建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());

        }

        }

        }

  2. 异常处理:在 DAO 类中添加异常处理逻辑。

第 6 部分:Servlet 处理 HTTP 请求
  1. 创建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"); // 默认重定向到注册页面
    }
    

    }

  2. 获取请求参数:从 HTTP 请求中获取用户输入。

  3. 调用 DAO 方法:使用获取的数据调用 DAO 类的方法。

  4. 重定向:根据操作结果重定向到成功或错误页面。

2.创建ResultServlet:处理请求结果。

package ;
public class Result {
    private boolean success;
    private String message;

    public Result(boolean success, String message) {
        this.success = success;
        this.message = message;
    }

    public boolean isSuccess() {
        return success;
    }

    public String getMessage() {
        return message;
    }
}
第 7 部分:创建 JSP 页面
  1. 创建index.jsp:用户注册表单页面。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    用户注册页面

    用户注册

    昵称:
    注册邮箱:
    密码:
    性别: 男 女
    年龄:
    兴趣爱好:
    爱好1 爱好2 爱好3
    爱好4 爱好5 爱好6
    自我介绍: 立即注册

  2. 创建success.jsp:注册成功页面。

  3. 创建error.jsp:注册失败页面。

第 8 部分:测试应用程序
  1. 部署应用程序:将应用程序部署到服务器(如 Tomcat)。
  2. 测试注册功能:填写表单并提交,检查是否正确重定向。
  3. 检查数据库:确认数据已正确插入数据库。
第 9 部分:调试和错误处理
  1. 查看日志:了解如何查看和解读日志文件。
  2. 常见问题解决:提供一些常见问题的解决方案。
第 10 部分:项目优化和扩展
  1. 使用连接池:介绍如何使用连接池来优化数据库连接。
  2. 添加更多功能:提供思路如何添加更多功能到应用程序。
结语

一个迷茫的大学生

相关推荐
mannymu几秒前
前端AI入门之路(一)
前端
啾啾Fun几秒前
[微服务设计]2_演化式架构
java·微服务·架构
日升_rs2 分钟前
Chrome 134 版本新特性
前端·chrome·浏览器
前端卧龙人3 分钟前
前端如何最小化重绘和回流
前端
南蓝4 分钟前
【React】React 19 新特性
前端
银之夏雪5 分钟前
深入理解 GPU 渲染加速与合成层(Composite Layers)
前端·javascript·浏览器
机巧咸鱼不会受伤6 分钟前
为什么浏览器的渲染进程不适用于多个线程来处理
前端·浏览器
前端日常开发6 分钟前
轻松合并远端两个Commit,代码历史秒变整洁!
前端
Au_ust6 分钟前
React:类组件(上)
前端·javascript·react.js
神秘的t6 分钟前
javaEE初阶————多线程进阶(2)
java·开发语言