Servlet 与 Jakarta EE
约 705 字大约 2 分钟
布欧-Lewyon
2026-05-16
首页 › Java › Web 基础 › Servlet 与 Jakarta EE
Servlet 是 Java Web 的原始规范,定义了服务端如何处理 HTTP 请求和响应。虽然现代开发很少直接写 Servlet,但理解它的生命周期有助于掌握后续的 Spring MVC。
Servlet 是什么
Servlet 是运行在 Web 容器(如 Tomcat、Jetty)中的 Java 类,接收 HTTP 请求并生成响应。
生命周期
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
public void init() {
// 1. 初始化:Servlet 首次被访问时调用(一次)
System.out.println("Servlet 初始化");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 2. 处理 GET 请求:每次请求调用
resp.setContentType("text/plain;charset=UTF-8");
resp.getWriter().write("Hello, Servlet!");
}
@Override
public void destroy() {
// 3. 销毁:应用关闭时调用(一次)
}
}生命周期三步:init() → service()(根据 HTTP 方法分派到 doGet/doPost 等)→ destroy()。
请求与响应
// HttpServletRequest
String method = req.getMethod(); // GET / POST
String path = req.getRequestURI(); // /hello
String param = req.getParameter("name"); // 查询参数
req.setAttribute("key", value); // 请求域属性
// HttpServletResponse
resp.setStatus(200);
resp.setHeader("Content-Type", "application/json");
resp.getWriter().write("{\"msg\": \"ok\"}");Filter:过滤器
Filter 在请求到达 Servlet 之前和响应返回客户端之后执行,适合日志、鉴权、编码设置等横切关注点:
@WebFilter("/*")
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
long start = System.currentTimeMillis();
chain.doFilter(request, response); // 放行给下一个 Filter 或 Servlet
long elapsed = System.currentTimeMillis() - start;
System.out.println("请求耗时: " + elapsed + "ms");
}
}多个 Filter 按 @Order 或 web.xml 中的配置顺序形成责任链。
Java EE → Jakarta EE
2017 年 Oracle 将 Java EE 移交 Eclipse 基金会,由于商标原因更名为 Jakarta EE。核心变化:
- 包名从
javax.*改为jakarta.*(如javax.servlet→jakarta.servlet)。 - Tomcat 10+、WildFly 等容器已切换到 Jakarta 命名空间。
为何多数新项目转向 Spring
- Servlet API 太底层:需要手动处理请求解析、参数绑定、JSON 序列化、事务管理等,重复代码多。
- Spring Boot 自动配置:内嵌 Tomcat,无需部署 WAR,一个
main方法启动。 - Spring MVC:
@Controller/@RestController替代HttpServlet,注解驱动,代码量减少 70% 以上。
但 Servlet 仍然是 Spring MVC 的底层基础——DispatcherServlet 本身就是一个 Servlet。
小结
- Servlet 生命周期:
init()(一次)→service()/doGet()/doPost()(每次请求)→destroy()(一次)。 - Filter 在请求链中过滤和增强(日志、鉴权、编码),是 AOP 思想的前身。
- Java EE 已更名为 Jakarta EE,包名从
javax.*改为jakarta.*。 - 工程中通常不直接使用原始 Servlet API,而是通过 Spring MVC 等框架间接使用。
- 易错:
resp.getWriter()和resp.getOutputStream()不能混用;getParameter返回null时参数不存在,小心 NPE。 - 思考任务:用原始 Servlet API + Tomcat 启动一个最简单的 Web 应用,实现
GET /api/hello?name=xxx返回 JSON{"greeting": "Hello, xxx"}。
上一节:HTTP 与 REST
下一节:Spring 概述
下一节:Spring 概述
