Servlet 教程
Servlet 是什么、它在 Java Web 里的位置,以及一门课走完的学习路线。
Servlet 是什么
A servlet is a server-side component defined by the Java EE spec. It does not listen on a port or parse HTTP — the servlet container (Tomcat, Jetty, Undertow) does. The container wraps the request into HttpServletRequest and the response writer into HttpServletResponse, then hands both to your service() method.
它在 Web 应用中的位置
| Layer | Job |
|---|---|
| Browser | 发 HTTP 请求、渲染 HTML |
| Web server / container | 监听端口、解析协议、管理 Servlet 生命周期 |
| Servlet | 读参数、做业务、写响应 |
| Business / DAO | 真正的领域逻辑与数据访问 |
Early servlets printed HTML with out.println("<html>..."), mixing markup and Java so that every tag change required a recompile. Later the page-rendering job moved to JSP and servlets retreated to the controller role — that is where MVC starts.
第一个 Servlet 长什么样
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = resp.getWriter()) {
out.println("<!DOCTYPE html>");
out.println("<h1>Hello, Servlet</h1>");
}
}
}@WebServlet("/hello") maps /hello to this class, so no web.xml is needed. Extending HttpServlet lets the container dispatch by HTTP method to doGet / doPost, so you never inspect request.getMethod() yourself.
jakarta.servlet instead of javax.servlet. Tomcat 10+ uses jakarta, Tomcat 9 and earlier still use javax. The import must match the container version or you get ClassNotFoundException.学习路线
- 环境与生命周期 —— 容器做了什么、
init/service/destroy何时调用 - 请求与响应 —— 参数、头、Cookie、状态码、重定向
- 会话与状态 —— Cookie、Session、URL 重写
- 横切能力 —— 过滤器、异常处理、国际化
- 实战 —— 上传、数据库、发邮件、打包部署
Servlet 是什么
Servlet 是 Java EE 规范里定义的服务端组件。它本身不监听端口、不解析 HTTP 报文——这些由 Servlet 容器(Tomcat、Jetty、Undertow)完成。容器把请求包装成 HttpServletRequest,把响应的写入口包装成 HttpServletResponse,交给你写的 service() 方法。
它在 Web 应用中的位置
| 层 | 职责 |
|---|---|
| 浏览器 | 发 HTTP 请求、渲染 HTML |
| Web 服务器 / 容器 | 监听端口、解析协议、管理 Servlet 生命周期 |
| Servlet | 读参数、做业务、写响应 |
| 业务 / DAO | 真正的领域逻辑与数据访问 |
早期用 Servlet 直接 out.println("<html>...") 拼页面,HTML 和 Java 混在一起,改一个标签就要重编译。后来把「输出页面」的职责交给 JSP,Servlet 退回到控制器的角色,这就是 MVC 的起点。
第一个 Servlet 长什么样
import java.io.IOException;
import java.io.PrintWriter;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = resp.getWriter()) {
out.println("<!DOCTYPE html>");
out.println("<h1>Hello, Servlet</h1>");
}
}
}@WebServlet("/hello") 把 URL /hello 映射到这个类,不再需要手写 web.xml。继承 HttpServlet 后,容器按请求方法分派到 doGet / doPost,你不必自己判断 request.getMethod()。
javax.servlet 改成了 jakarta.servlet。Tomcat 10+ 用 jakarta,Tomcat 9 及更早仍是 javax。抄代码时包名和容器版本必须对上,否则 ClassNotFoundException。学习路线
- 环境与生命周期 —— 容器做了什么、
init/service/destroy何时调用 - 请求与响应 —— 参数、头、Cookie、状态码、重定向
- 会话与状态 —— Cookie、Session、URL 重写
- 横切能力 —— 过滤器、异常处理、国际化
- 实战 —— 上传、数据库、发邮件、打包部署