Jakarta EE (原 Java EE) 技术栈概览
一、各组件作用简介
| 组件 | 作用 | 类比 |
|---|---|---|
| HTML | 结构层:定义网页的静态结构和内容(如标题、段落、表单)。 | 房子的骨架和布局。 |
| Script (JavaScript) | 行为层:在浏览器端实现动态交互效果、表单验证、异步通信(AJAX)。 | 房子的智能家居系统(遥控灯光、窗帘)。 |
| Servlet | 请求处理核心 :接收、处理客户端(通常是浏览器)的请求,并生成动态响应。是 Java Web 应用的控制器(Controller)。 | 餐厅的前台经理,接待顾客、接收订单、指挥后厨、最后上菜。 |
| JSP | 视图层 (传统):将 Java 代码嵌入 HTML 中,用于方便地生成动态页面。本质上在运行时会被编译成 Servlet。 | 餐厅的传菜员,负责把做好的菜(数据)摆盘(渲染成HTML)端出去。 |
| EL (Expression Language) | 简化视图数据访问 :在 JSP (或 JSF) 中,使用 ${} 语法轻松访问 Servlet 传递过来的数据(如 request, session 中的属性)。 |
获取数据的快捷钥匙。 |
| JSTL (JSP Standard Tag Library) | 标签库 :提供一组标准标签(如 <c:forEach>, <c:if>),在 JSP 中替代 Java 脚本,实现循环、逻辑判断、格式化等,使页面更清晰。 |
一套功能强大的厨房模具,让摆盘(页面逻辑)更规范、更容易。 |
| 过滤器 (Filter) | 请求/响应预处理:在请求到达 Servlet 之前或响应发送给浏览器之前,执行一些通用操作,如:权限验证、日志记录、字符编码设置。 | 餐厅的安检和保洁,每个顾客(请求)和每道菜(响应)都要经过他们。 |
| 监听器 (Listener) | 事件监听:监听 Web 应用生命周期中的事件,如:应用的启动/关闭、Session 的创建/销毁。用于执行相应的初始化或清理工作。 | 餐厅的物业管理员,负责大楼(应用)开业准备、下班关门、管理储物柜(Session)的租用和回收。 |
| JDBC | 数据库连接标准:Java 语言中用来规范客户端如何访问数据库的应用程序接口(API),提供连接、执行 SQL、获取结果的方法。 | 通往所有关系型数据库的通用驾驶执照。 |
| H2 / MySQL | 关系型数据库:用于持久化存储应用程序的结构化数据。H2 是轻量级嵌入式数据库,常用于开发和测试;MySQL 是成熟强大的生产级数据库。 | 餐厅的仓库,H2 像临时小库房,MySQL 像大型中央仓库。 |
| Redis | 内存数据结构存储 :用作缓存 或会话存储(Session Store)。因其极高的读写速度,可以存储热点数据或用户会话,减轻数据库压力。 | 餐厅的备餐台/传送带,把常用的食材(热点数据)或顾客的临时物品(Session)放在手边,随用随取,速度极快。 |
二、数据流向

