Servlet 是 Java Web 開發的基石,運行於 Tomcat 等 Servlet 容器中。本文記錄從創建類、配置映射、部署驗證的完整最小化流程。
package myservlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Dispatcher")
public class Dispatcher extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.getWriter().write("Served at: " + req.getContextPath());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
doGet(req, resp);
}
}
HttpServlet,覆寫 doGet/doPost。@WebServlet 註解定義 URL 映射(Servlet 3.0+ 容器自動掃描)。servlet-api.jar(Tomcat lib 目錄下),編譯時 provided 作用域。<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee" version="3.1">
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>myservlet.Dispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern> <!-- 捕獲所有請求 -->
</servlet-mapping>
</web-app>
servlet-name 需與類名或註解一致。url-pattern 為 / 表示默認 Servlet,處理所有未匹配請求。metadata-complete="false"(默認)會合併映射,注意衝突。WAR:Maven 執行 mvn clean package。webapps 目錄,啟動 startup.sh/bat。https://localhost:8080/your-app/Dispatcher 應返回「Served at: /your-app」。| 概念 | 說明 |
|---|---|
| Servlet 容器 | 管理 Servlet 生命周期、映射請求、提供請求/響應對象(Tomcat、Jetty、Undertow) |
| web.xml | 部署描述符,定義 Servlet、Filter、Listener、歡迎頁面、錯誤頁等 |
| 請求流程 | HTTP 請求 → 容器解析 → 匹配 Servlet → 創建 Request/Response → 調用 service() → doGet/doPost → 返回響應 |
| 生命周期 | init() → service() × N → destroy() |
url-pattern、Context Path、類名拼寫、Tomcat 控制台是否有掃描錯誤日誌。servlet-api.jar 編譯期依賴,運行期由容器提供,勿打包進 WAR。req.setCharacterEncoding("UTF-8")、resp.setContentType("text/html;charset=UTF-8")、Tomcat server.xml 配置 URIEncoding="UTF-8"。