@RequestParam
作用
把請求中指定名稱的參數給控制器中的形參賦值。
屬性
value:請求參數中的名稱。
required:請求參數中是否必須提供此參數。默認值:true。表示必須提供,如果不提供將報錯。
案例
有一個jsp頁面:
<html>
<head>
<title>註解</title>
</head>
<body>
<!--訪問anno/requestParam,傳入參數username=zhangsan-->
<a href="anno/requestParam?username=zhangsan">RequestParam</a>
</body>
</html>
在AnnoController 類中有一個方法testRequestParam爲上面鏈接對應的訪問方法,但是參數是names:
@Controller
@RequestMapping("/anno")
public class AnnoController {
@RequestMapping("requestParam")
public String testRequestParam(String names){
System.out.println("testRequestParam方法執行。。");
System.out.println(name);
return "success";
}
}
訪問該鏈接會由於username與testRequestParam中的形參names不匹配而報錯,此時可以使用 @RequestParam 註解把請求中username的參數給控制器中的形參names賦值:
@Controller
@RequestMapping("/anno")
public class AnnoController {
@RequestMapping("requestParam")
public String testRequestParam(@RequestParam(name = "username") String names){
System.out.println("testRequestParam方法執行。。");
System.out.println(names);
return "success";
}
}
@RequestBody
作用
用於獲取請求體內容。直接使用得到是key=value&key=value…結構的數據。
注意: get請求方式不適用(get請求沒有請求頭,封裝在了url)。
屬性
required:是否必須有請求體。默認值是:true。當取值爲true時,get請求方式會報錯。如果取值爲false,get請求得到是null。
案例
發起一起請求:
<form action="anno/requestBody" method="post">
用戶姓名:<input type="text" name="username">
用戶年齡:<input type="text" name="age">
<input type="submit" value="提交">
</form>
對應的方法:
// 獲取到請求體的內容
@RequestMapping("requestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("testRequestBody方法執行。。");
System.out.println(body);
return "success";
}
輸入:
控制檯輸出:
testRequestBody方法執行。。
username=%E5%BC%A0%E4%B8%89&age=23
@PathVaribale
作用
用於綁定url中的佔位符。例如:請求url中 /delete/{id},這個{id}就是url佔位符。 url支持佔位符是spring3.0之後加入的。是springmvc支持restful風格URL的一個重要標誌。
屬性
value:用於指定url中佔位符名稱。 required:是否必須提供佔位符。
案例
jsp代碼:
<!-- PathVariable註解 -->
<a href="springmvc/usePathVariable/100">pathVariable註解</a>
控制器代碼:
@RequestMapping("/usePathVariable/{id}")
public String usePathVariable(@PathVariable("id") Integer id){
System.out.println(id);
return "success";
}
輸出:100
@RequestHeader
作用
用於獲取請求消息頭。
屬性
value:提供消息頭名稱 required:是否必須有此消息頭
注: 在實際開發中一般不怎麼用。、
@CookieValue
作用
用於把指定cookie名稱的值傳入控制器方法參數。
屬性
value:指定cookie的名稱。
required:是否必須有此cookie。
案例
jsp中的代碼:
<!-- CookieValue註解 -->
<a href="springmvc/useCookieValue">綁定cookie的值</a>
控制器中的代碼:
@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false) String cookieValue){
System.out.println(cookieValue);
return "success";
}
@ModelAttribute
作用
該註解是SpringMVC4.3版本以後新加入的。它可以用於修飾方法和參數。
出現在方法上,表示當前方法會在控制器的方法執行之前,先執行。
它可以修飾沒有返回值的方法,也可以修飾有具體返回值的方法。
出現在參數上,獲取指定的數據給參數賦值。
屬性
value:用於獲取數據的key。
key可以是POJO的屬性名稱,也可以是map結構的key。
應用場景
當表單提交數據不是完整的實體類數據時,保證沒有提交數據的字段使用數據庫對象原來的數據。
例如:
我們在編輯一個用戶時,用戶有一個創建信息字段,該字段的值是不允許被修改的。在提交表單數據是肯定沒有此字段的內容,一旦更新會把該字段內容置爲null,此時就可以使用此註解解決問題。
案例1:當前方法會在控制器的方法執行之前,先執行
jsp中:
<form action="anno/testModelAttribute" method="post">
用戶姓名:<input type="text" name="username"><br>
用戶年齡:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
控制器中:
@RequestMapping("testModelAttribute")
public String testModelAttribute(){
System.out.println("testModelAttribute方法執行。。");
return "success";
}
@ModelAttribute
public void showUser(){
System.out.println("showUser方法執行了");
}
測試的時候,由於showUser方法上有註解@ModelAttribute,因此會在調用到testModelAttribute方法之前先執行showUser方法。
案例2:當表單提交數據不是完整的實體類數據時,保證沒有提交數據的字段使用數據庫對象原來的數據。
User對象有三個屬性:
public class User implements Serializable {
private String uname;
private Integer age;
private Date date;
jsp中表單隻包含2個屬性:
<form action="anno/testModelAttribute" method="post">
用戶姓名:<input type="text" name="uname"><br>
用戶年齡:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
控制器:
@RequestMapping("testModelAttribute")
public String testModelAttribute(User user){
System.out.println("testModelAttribute方法執行。。");
System.out.println(user);
return "success";
}
//該方法先執行
@ModelAttribute
public User showUser(String uname){
System.out.println("showUser方法執行了");
//通過uname查數據庫,假設查詢到的User是:
User user = new User();
user.setAge(20);
user.setUname(uname);
//假設是數據庫查詢到的結果
user.setDate(new Date());
return user;
}
提交表單:
雖然提交的沒有生日,但是還是從數據庫中查詢出原來的生日進行填充:
showUser方法執行了
testModelAttribute方法執行。。
User{uname=‘張三’, age=23, date=Thu May 11 22:39:46 CST 2020}
@SessionAttributes
作用
用於多次執行控制器方法間的參數共享。
屬性
value:用於指定存入的屬性名稱
type:用於指定存入的數據類型。
案例
jsp頁面與兩條超鏈接:
<a href="anno/testSessionAttributes">SessionAttribute</a>
<a href="anno/getSessionAttributes">getSessionAttribute</a>
對應的控制器:
@Controller
@RequestMapping("/anno")
@SessionAttributes(value = {"msg"}) //把msg存入到session域對象
public class AnnoController {
//SessionAttributes註解
@RequestMapping("testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("testSessionAttributes方法執行。。");
//會存儲到Request域對象
model.addAttribute("msg","你好");
return "success";
}
//從Session域中獲取值
@RequestMapping("getSessionAttributes")
public String getSessionAttributes(ModelMap model){
System.out.println("getSessionAttributes方法執行。。");
String msg = (String) model.get("msg");
System.out.println(msg);
return "success";
}
}
點擊第一個超鏈接將會調用testSessionAttributes方法,其中有一個Model對象會存儲鍵值對到request域。由於類上有註解@SessionAttributes(value = {“msg”}),會把鍵值對存到session域中。然後點擊點兒個超連接,調用getSessionAttributes方法,其中ModelMap是Model的實現類,其中的get方法可以從session於中獲取鍵值對,實現方法之間的數據共享。