天天看點

Spring MVC 擷取請求參數

一、通過 Servlet API 擷取

将HttpServletRequest作為控制器方法的形參,HttpServletRequest 封裝了目前的請求封包對象。

例如:

@RequestMapping("/test")
public String testParam(HttpServletRequest request) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("username:" + username + ",password:" + password);
    return "index";
}
           

二、通過控制器方法的形參擷取請求參數

在控制器方法的形參位置設定和請求參數同名的形參,DispatcherServlet 會将請求參數指派給相應的形參。

例如:

@RequestMapping("/test")
public String testParam(String username, String password) {
    System.out.println("username:" + username + ",password:" + password);
    return "index";
}
           

若請求所傳輸的請求參數中有多個同名的請求參數,此時可以在控制器方法的形參中設定字元串 數組或者字元串類型的形參接收此請求參數

  • 若使用字元串數組類型的形參,此參數的數組中包含了每一個資料
  • 若使用字元串類型的形參,此參數的值為每個資料中間使用逗号拼接的結果

例子一:

@RequestMapping("/test")
public String testParam(String hobby) {
    System.out.println("hobby:" + hobby);
    return "index";
}
           

在浏覽器輸入

/test?hobby=a&hobby=b&hobby=c

可以得到輸出:hobby:a,b,c

例子二:

@RequestMapping("/test")
public String testParam(String[] hobby) {
    System.out.println("hobby:" + Arrays.toString(hobby));
    return "index";
}
           

在浏覽器輸入

/test?hobby=a&hobby=b&hobby=c

可以得到輸出:hobby:[a, b, c]

2.1 @RequestParam

@RequestParam 可将請求參數和控制器方法的形參建立映射關系。

假如我現在有個表單,收集使用者的使用者名和密碼,但在表單中對應的 input 标簽的 name 屬性值分别為

user_name

pwd

,而我目前的控制器方法如下:

@RequestMapping("/test")
public String testParam(String username, String password) {
    System.out.println("username:" + username + ",password:" + password);
    return "index";
}
           

我們通過這條 url 來模拟表單送出(好比是 method 為 GET 表單送出操作):

/test?user_name=admin&pwd=123

此時,顯然是拿不到請求參數

user_name

pwd

的值的。

如何使得 user_name 和 username 形參,pwd 和 password 形參形成一種對應關系呢?Spring MVC 提供了

@RequestParam

注解來解決這個問題。

對于上面的情況,将代碼修改如下:

@RequestMapping("/test")
public String testParam(@RequestParam("user_name") String username,
                        @RequestParam("pwd") String password) {
    System.out.println("username:" + username + ",password:" + password);
    return "index";
}
           

可以看到輸出了

username:admin,password:123

,成功拿到請求參數。

@RequestParam 一共有三個屬性:

  1. value

    :指定為形參指派的請求參數的參數名
  2. required

    :設定是否必須傳輸此請求參數,預設值為 true

    若設定為 true 時,則目前請求必須傳輸 value 所指定的請求參數,若沒有傳輸該請求參數,且沒有設定 defaultValue 屬性,則頁面報錯 400:Required String parameter ‘xxx’ is not present;若設定為 false,則目前請求不是必須傳輸value所指定的請求參數,若沒有傳輸,則注解所辨別的形參的值為 null

  3. defaultValue

    :不管 required 屬性值為 true 或 false,當 value 所指定的請求參數沒有傳輸或傳輸的值為

    ""

    時,則使用預設值為形參指派。

2.2 @RequestHeader

@RequestHeader 可将請求頭資訊和控制器方法的形參建立映射關系

例如下面的程式,将請求頭中的 Connection 頭與形參 connection 進行對應,可以通過 connection 拿到 Connection 請求頭的資訊:

@RequestMapping("/test")
public String testParam(@RequestHeader("Connection") String connection) {
    System.out.println("connection: " + connection); // connection: keep-alive
    return "index";
}
           

@RequestHeader 一共有三個屬性:value、required、defaultValue,用法同 @RequestParam

2.3 @CookieValue

@CookieValue 可将 cookie 資料和控制器方法的形參建立映射關系

Spring MVC 擷取請求參數

在浏覽器的 Cookies 中,我随便找了一個 Cookie,以名為

Pycharm-fe1fd83a

的 Cookie 為例:

@RequestMapping("/test")
public String testParam(@CookieValue("Pycharm-fe1fd83a") String var) {
    System.out.println("var: " + var); // var: bf5e5abc-a2b1-49cc-ae22-dec440870b81
    return "index";
}
           

可見,是可以拿到指定 Cookie 的資料的。

@CookieValue 一共有三個屬性:value、required、defaultValue,用法同 @RequestParam

2.4 通過 POJO 擷取請求參數

2.5 解決擷取請求參數時的亂碼問題