Servlet 是運行在 Web 容器(如 Tomcat、Jetty)中的 Java 類別,處理 HTTP 請求並生成響應。它是 Java Web 開發的基石,Spring MVC、Struts 等框架底層皆基於 Servlet API。
| 介面/類別 | 說明 |
|---|---|
javax.servlet.Servlet |
核心介面,定義 init()、service()、destroy() 生命週期方法 |
javax.servlet.GenericServlet |
協議無關的抽象基類,實作 Servlet 與 ServletConfig |
javax.servlet.http.HttpServlet |
HTTP 專用抽象類,繼承 GenericServlet,提供 doGet()、doPost() 等方法 |
ServletRequest / HttpServletRequest |
封裝客戶端請求資訊(參數、Header、Session、Body) |
ServletResponse / HttpServletResponse |
封裝伺服器響應(狀態碼、Header、輸出流) |
ServletContext |
Web 應用全域上下文,共享資源、配置參數、日誌 |
HttpSession |
會話管理,跨請求保持用戶狀態 |
init(ServletConfig config),僅執行一次service(),HTTP 請求再分派至 doGet()/doPost() 等destroy(),釋放資源<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
<init-param>
<param-name>configPath</param-name>
<param-value>/WEB-INF/config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
@WebServlet(
urlPatterns = "/api/*",
initParams = @WebInitParam(name = "configPath", value = "/WEB-INF/config.xml"),
loadOnStartup = 1
)
public class MyServlet extends HttpServlet {
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 處理 GET 請求
}
}
1. 客戶端發送 HTTP 請求
2. Web 容器解析請求,建立 HttpServletRequest / HttpServletResponse
3. 根據 URL 模式匹配 Servlet
4. 呼叫 service() → doGet()/doPost() 等
5. Servlet 邏輯處理,輸出響應
6. 容器將響應發送給客戶端
String name = req.getParameter("name");
String[] hobbies = req.getParameterValues("hobby");
Map<String, String[]> allParams = req.getParameterMap();
// 轉發(伺服器端跳轉,URL 不變,共享 request)
req.getRequestDispatcher("/target.jsp").forward(req, resp);
// 重導向(客戶端跳轉,URL 改變,新 request)
resp.sendRedirect("/another");
HttpSession session = req.getSession(); // 獲取或建立
HttpSession session = req.getSession(false); // 僅獲取,不存在回傳 null
session.setAttribute("user", userObj);
User user = (User) session.getAttribute("user");
session.invalidate(); // 銷毀 Session
@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Part filePart = req.getPart("file");
String fileName = Paths.get(filePart.getSubmittedFileName()).getFileName().toString();
try (InputStream in = filePart.getInputStream()) {
Files.copy(in, Paths.get("/upload/path/" + fileName));
}
}
}
ServletContextListener、HttpSessionListener、ServletRequestListener)ThreadLocalInputStream/OutputStream 正確關閉<error-page> 或使用 @ControllerAdvice(Spring MVC)統一處理AsyncContext,長耗時操作可釋放容器執行緒