HTTP 回應由狀態行、回應頭、空行、實體內容組成。狀態碼是伺服器告知客戶端請求處理結果的核心指標,Servlet 透過 HttpServletResponse 靈活控制狀態碼,實現重導向、錯誤處理、快取控制等關鍵功能。
| 範圍 | 類別 | 典型代碼 | 說明 |
|---|---|---|---|
| 1xx | 資訊回應 | 100 Continue | 客戶端繼續發送請求主體 |
| 2xx | 成功 | 200 OK、201 Created、204 No Content | 請求正常處理,204 適合快取刷新場景 |
| 3xx | 重導向 | 301 Moved Permanently、302 Found、304 Not Modified | 301 永久移動,302 臨時重導,304 快取驗證 |
| 4xx | 客戶端錯誤 | 400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found | 401 需認證,403 拒絕,404 資源不存在 |
| 5xx | 伺服器錯誤 | 500 Internal Server Error、503 Service Unavailable | 500 程式異常,503 過載/維護可配合 Retry-After |
注意:HTTP/1.1 新增代碼(如 307、405、411)需檢查客戶端協議版本(request.getProtocol())再使用,避免相容性問題。
response.setStatus(int sc),搭配 HttpServletResponse.SC_* 常數(如 SC_NOT_FOUND)提升可讀性。response.sendError(int sc, String msg) 自動生成錯誤頁面(預設 404)。response.sendRedirect(String url) 產生 302 並設定 Location 頭,自動處理相對路徑轉絕對路徑,並為不支援自動重導的舊瀏覽器生成提示頁面。設定狀態碼必須在輸出內容前完成,否則拋出 IllegalStateException。
根據用戶選擇的搜尋引擎、關鍵字、每頁筆數,動態構建 URL 並重導向;無效引擎返回 404。
package hall;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
public class SearchEngines extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String searchString = URLEncoder.encode(request.getParameter("searchString"), "UTF-8");
String numResults = request.getParameter("numResults");
String searchEngine = request.getParameter("searchEngine");
SearchSpec[] specs = SearchSpec.getCommonSpecs();
for (SearchSpec spec : specs) {
if (spec.getName().equals(searchEngine)) {
String url = response.encodeURL(spec.makeURL(searchString, numResults));
response.sendRedirect(url); // 302 重導向
return;
}
}
response.sendError(response.SC_NOT_FOUND, "No recognized search engine specified."); // 404
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { doGet(request, response); }
}
// 搜尋引擎規格封裝類
class SearchSpec {
private String name, baseURL, numResultsSuffix;
private static SearchSpec[] commonSpecs = {
new SearchSpec("google", "https://www.google.com/search?q=", "&num="),
new SearchSpec("duckduckgo", "https://duckduckgo.com/html/?q=", "&kl=")
// 可擴充更多引擎
};
public SearchSpec(String name, String baseURL, String numResultsSuffix) {
this.name = name; this.baseURL = baseURL; this.numResultsSuffix = numResultsSuffix;
}
public String makeURL(String q, String num) { return baseURL + q + numResultsSuffix + num; }
public String getName() { return name; }
public static SearchSpec[] getCommonSpecs() { return commonSpecs; }
}
前端表單提交至該 Servlet,即可實現統一搜尋入口,展示 302 與 404 的實際應用場景。
web.xml 配置 <error-page> 映射狀態碼至友好頁面,提升用戶體驗。熟練運用狀態碼,是構建健壯、語義清晰 Web 服務的關鍵。