一、通過 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 一共有三個屬性:
-
:指定為形參指派的請求參數的參數名value
-
required
:設定是否必須傳輸此請求參數,預設值為 true
若設定為 true 時,則目前請求必須傳輸 value 所指定的請求參數,若沒有傳輸該請求參數,且沒有設定 defaultValue 屬性,則頁面報錯 400:Required String parameter ‘xxx’ is not present;若設定為 false,則目前請求不是必須傳輸value所指定的請求參數,若沒有傳輸,則注解所辨別的形參的值為 null
-
:不管 required 屬性值為 true 或 false,當 value 所指定的請求參數沒有傳輸或傳輸的值為defaultValue
時,則使用預設值為形參指派。""
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 資料和控制器方法的形參建立映射關系
在浏覽器的 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