java Servlet結構概述3之請求響應1

漫漫想想發表於2020-10-28

Servlet最主要的作用是處理客戶端的請求,並向客戶端做出響應。
jsp也可以處理客戶端的請求,那麼jsp和Servlet有什麼關係捏,留在闡述完生命週期後再來講述這兩者的關係以及MVC模式
我們知道Service()方法中有兩個引數HttpServletRequest request以及HttpServletRespone response,那麼他們的作用是什麼?
每次針對Servlet的請求,web伺服器都在呼叫Service方法之前建立兩個物件,分別即是以上HttpServletRequest以及HttpServletRespone ,其中前者封裝HTTP請求訊息,簡稱request物件;後者封裝HTTP響應訊息,簡稱response訊息。在這裡插入圖片描述
從圖中可以看出呼叫一次Servlet就會建立兩個物件,但是每個Servlet卻只有一個例項物件。
這裡也就可以直到為什麼init()初始化方法只執行一次。

關於響應物件response有幾個地方需要了解
解決中文輸出亂碼的問題

public void doGet(HttpServletRequest request,HttpServletRespone  response){
String china=“中國”;
PrintWriter out=response.getWriter();
put.println(china);
}

訪問含有這個doGet()方法的Servlet會出現亂碼,為什麼捏?
在這裡插入圖片描述
這裡就是response物件在封裝響應訊息時候,對字元輸出流編碼時採用的iso-8859-1的字元碼錶,但是這個字元碼錶並不相容中文。會將“中國”這兩個字元編碼為63 63(對於在iso-8859-1字元碼錶中查詢不到的字元統一編碼63)當瀏覽器在對接收到的響應訊息解碼時,採用的GB2312,於是乎就出現亂碼了。
所以這就有了

 `response.setCharacterEncoding("utf-8");`

在這裡插入圖片描述
但是這樣也只是解決了響應訊息的編碼,瀏覽器的解碼方式依然是GB2312.,根據響應訊息的編碼數字在瀏覽器預設的字元碼錶中找到的內容依然是與響應訊息不同
所以我們應該設定HttpServletResponse使用utf-8編碼
也應該通知瀏覽器用utf-8解碼

 response.setCharacterEncoding("utf-8");`//設定HttpServletResponse使用utf-8編碼
 response.setHeader("Content-Type","text/html;charset=utf-8");//通知瀏覽器用utf-8解碼

上面的內容是否和jsp頁面上有似曾相識的感覺
jsp頁面處理表單post方法提交的資料時
只不過那時我們使用的是 request,setCharacterEncoding(“utf-8”);
jsp的page指令中<%@page contentType=“text/html;chatset=utf-8”%>

當然實際上不可能這麼複雜,和jsp的page指令相似我們可以直接用

response.setContentType("text/html;charset=utf-8");

網頁定時重新整理跳轉

response.setHeader("refresh","3");
resposne.setHeader("refresh","3,url=another.jsp");

請求重定向
response.sendRedirct(java.lang.String location);
關於請求物件request有幾個地方需要了解
request.getParameter(“name”);
request.getParameterValues(“name”);
轉發

RequestDispatcher getDispatcher(String path)
RequestDispatcher dis=request.getDispatcher("path");
dis.forward(request,response);

在jsp中

<jsp:forward page="url">

相關文章