核心概念:Java + MySQL 网站是如何工作的?

一个典型的 Java Web 应用程序(网站)通常采用 B/S (Browser/Server) 架构:

java mysql 网站
(图片来源网络,侵删)
  1. 前端:用户通过浏览器访问你的网站,前端页面使用 HTML, CSS, JavaScript 技术构建,负责展示信息和接收用户输入。
  2. 后端:当用户进行操作(如点击登录按钮、提交表单)时,浏览器会向后端服务器发送一个请求。
  3. Java Web 服务器:后端的核心,它接收请求,并使用 Java 代码来处理业务逻辑(比如验证用户名密码是否正确)。
  4. 数据库:Java 代码需要存储或读取数据时,会通过 JDBC (Java Database Connectivity) 技术与 MySQL 数据库进行交互,JDBC 是 Java 连接数据库的“桥梁”或“标准”。
  5. 响应:处理完毕后,后端将结果(登录成功”或“用户列表”)打包成 HTML 或 JSON 格式,返回给浏览器,浏览器再将其渲染出来。

第一步:环境准备

在开始之前,你需要安装以下软件:

  1. JDK (Java Development Kit):Java 的开发工具包,提供编译和运行 Java 程序的环境,推荐使用 JDK 8, 11, 17 或 21 LTS 版本。
  2. IDE (Integrated Development Environment):集成开发环境,用于编写和管理代码,强烈推荐 IntelliJ IDEA (社区版免费) 或 Eclipse
  3. Web 服务器/应用服务器:用于运行 Java Web 应用程序。
    • 初学者:推荐使用 Tomcat,它轻量、易用,是学习和开发 Servlet/JSP 应用的首选。
    • 企业级:可以使用 JBoss/WildFlyWebLogic
  4. MySQL 数据库:你需要安装并运行一个 MySQL 服务器,可以从 MySQL 官网 下载社区版。
  5. 数据库管理工具:用于管理数据库和表,推荐 DBeaver (免费、功能强大) 或 Navicat

第二步:创建项目并搭建数据库

创建 Maven Web 项目

在 IntelliJ IDEA 中,创建一个新的项目,选择 Maven,并勾选 from archetype,然后选择 maven-archetype-webapp,这会为你创建一个标准的 Web 项目结构。

项目结构如下:

my-java-web-app/
├── src/
│   ├── main/
│   │   ├── java/          # 存放 Java 源代码
│   │   ├── resources/     # 存放配置文件 (如 jdbc.properties)
│   │   └── webapp/        # 存放 Web 资源 (HTML, JSP, CSS, JS)
│   │       ├── WEB-INF/
│   │       │   └── web.xml # Web 应用的部署描述符 (Servlet 3.0+ 可选)
│   │       └── index.jsp   # 默认首页
│   └── test/
└── pom.xml                # Maven 项目管理文件

配置 pom.xml 添加依赖

pom.xml 文件中,你需要添加以下依赖:

java mysql 网站
(图片来源网络,侵删)
  • Servlet API: 处理 Web 请求的核心。
  • JSP API: 用于创建动态页面。
  • JSTL (JSP Standard Tag Library): 简化 JSP 页面编写。
  • MySQL Connector/J: Java 连接 MySQL 数据库的驱动程序。
  • Lombok (可选): 简化 Java Bean (POJO) 的编写。
<dependencies>
    <!-- Servlet API -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- JSP API -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>
    <!-- JSTL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    <!-- MySQL Connector/J -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version> <!-- 使用最新稳定版 -->
    </dependency>
    <!-- Lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.30</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
<!-- 配置 Maven 插件,用于将项目打包成 WAR 文件 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.2</version>
        </plugin>
    </plugins>
</build>

创建数据库和表

在你的 MySQL 中创建一个数据库和一张用于存储用户信息的表。

