核心概念:Java + MySQL 网站是如何工作的?
一个典型的 Java Web 应用程序(网站)通常采用 B/S (Browser/Server) 架构:

- 前端:用户通过浏览器访问你的网站,前端页面使用 HTML, CSS, JavaScript 技术构建,负责展示信息和接收用户输入。
- 后端:当用户进行操作(如点击登录按钮、提交表单)时,浏览器会向后端服务器发送一个请求。
- Java Web 服务器:后端的核心,它接收请求,并使用 Java 代码来处理业务逻辑(比如验证用户名密码是否正确)。
- 数据库:Java 代码需要存储或读取数据时,会通过 JDBC (Java Database Connectivity) 技术与 MySQL 数据库进行交互,JDBC 是 Java 连接数据库的“桥梁”或“标准”。
- 响应:处理完毕后,后端将结果(登录成功”或“用户列表”)打包成 HTML 或 JSON 格式,返回给浏览器,浏览器再将其渲染出来。
第一步:环境准备
在开始之前,你需要安装以下软件:
- JDK (Java Development Kit):Java 的开发工具包,提供编译和运行 Java 程序的环境,推荐使用 JDK 8, 11, 17 或 21 LTS 版本。
- IDE (Integrated Development Environment):集成开发环境,用于编写和管理代码,强烈推荐 IntelliJ IDEA (社区版免费) 或 Eclipse。
- Web 服务器/应用服务器:用于运行 Java Web 应用程序。
- 初学者:推荐使用 Tomcat,它轻量、易用,是学习和开发 Servlet/JSP 应用的首选。
- 企业级:可以使用 JBoss/WildFly 或 WebLogic。
- MySQL 数据库:你需要安装并运行一个 MySQL 服务器,可以从 MySQL 官网 下载社区版。
- 数据库管理工具:用于管理数据库和表,推荐 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 文件中,你需要添加以下依赖:

- 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 表。

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.setAttribute和req.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>
第六步:运行和部署
- 配置 Tomcat:在 IntelliJ IDEA 中,点击右上角的
Add Configuration,选择Tomcat Server -> Local,然后配置你的 Tomcat 安装路径。 - 部署:在
Deployment标签页中,点击 号,选择Artifact,然后选择你的项目生成的 WAR 包。 - 启动:点击
OK保存配置,然后点击绿色的Run按钮。 - 访问:Tomcat 启动后,在浏览器中访问
http://localhost:8080/(端口号可能不同),你就能看到你的网站了。
进阶与现代化之路
上面的例子是经典的 Servlet + JSP + JDBC 架构,非常适合初学者理解 Web 应用的基本原理,但在实际生产中,通常会使用更现代、更高效的框架:
-
框架层:
- Spring Framework:Java 事实上的标准框架,提供了强大的依赖注入、AOP 等功能。
- Spring Boot:基于 Spring 的进一步封装,它极大地简化了配置,实现了“约定优于配置”,让你能快速、独立地创建生产级别的 Spring 应用。这是目前 Java Web 开发的主流选择。
- MyBatis / Hibernate:这些是 ORM (Object-Relational Mapping) 框架,它们用更高级的方式(如 XML 或注解)来定义 SQL,将数据库表和 Java 对象自动映射,让你几乎可以不用写 JDBC 代码,极大地提高了开发效率。
-
架构模式:
- MVC (Model-View-Controller):上面的例子其实已经体现了 MVC 思想,现代框架(如 Spring MVC)会更好地组织代码结构。
- 前后端分离:后端不再返回 HTML,而是返回 JSON 数据(RESTful API),前端使用 Vue.js, React, Angular 等框架来构建,只负责页面的渲染和交互,后端则专注于业务逻辑和数据处理,这是目前大型网站的主流架构。
总结一下学习路径:
- 基础:掌握 Servlet/JSP/JDBC,理解 Web 应用原理。
- 进阶:学习 Spring/Spring Boot 和 MyBatis,这是企业级开发的必备技能。
- 高级:了解 RESTful API 设计 和 前后端分离 架构。
希望这个全面的指南能帮助你顺利开启 Java + MySQL 网站开发之旅!
