Servlet 是運行在 Servlet 容器(Tomcat、Jetty、WebLogic 等)中的 Java 類,遵循 javax.servlet.Servlet 接口契約。核心生命周期三方法:
init(ServletConfig):實例化後調用一次,完成初始化service(ServletRequest, ServletResponse):每次請求調用,分發到 doGet/doPost 等destroy():容器關閉/卸載前調用,釋放資源@WebServlet("/hello") // Servlet 3.0+ 註解配置,替代 web.xml
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("text/plain;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("Hello, Servlet!");
}
}
| 對象 | 核心職責 | 常用方法 |
|---|---|---|
| HttpServletRequest | 封裝 HTTP 請求 | getParameter(), getHeader(), getSession(), getInputStream() |
| HttpServletResponse | 構建 HTTP 響應 | setStatus(), setHeader(), setContentType(), getWriter(), getOutputStream() |
| HttpSession | 會話狀態管理 | setAttribute(), getAttribute(), invalidate(), setMaxInactiveInterval() |
| ServletContext | 應用級上下文 | getInitParameter(), getResourceAsStream(), log(), getRequestDispatcher() |
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
src/
├── main/
│ ├── java/com/example/HelloServlet.java
│ ├── webapp/
│ │ ├── WEB-INF/web.xml (可選)
│ │ └── index.jsp
└── test/
mvn package 生成 .warwebapps/ 目錄(熱部署)或通過管理控制台部署https://host:port/context-path/hellopublic class ServletUtils {
public static final String DOCTYPE =
"<!DOCTYPE html>";
public static String headWithTitle(String title) {
return DOCTYPE + "\n" +
"<html>\n<head><title>" + title + "</title></head>\n";
}
}
// 使用
out.println(ServletUtils.headWithTitle("歡迎") +
"<body><h1>Hello, World!</h1></body></html>");
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1. 業務邏輯準備數據
List users = userService.findAll();
req.setAttribute("users", users);
// 2. 轉發給視圖渲染(JSP/Thymeleaf/FreeMarker)
req.getRequestDispatcher("/WEB-INF/views/user-list.jsp")
.forward(req, resp);
}
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
@WebFilter("/*")
public class EncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
chain.doFilter(req, resp);
}
}
@WebServlet(value = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
AsyncContext ctx = req.startAsync();
ctx.start(() -> {
try {
Thread.sleep(5000); // 模擬耗時操作
ctx.getResponse().getWriter().write("Async Done");
ctx.complete();
} catch (Exception e) { /* handle */ }
});
}
}
maxThreads、acceptCountgetSession(),大對象存 Redis 不存 Sessionresp.setBufferSize(8192) 減少網絡交互Servlet 是 Java Web 技術棟樑,Spring MVC、Struts、JSF 等框架本質上都是構建在 Servlet API 之上。掌握其核心契約、生命周期、請求響應模型、部署機制,是排查疑難雜症、設計高性能系統的前提。現代開發雖多用框架,但「懂 Servlet」永遠是資深 Java Web 工程師的分水嶺。