四、Servlet之請求與響應
Request & Response
HeetpServletResponse介面
來自於Servlet規範
介面位於tomcat的servlet-api.jar中。 HttpServletResponse介面實現類由Http伺服器提供,該介面負責將doXXX方法的執行結果寫到報文的實體體部分。這個介面實現物件也被叫做響應物件。
主要功能:
- 將執行結果以二進位制寫入響應體(響應報文的實體體)中
- 設定響應報文首部行中的[content-type]屬性值,從而控制瀏覽器採用對應的方式將二進位制解析為文字、圖片、命令
- 設定響應報文首部行中location屬性,將一個請求地址賦值給location。從而控制瀏覽器向指定伺服器再度傳送請求。
注意事項
1、tomcat中有一個連線響應報文的輸出流,通過響應物件,能拿到輸出流 通過輸出流,將結果以二進位制寫到響應體中,注意,這個輸出流不是response建立的,是借用的,不用關閉
2、在預設的情況下 content-type = “text” 瀏覽器把響應體內容當成文字去解析一定要在得到輸出流之前,通過響應物件對[content-type]進行一次重新賦值,用於指定瀏覽器的解析方式。
3、 預設情況下響應頭(首部行)中是沒有location屬性的,瀏覽器在接收到相應包之後,如果發現有locaiton屬性,就會自動對location地址發起GET請求,從而重定位到location。
後端工程師控制瀏覽器行為的方式:通過響應物件,將地址賦值給響應頭中的location屬性
HttpServletRequest介面
自於Servlet規範
在Tomcat中的servlet-api.jar。HttpServlet介面實現類由Http伺服器負責提供。這個介面實現類物件負責在doXXX方法執行時讀取Http請求協議包中資訊,因此它也被稱為請求物件
主要功能:
- 可以讀取Http請求協議包中,
- 可以讀取儲存在Http請求協議包中請求行資訊、請求頭、請求體中的資訊
- 可以代替瀏覽器向Http伺服器申請資原始檔呼叫
通過請求物件,讀取請求行中的url資訊
String url = request.getRequestURL().toString();
通過請求物件,讀取請求行中method資訊
String method = request.getMethod();
讀取uri資訊:資原始檔精準定位地址,在請求行中,並沒有uri屬性,uri是從url中擷取的一個字串,格式是:/網站名/資原始檔名。
String uri = getRequestURI();
將所有請求引數名稱儲存到一個列舉物件返回
Enumeration paramNames = getParameterNames();
while(paramNames.hasMoreElements()){
String paramName = (String)paramNames.nexElement();
System.out.println("請求引數:" +paramName);
}
根據引數名稱讀取引數的值,不管是引數在請求頭還是請求體
String value = request.getParameter(paramName);
一個問題:
以GET方式傳送中文請求引數內容,Http伺服器可以將其解釋為正確結果
以POST方式傳送中文請求引數內容,Http將其解釋為亂碼 why?
若瀏覽器以GET方式傳送請求,請求引數儲存在請求頭中,在Http請求協議包到達Http伺服器後,第一件事就是解碼,請求頭中的二進位制內容由Tomcat負責解碼,Tomcat9.0預設使用utf-8字符集,可以解釋一切國家的文字
以POST方式傳送請求,請求引數儲存在請求體中,請求體中的二進位制內容由當前的請求物件request解碼,它預設使用[ISO-8859-1]字符集無法解碼中文,只能得到亂碼。
解決方案在POST請求方式下,在讀取請求體內容之前,應該先通知請求物件的合適的字符集進行解碼,”哥們,你剛才理解錯了“
request.setCharacterEncoding(“utf-8”);
請求物件和響應物件他們的生命週期
1、建立:Tomcat接受到瀏覽器所傳送的Http請求協議包之後,自動為當前的Http請求協議包,生成一個請求物件,一個響應物件
假如Http請求協議包索要的是one—>OneServelt,Tomcat會new一個oneServlet物件,然後呼叫它的service方法,進而進一步呼叫doXXX方法。注意,此時請求物件和響應物件要作為實參傳遞到doXXX方法中。
因為在doXXX方法中,可能需要請求物件來獲取請求報文的資訊,也一定需要響應物件來寫入響應報文資訊doXXX方法執行完畢時,意味著本次的請求也處理完畢,此時在服務端會有一個響應協議包出現,tomcat推送其回至瀏覽器
2、銷燬 :在推回之前,tomcat會銷燬掉這兩個物件。
這兩個物件生命週期就是一次請求的處理週期。
請求物件相當於瀏覽器在服務端的嘴巴,跟伺服器“說”一些資訊
響應物件相當於瀏覽器在服務端的耳朵,從伺服器“聽”一些資訊