Servlet-處理HTTP請求與響應
阿新 • • 發佈:2019-01-06
HttpServletRequest
HttpServletRequest 物件代表客戶端的請求,客戶端的所有訊息都封裝在這個物件中,通過這個方法可以獲取請求資料
作用:
- 讀取和寫入HTTP請求資料
- 取得和設定Cookies
- 取得路徑資訊
- 標識HTTP資訊
- 實現請求轉發
HttpServletResponse
HttpServletRequest 物件代表服務端提供給客戶端的響應,封裝了HTTP響應資料
作用:
- 設定對客戶端的輸出內容
- 設定響應的狀態碼
- 設定瀏覽器的解碼方式
- 設定Cookies
- 實現重定向
處理請求引數
例如:key-value、key-values
public ModelAndView getIps(HttpServletRequest request) {
String currPageStr = request.getParameter("page");
String values[] = request.getParameterValues("name");
}
請求方式
請求方式 | 作用 |
---|---|
GET | 請求指定資源 |
POST | 向指定的資源提交需要處理的資料 |
HEAD | 要求相應於相應的get一樣,只是沒有響應體 |
PUT | 上傳指定資源 |
DELETE | 刪除指定資源 |
請求方式是使用者請求的意向,利於伺服器做出不同的響應,因為不同請求方式:
- 資料傳輸可能不同
- 表單提交、服務端處理可能不同
- 瀏覽器會用不同處理快取方式等
GET 與 POST
GET:
- 直接將請求資源放在資源路徑的後面,只能提交少量資料
- 請求引數顯示在瀏覽器位址列上,不安全
POST:
- 提交需要處理的資料,可以導致新資源的產生和已有資源的更新
- 請求引數新增在實體內容中,可提交大量資料
- 不會將請求引數顯示在瀏覽器位址列,相對安全
處理中文引數
須統一設定為UTF-8,編碼和解碼不一致會產生亂碼
請求方式為POST
- step1 頁面指定字符集
JSP頁面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
html頁面:
<meta charset="UTF-8">
- step2 伺服器端編碼
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
請求方式為GET
- step1 頁面與post方式相同
- step2 服務端
//iso-8859-1 轉為 utf-8
String currPageStr = request.getParameter("page");
try {
currPageStr = new String(currPageStr.getBytes("iso-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
處理返回中文
服務端:
response.setContentType("text/html;charset=utf-8");
- 通知容器,使用指定字符集
- 生成訊息頭中content-type的值,通知瀏覽器返回的資料型別和字符集
Springmvc 編碼過濾器
- web.xml中可能需要編碼過濾器
<!-- 編碼過濾器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其bean實現:
CharacterEncodingFilter.doFilterInternal(HttpServletRequest request...){
//核心,為每次請求都設定所配置的字符集
request.setCharacterEncoding(this.encoding);
}
其他編碼問題
- 資料庫連線池,我這裡是mysql: useUnicode=true&characterEncoding=utf-8
data_source_url=jdbc:mysql://localhost:3306/just_test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true
- 資料庫編碼檢視
mysql> show variables like 'character_set_%';
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\baseRuntime\mysql\share\charsets\ |
+--------------------------+--------------------------------------+
8 rows in set (0.00 sec)
- 設定,如
mysql> SET character_set_client='utf-8';
mysql> SET character_set_connection='utf-8'
mysql> SET character_set_results='utf-8'