# Servlet HTTP 狀態碼
HTTP 請求和 HTTP 響應消息的格式是類似的,結構如下:
* 初始狀態行 + 回車換行符(回車+換行)
* 零個或多個標題行+回車換行符
* 一個空白行,即回車換行符
* 一個可選的消息主體,比如文件、查詢數據或查詢輸出
例如,服務器的響應頭如下所示:
```
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
(Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
```
狀態行包括 HTTP 版本(在本例中為 HTTP/1.1)、一個狀態碼(在本例中為 200)和一個對應于狀態碼的短消息(在本例中為 OK)。
以下是可能從 Web 服務器返回的 HTTP 狀態碼和相關的信息列表:
| 代碼 | 消息 | 描述 |
| --- | --- | --- |
| 100 | Continue | 只有請求的一部分已經被服務器接收,但只要它沒有被拒絕,客戶端應繼續該請求。 |
| 101 | Switching Protocols | 服務器切換協議。 |
| 200 | OK | 請求成功。 |
| 201 | Created | 該請求是完整的,并創建一個新的資源。 |
| 202 | Accepted | 該請求被接受處理,但是該處理是不完整的。 |
| 203 | Non-authoritative Information |
| 204 | No Content |
| 205 | Reset Content |
| 206 | Partial Content |
| 300 | Multiple Choices | 鏈接列表。用戶可以選擇一個鏈接,進入到該位置。最多五個地址。 |
| 301 | Moved Permanently | 所請求的頁面已經轉移到一個新的 URL。 |
| 302 | Found | 所請求的頁面已經臨時轉移到一個新的 URL。 |
| 303 | See Other | 所請求的頁面可以在另一個不同的 URL 下被找到。 |
| 304 | Not Modified |
| 305 | Use Proxy |
| 306 | _Unused_ | 在以前的版本中使用該代碼。現在已不再使用它,但代碼仍被保留。 |
| 307 | Temporary Redirect | 所請求的頁面已經臨時轉移到一個新的 URL。 |
| 400 | Bad Request | 服務器不理解請求。 |
| 401 | Unauthorized | 所請求的頁面需要用戶名和密碼。 |
| 402 | Payment Required | _您還不能使用該代碼。_ |
| 403 | Forbidden | 禁止訪問所請求的頁面。 |
| 404 | Not Found | 服務器無法找到所請求的頁面。. |
| 405 | Method Not Allowed | 在請求中指定的方法是不允許的。 |
| 406 | Not Acceptable | 服務器只生成一個不被客戶端接受的響應。 |
| 407 | Proxy Authentication Required | 在請求送達之前,您必須使用代理服務器的驗證。 |
| 408 | Request Timeout | 請求需要的時間比服務器能夠等待的時間長,超時。 |
| 409 | Conflict | 請求因為沖突無法完成。 |
| 410 | Gone | 所請求的頁面不再可用。 |
| 411 | Length Required | "Content-Length" 未定義。服務器無法處理客戶端發送的不帶 Content-Length 的請求信息。 |
| 412 | Precondition Failed | 請求中給出的先決條件被服務器評估為 false。 |
| 413 | Request Entity Too Large | 服務器不接受該請求,因為請求實體過大。 |
| 414 | Request-url Too Long | 服務器不接受該請求,因為 URL 太長。當您轉換一個 "post" 請求為一個帶有長的查詢信息的 "get" 請求時發生。 |
| 415 | Unsupported Media Type | 服務器不接受該請求,因為媒體類型不被支持。 |
| 417 | Expectation Failed |
| 500 | Internal Server Error | 未完成的請求。服務器遇到了一個意外的情況。 |
| 501 | Not Implemented | 未完成的請求。服務器不支持所需的功能。 |
| 502 | Bad Gateway | 未完成的請求。服務器從上游服務器收到無效響應。 |
| 503 | Service Unavailable | 未完成的請求。服務器暫時超載或死機。 |
| 504 | Gateway Timeout | 網關超時。 |
| 505 | HTTP Version Not Supported | 服務器不支持"HTTP協議"版本。 |
## 設置 HTTP 狀態代碼的方法
下面的方法可用于在 Servlet 程序中設置 HTTP 狀態碼。這些方法通過 _HttpServletResponse_ 對象可用。
| 方法 | 描述 |
| --- | --- |
| **public void setStatus ( int statusCode )** | 該方法設置一個任意的狀態碼。setStatus 方法接受一個 int(狀態碼)作為參數。如果您的反應包含了一個特殊的狀態碼和文檔,請確保在使用 _PrintWriter_ 實際返回任何內容之前調用 setStatus。 |
| **public void sendRedirect(String url)** | 該方法生成一個 302 響應,連同一個帶有新文檔 URL 的 _Location_ 頭。 |
| **public void sendError(int code, String message)** | 該方法發送一個狀態碼(通常為 404),連同一個在 HTML 文檔內部自動格式化并發送到客戶端的短消息。 |
## HTTP 狀態碼實例
下面的例子把 407 錯誤代碼發送到客戶端瀏覽器,瀏覽器會顯示 "Need authentication!!!" 消息。
```
// 導入必需的 java 庫
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
// 擴展 HttpServlet 類
public class showError extends HttpServlet {
// 處理 GET 方法請求的方法
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 設置錯誤代碼和原因
response.sendError(407, "Need authentication!!!" );
}
// 處理 POST 方法請求的方法
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
```
現在,調用上面的 Servlet 將顯示以下結果:
```
<h2>HTTP Status 407 - Need authentication!!!</h2>
<b>type</b> Status report
<b>message</b> <u>Need authentication!!!</u>
<b>description</b> <u>The client must first authenticate itself with the proxy (Need authentication!!!).</u>
<h3>Apache Tomcat/5.5.29</h3>
```
- Java 基礎
- Java 簡介
- Java開發環境配置
- Java基礎語法
- Java對象和類
- Java基本數據類型
- Java變量類型
- Java修飾符
- Java運算符
- Java循環結構 - for, while 及 do...while
- Java分支結構 - if...else/switch
- Java Number類
- Java Character類
- Java String類
- Java StringBuffer和StringBuilder類
- Java 數組
- Java 日期時間
- Java正則表達式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 異常處理
- Java 面向對象
- Java 繼承
- Java 重寫(Override)與重載(Overload)
- Java 多態
- Java 抽象類
- Java 接口
- Java 包(package)
- Java 高級教程
- Java 數據結構
- Java Enumeration接口
- Java Bitset類
- Java Vector 類
- Java Stack 類
- Java Dictionary 類
- Java Hashtable 接口
- Java Properties 接口
- Java 集合框架
- Java 泛型
- Java序列化
- Java 網絡編程
- Java 發送郵件
- Java 多線程編程
- Java Applet基礎
- Java 文檔注釋
- Servlet 教程
- Servlet 簡介
- Servlet 環境設置
- Servlet 生命周期
- Servlet 實例
- Servlet 表單數據
- Servlet 客戶端 HTTP 請求
- Servlet 服務器 HTTP 響應
- Servlet HTTP 狀態碼
- Servlet 編寫過濾器
- Servlet 異常處理
- Servlet Cookies 處理
- Servlet Session 跟蹤
- Servlet 數據庫訪問
- Servlet 文件上傳
- Servlet 處理日期
- Servlet 網頁重定向
- Servlet 點擊計數器
- Servlet 自動刷新頁面
- Servlet 發送電子郵件
- Servlet 包
- Servlet 調試
- Servlet 國際化
- JSP 基礎
- JSP 簡介
- JSP 開發環境搭建
- JSP 結構
- JSP 生命周期
- JSP 語法
- JSP 指令
- JSP 動作元素
- JSP 動作元素
- JSP 隱含對象
- JSP 客戶端請求
- JSP 服務器響應
- JSP HTTP 狀態碼
- JSP 表單處理
- JSP 過濾器
- JSP Cookies 處理
- JSP Session
- JSP 文件上傳
- JSP 日期處理
- JSP 頁面重定向
- JSP 點擊量統計
- JSP 自動刷新
- JSP 發送郵件
- JSP 高級教程
- JSP 標準標簽庫(JSTL)
- JSP 連接數據庫
- JSP XML 數據處理
- JSP JavaBean
- JSP 自定義標簽
- JSP 表達式語言
- JSP 異常處理
- JSP 調試
- JSP 國際化
- 免責聲明