构建 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. 添加更多功能:提供思路如何添加更多功能到应用程序。
结语

一个迷茫的大学生

相关推荐
轻口味3 分钟前
【每日学点鸿蒙知识】无障碍、getLastLocation、蓝牙问题、卡片大小、关系型数据库等
数据库·华为·harmonyos
平行线也会相交6 分钟前
云图库平台(四)——前端用户模块开发
前端·vue·云图库平台
rock——you8 分钟前
quasar v2 setup语法中报错: undefined is not an object (evaluating ‘this.$q.notify‘)
前端·javascript·vue.js·quasar
张敬之、26 分钟前
Ribbon源码分析
java·开发语言
骑着王八撵玉兔1 小时前
【持续集成与持续部署(CI/CD)工具 - Jenkins】详解
java·spring boot·后端·spring·servlet·ci/cd·jenkins
我要学编程(ಥ_ಥ)1 小时前
初始JavaEE篇 —— Maven相关配置
java·java-ee·maven
ss2731 小时前
SSM 进销存系统
java·后端
朱小勇本勇1 小时前
Python-Pdf转Markdown
前端·python·pdf
会功夫的李白1 小时前
讲一个自己写的 excel 转 html 的 java 工具
java·html·excel
信徒_2 小时前
Java 内存模型(Java Memory Model, JMM)
java·开发语言·junit