JavaEE 初阶的核心组件围绕「Web 请求处理、数据交互、请求过滤、状态管理」四大核心场景,以下是每个组件的落地式讲解,所有示例均为可直接运行的入门级代码。
一、Servlet:Web 请求处理的核心(核心中的核心)
1. 组件定位
Servlet 是运行在服务器(如 Tomcat)上的 Java 类,是浏览器与服务器交互的核心桥梁,负责接收前端请求、处理业务逻辑、返回响应结果。
2. 核心作用
- 接收 HTTP 请求参数(如登录的用户名 / 密码);
- 调用业务逻辑(如验证用户信息);
- 生成动态响应(如返回登录成功 / 失败的结果);
- 控制页面跳转(请求转发 / 重定向)。
3. 核心特性
- 生命周期 :由 Tomcat 管理,分为 3 个阶段:
init():Servlet 被创建时执行(默认第一次请求时创建),仅执行一次;service():每次请求都会执行,处理核心逻辑;destroy():Servlet 被销毁时执行(如 Tomcat 关闭),仅执行一次。
4. 入门示例(注解版,主流方式)
java
运行
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
// 配置Servlet的访问路径:http://localhost:8080/hello
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
// 处理GET请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 设置响应编码,避免中文乱码
resp.setContentType("text/html;charset=UTF-8");
// 获取请求参数
String name = req.getParameter("name");
// 生成响应
PrintWriter writer = resp.getWriter();
writer.write("<h1>欢迎你," + (name == null ? "游客" : name) + "!</h1>");
}
// 处理POST请求(如需处理POST,重写doPost即可)
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
doGet(req, resp); // 复用GET逻辑
}
}
5. 常用场景
- 登录 / 注册接口、数据查询接口;
- 处理文件上传 / 下载(初阶可先掌握基础参数处理)。
二、Filter:请求过滤 / 拦截(统一功能处理)
1. 组件定位
Filter(过滤器)是请求到达 Servlet 前的 "拦截器",可对请求 / 响应做统一处理,不直接处理业务逻辑,专注 "通用功能"。
2. 核心作用
- 统一字符编码(解决中文乱码);
- 登录校验(未登录用户拦截,跳转到登录页);
- 日志记录(记录所有请求的 URL、时间);
- 权限控制(限制某些接口的访问)。
3. 核心方法
doFilter():核心方法,实现过滤逻辑,需调用chain.doFilter(req, resp)让请求继续向下传递(否则请求会被拦截)。
4. 入门示例(登录校验 + 编码过滤)
java
运行
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
// 过滤所有请求:/*
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
// 1. 统一编码
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
// 2. 登录校验(排除登录页,避免死循环)
String url = req.getRequestURI();
if (!url.contains("/login") && req.getSession().getAttribute("user") == null) {
// 未登录,跳转到登录页
resp.sendRedirect("/login.html");
return;
}
// 3. 放行请求(继续到Servlet/下一个Filter)
chain.doFilter(req, resp);
}
}
5. 常用场景
- 全局编码处理、登录拦截、接口访问日志;
- 敏感词过滤(如替换请求中的违规字符)。
三、Listener:监听器(监听容器 / 对象状态)
1. 组件定位
Listener(监听器)用于监听 Web 容器或对象的状态变化,当触发指定事件时自动执行逻辑,初阶重点掌握 2 个核心监听器。
2. 核心类型(初阶必学)
| 监听器类型 | 核心作用 | 适用场景 |
|---|---|---|
| ServletContextListener | 监听 Web 应用的启动 / 销毁 | 应用启动时加载配置文件、初始化数据库连接池 |
| HttpSessionListener | 监听 Session 的创建 / 销毁 | 统计在线用户数、记录用户登录时长 |
3. 入门示例(应用启动初始化)
java
运行
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
@WebListener
public class InitListener implements ServletContextListener {
// 应用启动时执行
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("Web应用启动了!");
// 初始化操作:加载配置、创建连接池等
sce.getServletContext().setAttribute("appName", "JavaEE初阶项目");
}
// 应用销毁时执行
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("Web应用销毁了!");
// 释放资源:关闭连接池、保存日志等
}
}
4. 常用场景
- 应用启动初始化资源、关闭时释放资源;
- 统计在线用户数、监控 Session 状态。
四、JSP:动态页面(初阶可选,了解即可)
1. 组件定位
JSP(Java Server Pages)是 "嵌入 Java 代码的 HTML 页面",本质是 Servlet(Tomcat 会把 JSP 编译成 Servlet),用于快速生成动态页面。
2. 核心作用
- 结合 Java 代码和 HTML,生成动态页面(如用户列表页);
- 替代 "用 Servlet 拼接 HTML 字符串" 的繁琐操作。
3. 核心语法(初阶重点)
<%= 变量/表达式 %>:输出内容到页面;<% Java代码 %>:执行 Java 逻辑;${变量}:EL 表达式(简化取值,替代 Java 代码)。
4. 入门示例(用户信息展示)
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户信息</title>
</head>
<body>
<h1>用户信息页</h1>
<%-- EL表达式取值(从请求/会话中获取) --%>
<p>用户名:${userName}</p>
<p>年龄:${age}</p>
<%-- Java代码块(初阶了解即可,现在主流前后端分离,少用) --%>
<%
String msg = "欢迎访问";
out.print("<p>" + msg + "</p>");
%>
</body>
</html>
5. 注意事项
现在主流是 "前后端分离",JSP 已很少使用,初阶只需了解基本语法,重点还是 Servlet+SpringMVC。
五、Cookie & Session:状态管理(用户身份保持)
1. 组件定位
HTTP 协议是 "无状态" 的,Cookie(客户端存储)和 Session(服务器存储)是解决 "用户状态保持" 的核心(如登录后记住用户)。
2. 核心区别
| 特性 | Cookie | Session |
|---|---|---|
| 存储位置 | 客户端浏览器 | 服务器内存 / 数据库 |
| 安全性 | 低(可被篡改) | 高(仅存服务器) |
| 存储大小 | 有限(约 4KB) | 无限制(受服务器内存影响) |
| 有效期 | 可设置长期(如 7 天) | 默认 30 分钟(可配置) |
3. 入门示例(登录后保存用户状态)
java
运行
// 1. 登录Servlet中设置Session
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
// 模拟登录校验
if ("admin".equals(username) && "123456".equals(password)) {
// 保存用户信息到Session(服务器端)
req.getSession().setAttribute("user", username);
// 设置Cookie(可选,记住用户名)
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(7 * 24 * 60 * 60); // 有效期7天
resp.addCookie(cookie);
resp.sendRedirect("/index.jsp"); // 跳转到首页
} else {
resp.sendRedirect("/login.html?error=1"); // 登录失败,返回登录页
}
}
}
4. 常用场景
- 登录状态保持、记住用户名;
- 购物车数据临时存储(初阶用 Session 即可)。
六、JDBC + 连接池:数据库交互(数据层核心)
1. 组件定位
JDBC 是 Java 操作数据库的标准接口,连接池(如 Druid)是优化数据库连接的工具(避免频繁创建 / 销毁连接),是数据交互的核心。
2. 核心作用
- 连接数据库,执行增删改查(CRUD);
- 连接池复用连接,提升性能。
3. 入门示例(Druid 连接池 + JDBC 查询)
java
运行
import com.alibaba.druid.pool.DruidDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JdbcDemo {
// 初始化连接池(实际项目中可配置在配置文件)
private static DruidDataSource dataSource = new DruidDataSource();
static {
dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8");
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setInitialSize(5); // 初始连接数
dataSource.setMaxActive(20); // 最大连接数
}
// 查询用户信息
public static void queryUser(String username) {
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM user WHERE username = ?")) {
// 设置参数(防SQL注入)
ps.setString(1, username);
// 执行查询
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println("用户名:" + rs.getString("username") + ",年龄:" + rs.getInt("age"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
queryUser("admin");
}
}
4. 常用场景
- 所有数据库操作(注册时插入用户、登录时查询用户、修改用户信息等);
- 初阶掌握基础 CRUD 即可,后续可学 MyBatis 简化 JDBC 操作。
总结
关键点回顾
- JavaEE 初阶核心组件中,Servlet 是请求处理核心,Filter 做统一过滤,Listener 监听状态,Cookie/Session 管理用户状态,JDBC + 连接池操作数据库;
- 各组件分工明确:Servlet 处理业务,Filter 处理通用功能,Listener 处理容器事件,Cookie/Session 解决状态保持,JDBC 解决数据交互;
- 初阶学习重点是 "Servlet+Filter+JDBC",掌握这三个就能搭建基础 Web 项目,JSP 可仅做了解(主流前后端分离已少用)。