JavaWeb-03-Servlet-08-Http狀態碼
JavaWeb-03-Servlet-08-Http狀態碼
1.狀態碼介紹
1.狀態碼是由三位數字組成的符號。
2.Http伺服器在推送響應包前,根據本次請求處理情況,將Http狀態碼寫入到響應包裡的【狀態行】上。
3.如果Http伺服器針對本次請求,返回了對應的資原始檔,那麼就通過Http狀態碼通知瀏覽器該如何處理這個結果;
如果Http伺服器針對本次請求,沒有返回對應的資原始檔,那麼就通過Http狀態碼向瀏覽器解釋不能返回的原因。
2.狀態碼分類
2.1狀態碼分為五個大類
狀態碼的組成:[100-599],以第一個數字為區分,分為5個大類。
2.2 【1XX】
其中最具特徵的是:100
作用:通知瀏覽器,本次返回的資原始檔並不是一個獨立的完整資原始檔,需要瀏覽器在接收到響應包後,繼續向Http伺服器請求所依賴的其他資原始檔。
例:
比如百度的頁面,在傳送請求時,伺服器返回一個html檔案。
這個html中包含很多圖片等其他元素,而這些元素是作為獨立的資原始檔儲存在網站中的,只是在html中引用它們。所以,在伺服器傳送響應包時,會在狀態行中寫入100。
瀏覽器在接收到響應包後,發現狀態碼為100,就會得知接收到的不是一個完整的資原始檔。
然後會根據命令自動向伺服器索要缺失的圖片檔案。
2.3【2XX】
最具特徵的是:200
作用:通知瀏覽器,本次返回的資原始檔是一個完整的獨立資原始檔。瀏覽器在接收到之後,不需要再索要其他關聯檔案。
2.4【3XX】
最具特徵的是:302
作用:通知瀏覽器,本次返回的不是一個資原始檔,而是一個資原始檔地址,需要瀏覽器根據這個地址自動發起請求。
如何實現:
response.sendRedirect("資原始檔地址"); ------> 【響應頭】location
這個行為會導致伺服器將302狀態碼寫入到狀態行。
演示:
新建一個網站MyWeb,新建一個Servlet介面實現類OneServlet,在該類中,重寫doGet方法
在該方法中,呼叫響應物件,將百度地址寫入響應頭中的【location】屬性。
package com.tsccg.controller; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @Author: TSCCG * @Date: 2021/08/16 16:59 */ public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String address = "http://www.baidu.com"; response.sendRedirect(address); } }
Tomcat在推送響應包之前,發現響應體中內容為空,但是響應頭的location中卻存放了一個地址,
Tomcat就會把302狀態碼寫入到響應包的狀態行中
釋出網站,開啟Tomcat伺服器,在瀏覽器中訪問OneServlet類,開啟F12,檢視網路:
瀏覽器在接收到響應包後,發現狀態碼為302,就不會讀取響應體中的內容。
會根據location中的地址發起第二次請求。
2.5【4XX】
2.5.1【404】
作用:通知瀏覽器,服務端沒有定位到被訪問的資原始檔,無法提供幫助。
2.5.2【405】
作用:通知瀏覽器,在服務端已經定位到被訪問的資原始檔【必須是Servlet】了,但是這個Servlet對於瀏覽器的【請求方式】無法處理。
就比如在Servlet介面實現類裡只重寫了doPost方法,這個類只能處理post方式的請求。
如果此時,在瀏覽器中通過get方式請求訪問這個Servlet介面實現類,這個類就無法處理這個請求。
Tomcat伺服器就會在響應包的狀態行裡寫入405。
2.6【5XX】
最具特徵的:500
作用:通知瀏覽器,在服務端已經定位到了被訪問的資原始檔【Servlet】。但是在Servlet處理當前請求時,由於Java異常而導致處理失敗。
演示:
新建一個網站MyWeb,新建一個Servlet介面實現類OneServlet,在該類中,重寫doGet方法
在該方法中,放入一個異常。
package com.tsccg.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: TSCCG
* @Date: 2021/08/16 17:41
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map map = new HashMap();
int num = (int)map.get("key1");//空指標異常,int型別無法儲存null
/*
修改方案:
Integer num2 = (Integer)map.get("key1");//所有引用型別都可以儲存null
response.getWriter().print(num2);
*/
}
}