Servlet (Server Applet) 是運行在 Web 容器(Tomcat/Jetty)中的 Java 類,遵循 javax.servlet.Servlet 規範。它接收 HTTP 請求,處理業務邏輯,生成動態響應。本質上是一個無 main 方法、由容器管理生命周期的特殊 Java 類。
src 下新建包(如 com.example.servlet)。HelloWorldServlet,勾選 doGet/doPost,完成向導自動生成類並更新 web.xml。package com.example.servlet;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class HelloWorldServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp); // 統一委派給 doPost
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 設置編碼(防止中文亂碼)
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
// 2. 獲取參數
String username = req.getParameter("userName");
String password = req.getParameter("passWord");
// 3. 業務邏輯(此處簡單演示)
PrintWriter out = resp.getWriter();
out.println("登錄信息
");
out.println("用戶名: " + username + "
");
out.println("密碼: " + password);
out.close();
}
}
<servlet>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>com.example.servlet.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
註解版 (推薦): 在類上添加 @WebServlet("/HelloWorld"),無需 web.xml。
<%@ page contentType="text/html;charset=UTF-8" %>
<form action="${pageContext.request.contextPath}/HelloWorld" method="post">
用戶名: <input type="text" name="userName" /><br/>
密碼: <input type="password" name="passWord" /><br/>
<input type="submit" value="登錄" />
</form>
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("userName");
String password = req.getParameter("passWord");
// 模擬驗證
if ("admin".equals(username) && "123456".equals(password)) {
// 登錄成功 -> 轉發到成功頁
req.getRequestDispatcher("/WEB-INF/views/success.jsp").forward(req, resp);
} else {
// 登錄失敗 -> 設置錯誤信息,轉發回登錄頁
req.setAttribute("error", "用戶名或密碼錯誤");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
}
}
| 現象 | 原因 | 解決 |
|---|---|---|
| 404 Not Found | url-pattern 不匹配 / 專案未發布 | 檢查 web.xml 或 @WebServlet 路徑;Servers 視圖 Clean/Republish |
| 中文亂碼 | 未設置編碼 | req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8") |
| 獲取參數為 null | 表單 name 屬性與 getParameter 參數不一致 | 檢查 HTML name="userName" vs req.getParameter("userName") |
掌握「HttpServlet 繼承 → doGet/doPost 處理 → 參數獲取 → 業務邏輯 → 轉發/重定向」核心流程,理解容器管理生命周期與線程安全約束,是 JavaWeb 開發的基石。