2.1 流程详解:
-
请求发起:用户在浏览器中操作(点击链接、提交表单),浏览器发送一个 HTTP 请求。
-
过滤预处理 :请求首先经过一个或多个过滤器(Filter),进行统一处理(如:设置字符编码、检查用户是否登录)。
-
核心处理 :过滤后的请求到达 Servlet。
-
Servlet 作为控制器,解析请求参数。
-
根据需要,通过 JDBC 驱动与数据库(MySQL/H2) 交互(增删改查)。
-
为了提升性能,Servlet 可能会先查询或更新 Redis 中的缓存数据或会话信息。
-
-
数据传递与视图渲染:
-
Servlet 将处理结果数据(例如,从数据库查询到的用户列表)放入请求属性(
request.setAttribute)或会话中。 -
Servlet 将请求转发(Forward) 给一个 JSP 页面。
-
-
动态页面生成:
-
JSP 页面接收 Servlet 传来的数据。
-
在 JSP 中,使用 EL 表达式
${}来简便地显示数据。 -
使用 JSTL 标签
<c:forEach>等来实现循环、条件判断等逻辑,动态生成 HTML 内容。 -
最终,JSP 生成一个纯粹的 HTML 文件,其中可能嵌入了 Script(JavaScript) 代码。
-
-
过滤后处理与响应 :生成的 HTML 响应在发回给浏览器之前,可能会再次经过过滤器(Filter) 进行后续处理(如:压缩内容)。
-
客户端渲染与交互 :浏览器接收到 HTML、CSS、JavaScript 后,渲染出最终页面。用户随后在页面上的交互由 Script(JavaScript) 处理,可能通过 AJAX 直接与后端的 Servlet 进行异步通信。
三、技术演进说明
在现代架构中(如前后端分离),JSP/JSTL/EL 的使用在减少,后端 Servlet (或基于 Servlet 的 Spring MVC 等框架)主要通过 REST API 返回 JSON/XML 数据,前端由纯粹的 HTML + JavaScript (Vue/React/Angular) 来消费这些 API 并渲染页面。但 过滤器(Filter) 、监听器(Listener) 、JDBC 、数据库 和 Redis 的角色和作用在后端依然至关重要。
四、传统 Servlet/JSP MVC vs JAX-RS MVC
4.1 传统 Servlet/JSP MVC 架构:
-
核心 :
Servlet作为 Controller,JSP作为 View -
数据流:请求 → Filter → Servlet → 设置属性 → 转发到 JSP → 渲染 HTML
-
典型框架:Spring MVC、Struts
4.2 JAX-RS MVC 架构:
-
核心:使用 JAX-RS (Java API for RESTful Web Services) 作为基础,添加视图渲染能力
-
数据流:请求 → JAX-RS 资源方法 → 返回数据模型 → 模板引擎渲染视图
-
典型实现:Jersey MVC、RESTEasy MVC
4.3 优劣对比
| 方面 | 传统 Servlet/JSP MVC | JAX-RS MVC |
|---|---|---|
| 设计理念 | 基于动作的 MVC | 基于资源的 RESTful + 视图 |
| URL 映射 | @WebServlet("/user") 或 XML 配置 |
@Path("/user") + HTTP 方法注解 |
| 视图技术 | 主要 JSP,也可集成其他 | 更灵活,支持多种模板引擎 (Freemarker, Mustache等) |
| 返回类型 | 通常 RequestDispatcher.forward() |
可返回 Viewable、Response 或直接数据 |
| REST 支持 | 需要额外配置,不原生 | 原生支持 REST,同一控制器可服务 HTML 和 JSON |
| 内容协商 | 需要手动处理 | 内置支持,根据 Accept 头返回不同格式 |
| 现代化程度 | 较传统,但成熟稳定 | 更现代,符合微服务趋势 |
| 学习曲线 | 相对平缓,概念直接 | 需要理解 REST 概念 |
五、现代企业级 Web 应用的技术选择
现实情况:现代企业很少"纯用"其中任何一种,而是采用混合或演进后的架构。
5.1. 前后端分离成为主流
技术栈:
-
前端:React、Vue.js、Angular (单页面应用)
-
后端 :Spring Boot + Spring Web MVC 或 JAX-RS (Jersey)
-
通信:RESTful JSON API,部分场景用 GraphQL
-
数据:MySQL/PostgreSQL + Redis + 消息队列
2. Spring Boot 的统治地位
现代 Java 企业开发中,Spring Boot (基于 Spring MVC) 占据了绝对主导地位,原因:
-
起步依赖:极简配置,快速搭建
-
生态丰富:Spring Data、Spring Security、Spring Cloud 等完整解决方案
-
生产就绪:Actuator、健康检查、Metrics 等开箱即用
-
灵活视图:支持传统 MVC 也完美支持 REST API

5.3. 模板引擎的演进
即使需要服务器端渲染,也更多选择:
-
Thymeleaf (Spring 官方推荐) - 自然模板,可在浏览器中直接查看
-
Freemarker - 老牌强大模板引擎
-
JSP - 正在被逐渐淘汰,因为:
-
编译性能问题
-
与 Servlet 容器耦合过紧
-
不利于模块化开发
-
5.4 现代企业级架构总结
| 场景 | 推荐技术栈 | 说明 |
|---|---|---|
| 传统企业内部系统 | Spring Boot + Thymeleaf | 开发快速,维护简单 |
| 互联网 Web 应用 | Spring Boot + React/Vue | 前后端分离,体验更好 |
| 微服务架构 | Spring Boot (纯API) | 只提供 REST API |
| 高性能 API 服务 | JAX-RS (Jersey/Quarkus) | 对性能要求极高的场景 |
| 遗留系统维护 | 传统 Servlet/JSP | 现有系统,逐步重构 |
核心结论:
-
技术选择上 :Spring Boot + Spring MVC 是目前企业级 Java Web 开发的事实标准
-
架构模式上 :前后端分离 已成为主流,后端主要提供 API
-
JAX-RS 在需要严格遵循 REST 规范或构建轻量级 API 服务时是优秀选择
-
传统 Servlet/JSP MVC 主要存在于遗留系统,新项目较少采用纯这种架构
现代开发者应该掌握 Spring Boot 构建 REST API 的能力,同时了解前端框架的基本协作方式,这是当前就业市场最需要的技能组合。
六、什么是 REST API?
REST API 是一种基于 REST(Representational State Transfer)架构风格设计的应用程序编程接口。
6.1 核心特征:
-
无状态 (Stateless):每个请求包含所有必要信息,服务器不存储客户端状态
-
统一接口 (Uniform Interface):使用标准的 HTTP 方法(GET, POST, PUT, DELETE)
-
资源导向 (Resource-Based):一切都被抽象为资源,通过 URI 访问
-
表述性 (Representational):同一资源可以有不同表现形式(JSON, XML 等)
6.2 REST API 与传统 Web 应用的区别:
| 方面 | 传统 Web 应用 (Servlet/JSP) | REST API |
|---|---|---|
| 数据格式 | 返回 HTML 页面 | 返回 JSON/XML 数据 |
| 客户端 | 浏览器渲染页面 | 任何客户端(Web, 移动端, 第三方) |
| 状态管理 | 常用 Session/Cookie | 无状态,常用 Token |
| URL 设计 | 动作导向 (/login.do, /showUsers) |
资源导向 (/api/users, /api/messages) |
| HTTP 方法 | 主要用 GET/POST | 充分利用 GET/POST/PUT/DELETE 等 |
七、Web 请求完整数据流
