1. 程式人生 > >Servlet-處理HTTP請求與響應

Servlet-處理HTTP請求與響應

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'