-- 创建数据库
CREATE DATABASE my_web_app_db;
-- 使用数据库
USE my_web_app_db;
-- 创建用户表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入一条测试数据
INSERT INTO users (username, password, email) VALUES ('admin', '123456', 'admin@example.com');

第三步:编写后端代码 (Java + JDBC)

数据库连接工具类

创建一个工具类来管理数据库连接,避免每次操作都重复加载驱动和创建连接。

src/main/java/com/example/util/DBUtil.java

package com.example.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
    private static final String URL = "jdbc:mysql://localhost:3306/my_web_app_db?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root"; // 你的 MySQL 用户名
    private static final String PASSWORD = "your_password"; // 你的 MySQL 密码
    static {
        try {
            // 加载 MySQL 驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASSWORD);
    }
    public static void closeConnection(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

数据模型类

创建一个 User 类来映射数据库中的 users 表。

java mysql 网站
(图片来源网络,侵删)

src/main/java/com/example/model/User.java

package com.example.model;
import lombok.Data;
@Data // Lombok 注解,自动生成 getter, setter, toString 等
public class User {
    private int id;
    private String username;
    private String password;
    private String email;
}

数据访问对象

DAO 负责直接与数据库交互,执行增删改查操作。

src/main/java/com/example/dao/UserDAO.java

package com.example.dao;
import com.example.model.User;
import com.example.util.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class UserDAO {
    // 查询所有用户
    public List<User> getAllUsers() {
        List<User> users = new ArrayList<>();
        String sql = "SELECT id, username, password, email FROM users";
        try (Connection conn = DBUtil.getConnection();
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setEmail(rs.getString("email"));
                users.add(user);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return users;
    }
    // 根据用户名查找用户 (用于登录验证)
    public User findUserByUsername(String username) {
        String sql = "SELECT id, username, password, email FROM users WHERE username = ?";
        try (Connection conn = DBUtil.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            pstmt.setString(1, username);
            try (ResultSet rs = pstmt.executeQuery()) {
                if (rs.next()) {
                    User user = new User();
                    user.setId(rs.getInt("id"));
                    user.setUsername(rs.getString("username"));
                    user.setPassword(rs.getString("password"));
                    user.setEmail(rs.getString("email"));
                    return user;
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

注意:使用 PreparedStatement 可以有效防止 SQL 注入攻击,并且性能更好,特别是在有参数的情况下。


第四步:处理 Web 请求 (Servlet)

Servlet 是处理 HTTP 请求和生成响应的 Java 类。

创建用户列表 Servlet

这个 Servlet 用于获取所有用户,并将它们传递给 JSP 页面显示。

src/main/java/com/example/servlet/UserListServlet.java

package com.example.servlet;
import com.example.dao.UserDAO;
import com.example.model.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/users") // 映射 URL 为 /users
public class UserListServlet extends HttpServlet {
    private UserDAO userDAO = new UserDAO();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 调用 DAO 获取用户列表
        List<User> users = userDAO.getAllUsers();
        // 2. 将数据存入 request 作用域
        req.setAttribute("userList", users);
        // 3. 转发到 JSP 页面进行显示
        req.getRequestDispatcher("/WEB-INF/views/userList.jsp").forward(req, resp);
    }
}

req.setAttributereq.getRequestDispatcher().forward:这是在 Servlet 和 JSP 之间传递数据的经典方式。forward 是服务器端跳转,URL 不会改变。

创建登录 Servlet

src/main/java/com/example/servlet/LoginServlet.java

package com.example.servlet;
import com.example.dao.UserDAO;
import com.example.model.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private UserDAO userDAO = new UserDAO();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        User user = userDAO.findUserByUsername(username);
        if (user != null && user.getPassword().equals(password)) {
            // 登录成功
            HttpSession session = req.getSession();
            session.setAttribute("user", user); // 将用户信息存入 session
            resp.sendRedirect("users"); // 重定向到用户列表页面
        } else {
            // 登录失败
            req.setAttribute("error", "用户名或密码错误!");
            req.getRequestDispatcher("/login.jsp").forward(req, resp);
        }
    }
}

resp.sendRedirect:这是客户端跳转,浏览器会收到一个新的请求,URL 会改变,通常用于登录成功后跳转。


第五步:创建前端页面 (JSP)

修改首页 index.jsp

src/main/webapp/index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>首页</title>
</head>
<body>
    <h1>欢迎来到 Java + MySQL 网站</h1>
    <p><a href="login.jsp">点击登录</a></p>
</body>
</html>

创建登录页面 login.jsp

src/main/webapp/login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>登录</title>
</head>
<body>
    <h2>用户登录</h2>
    <%-- 显示错误信息 --%>
    <c:if test="${not empty error}">
        <p style="color: red;">${error}</p>
    </c:if>
    <form action="login" method="post">
        用户名: <input type="text" name="username" required><br><br>
        密码: <input type="password" name="password" required><br><br>
        <input type="submit" value="登录">
    </form>
</body>
</html>

创建用户列表页面 userList.jsp

src/main/webapp/WEB-INF/views/userList.jsp

注意WEB-INF 目录下的资源不能被浏览器直接访问,只能通过 forward 方式跳转过来,这提高了安全性。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>用户列表</title>
</head>
<body>
    <h2>用户列表</h2>
    <p>欢迎, ${user.username}! <a href="logout">退出登录</a></p>
    <hr>
    <table border="1" cellpadding="5">
        <tr>
            <th>ID</th>
            <th>用户名</th>
            <th>邮箱</th>
        </tr>
        <c:forEach var="user" items="${userList}">
            <tr>
                <td>${user.id}</td>
                <td>${user.username}</td>
                <td>${user.email}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

第六步:运行和部署

  1. 配置 Tomcat:在 IntelliJ IDEA 中,点击右上角的 Add Configuration,选择 Tomcat Server -> Local,然后配置你的 Tomcat 安装路径。
  2. 部署:在 Deployment 标签页中,点击 号,选择 Artifact,然后选择你的项目生成的 WAR 包。
  3. 启动:点击 OK 保存配置,然后点击绿色的 Run 按钮。
  4. 访问:Tomcat 启动后,在浏览器中访问 http://localhost:8080/ (端口号可能不同),你就能看到你的网站了。

进阶与现代化之路

上面的例子是经典的 Servlet + JSP + JDBC 架构,非常适合初学者理解 Web 应用的基本原理,但在实际生产中,通常会使用更现代、更高效的框架:

  1. 框架层

    • Spring Framework:Java 事实上的标准框架,提供了强大的依赖注入、AOP 等功能。
    • Spring Boot:基于 Spring 的进一步封装,它极大地简化了配置,实现了“约定优于配置”,让你能快速、独立地创建生产级别的 Spring 应用。这是目前 Java Web 开发的主流选择。
    • MyBatis / Hibernate:这些是 ORM (Object-Relational Mapping) 框架,它们用更高级的方式(如 XML 或注解)来定义 SQL,将数据库表和 Java 对象自动映射,让你几乎可以不用写 JDBC 代码,极大地提高了开发效率。
  2. 架构模式

    • MVC (Model-View-Controller):上面的例子其实已经体现了 MVC 思想,现代框架(如 Spring MVC)会更好地组织代码结构。
    • 前后端分离:后端不再返回 HTML,而是返回 JSON 数据(RESTful API),前端使用 Vue.js, React, Angular 等框架来构建,只负责页面的渲染和交互,后端则专注于业务逻辑和数据处理,这是目前大型网站的主流架构。

总结一下学习路径

  • 基础:掌握 Servlet/JSP/JDBC,理解 Web 应用原理。
  • 进阶:学习 Spring/Spring BootMyBatis,这是企业级开发的必备技能。
  • 高级:了解 RESTful API 设计前后端分离 架构。

希望这个全面的指南能帮助你顺利开启 Java + MySQL 网站开发之旅!