JavaEE / Jakarta EE · 权威教程

上一页你学会了"写一个能跑的 Java 程序",这一页回答下一个问题:"怎么让它跑在服务器上,给浏览器提供网页?"。以 Jakarta EE 10 / 11 为基线(Servlet 6.0、JSP 3.1、JDBC 4.3)。先把 Web 底层的砖瓦搞懂,再去看 Spring,你才不会觉得它是魔法。

1
第 1 节 · 最新版本与兼容性:Jakarta EE 10/11
Jakarta EE Releases · Servlet Version Ma

Java Web 的版本号比 Java 本体还乱——你看到的 javax.servlet 和 jakarta.servl

进入本节 →
2
第 2 节 · 什么是 JavaEE / Jakarta EE,为什
What is Jakarta EE · Why · Relationship

先说历史包袱,别被名字绕晕:JavaEE(Java Platform, Enterprise Edition) 是 Su

进入本节 →
3
第 3 节 · Servlet:Web 后端的最小单位
Servlet Lifecycle · Request / Response ·

浏览器输入网址回车,背后发生了什么?你的请求一路到达Servlet 容器(比如 Tomcat),容器把 HTTP 请求包

进入本节 →
4
第 4 节 · JSP:在网页里混 Java(MVC 的 V)
JSP · EL · JSTL · MVC Pattern

Servlet 里手写 out.write("

...") 拼 HTML,拼到第 50 行你会想死。JSP(Jav

进入本节 →
5
第 5 节 · JDBC:Java 连接数据库的官方通道
JDBC · PreparedStatement · Transactions

网页上的数据哪来的?存在 MySQL 这类数据库里。JDBC(Java Database Connectivity)是

进入本节 →
6
第 6 节 · 数据库连接池:别每次都重新握手
Connection Pool · HikariCP · Druid

上面的 JDBC 代码每查一次就 getConnection 开一次连接、用完关掉。但建立数据库连接是很贵的操作(要 T

进入本节 →
7
第 7 节 · Filter 与 Listener:拦路虎与观察员
Filter Chain · Character Encoding · List

每个请求都做一遍的事——"检查登录没有""统一设编码""记录访问日志"——总不能在每个 Servlet 里抄一遍。Fil

进入本节 →
8
第 8 节 · Cookie 与 Session:服务器怎么记住你是
Session Tracking · Cookie Attributes · D

HTTP 是"无状态"的——服务器处理完一个请求,就不记得你是谁了。你登录了一下,刷新又让你登录?用户会骂娘。Cooki

进入本节 →
9
第 9 节 · 文件上传与下载
File Upload · Part · Multipart Config ·

用户传头像、传附件,是 Web 应用绕不开的功能。Servlet 3.0(现代 Jakarta EE)起提供了 Part

进入本节 →
10
第 10 节 · 国际化与 Web 安全认证
i18n · ResourceBundle · BASIC / Form Log

面向海外用户,界面文字不能写死中文;后台接口不能裸奔让任何人调。这一章补两块JavaEE 标准能力:国际化(多语言)和容

进入本节 →
11
第 11 节 · 小项目实战:登录注册 + 留言板
Mini Project · Servlet + JSP + JDBC + My

把这一页的零件全拼起来:用户能注册、能登录、登录后能留言、能看别人留的言。数据库是 MySQL,表结构先建好,后面的代码

进入本节 →
12
第 12 节 · 常见坑与最佳实践
Pitfalls · Encoding · Injection · Sessio

Java Web 开发的坑高度集中,下面这张表是"入行三年内必踩榜"。遇到诡异问题,先来这里对号入座。

进入本节 →
13
第 13 节 · WebFlux 与响应式编程:高并发下的另一条路
Reactive Stack · Reactor / Mono & Flux /

前面十章讲的都是 Servlet 那一套(阻塞式):一个请求占一个线程,线程等 IO 的时候就在那儿干等。这套模型简单直

进入本节 →
14
第 14 节 · 企业 Java 困局的复盘与迁移路线(历史栈)
Legacy Enterprise Java · EJB / App Serve

Legacy Enterprise Java · EJB / App Server / JTA → Spring Boot / Strangler Fig

进入本节 →

练

综合练习题:把 Web 底层串起来

Final Exercises · 5 Problems

下面 5 道题把 Servlet、JDBC、Filter、Session、乱码全串一遍。先自己想,再展开答案。

综合练习(5 题)

1.(链路题)用户访问 http://localhost:8080/app/list,背后依次经过哪些组件?

查看答案

答案:浏览器发 HTTP 请求 → Tomcat 监听 8080 解析成 Request → EncodingFilter(设编码)→ LoginFilter(查登录)→ ListServlet(JDBC 查数据库)→ request 塞数据 → forward 给 list.jsp(JSTL 遍历)→ Tomcat 把 HTML 包成 HTTP 响应发回浏览器。

2.(事务题)转账 A 扣 100 B 加 100,JDBC 代码怎么写保证原子性?

查看答案与参考代码

答案:

conn.setAutoCommit(false);
try {
    // A 扣 100
    // B 加 100
    conn.commit();
} catch (SQLException e) {
    conn.rollback();
    throw e;
}

解析:关自动提交,两步都成功才 commit,任何一步失败 rollback。

3.(乱码题)GET 请求中文参数乱码,POST 中文乱码,数据库存中文乱码,分别在哪修?

查看答案

答案:GET 乱码:Tomcat 8+ 默认 UTF-8 一般不用管,老版本在 Connector 配 URIEncoding="UTF-8"。POST 乱码:Filter 里 request.setCharacterEncoding("UTF-8")。数据库乱码:JDBC URL 带 characterEncoding=utf8,库表用 utf8mb4。

4.(Filter 题)要实现"所有请求记录访问日志(IP+URL+耗时)",用什么组件?怎么写?

查看答案与参考代码

答案:用 Filter,在 doFilter 前后记时间。

long start = System.currentTimeMillis();
chain.doFilter(req, resp);
long cost = System.currentTimeMillis() - start;
System.out.println(((HttpServletRequest) req).getRemoteAddr()
    + " " + ((HttpServletRequest) req).getRequestURI()
    + " " + cost + "ms");

5.(安全题)留言板要防哪三类常见攻击?各怎么防?

查看答案

答案:① SQL 注入:用 PreparedStatement ? 占位符;② XSS:JSP 里用 <c:out> 自动转义用户输入;③ CSRF:Cookie 设 SameSite=Strict,关键操作加 token 校验。