Spring MVC整理系列(05)————Spring MVC配置解析及整合SpriSpring MVC之@ModelAttribute、@SessionAttributes以及Model的使用介紹
1、Model:儲存資料的作用域物件,相當於request
向model中新增資料,方式一,通過addAttribute方法:
@RequestMapping("/save")
public String save(Model model,int id,String username) {
User user=new User();
//這裡是通過反射從request裡面拿值再set到user
user.setId(id);
user.setUsername(username);
model.addAttribute("user" ,user);
return "result";
}
向model中新增資料,方式二,通過@ModelAttribute註解的方式
2、@ModelAttribute:作用於方法或引數上的註解,把資料或物件新增進Model物件
作用於方法上:向model中set值。
在一個到達的request中,任何被@ModelAttribute註解的方法都會在controller handler method之前呼叫,返回值作為資料被新增進model物件中
//如果@ModelAttribute()未指定key,則key預設為方法返回型別名稱的首字母小寫形式
@ModelAttribute("userKey" )
public User getUser(){
User u =new User();
p.setName("小明");
return u;
}
@RequestMapping("/save")
public String save(Model model) {
//後臺使用model中的資料
User user = model.asMap().get("userKey");//拿到name為小明的user物件
return "result";
}
//前臺使用model中資料的方式:
var userName = ${userKey.name};
作用於引數上:從model中get值並繫結到引數上。
通過名稱對應,把model物件中相應的屬性值繫結到註解的引數上,如果model物件中沒有此屬性,則把request中按名稱對應的方式把值繫結到引數上
前臺傳送一個請求:http://localhost/web/test?testId=123456789
@ModelAttribute("testId")
public String getTestId(){
return "987654321";
}
@RequestMapping("/test")
public String test(@ModelAttribute("testId") String testId) {
//輸出 987654321,如果沒有上面的getTestId方法,model物件中也就沒有testId屬性,則使用request中的testId屬性值
System.out.println(testId);
return "result";
}
3、@SessionAttributes:作用於Controller類,讓Controller所有方法共享Model物件中一個或多個屬性
再解釋明白一點:就是原來model中有一個屬性testId,現在在Controller上添加註解@SessionAttributes(“testId”),則所有方法都可以通過model獲取該testId屬性值
@Controller
@SessionAttributes("testId")
public class TestController{
@ModelAttribute("testId")
public String getTestId(){
return "987654321";
}
@RequestMapping("/test")
public String test(Model model) {
String testId = model.asMap().get("testId");
System.out.println(testId);//輸出 987654321
return "result";
}
}
@SessionAttributes有兩個屬性,value和type,用於指定key和資料型別,可以多值
@SessionAttributes(types = {User.class,Dept.class},value={“attr1”,”attr2”})
當需要清除通過@SessionAttributes向session當中新增的值得時候,我們只需要在controller的方法中傳入一個SessionStatus的型別物件 通過呼叫setComplete方法就可以清除了。
@RequestMapping("/test")
public String test(SessionStatus status) {
status.setComplete();
return "result";
}
ps:關於ModelAttribute、SessionAttributes與RequestScope、SessionScope的關係,可以參看
理解Spring MVC Model Attribute 和 Session Attribute
,總結就是資料先被儲存到model中,然後再拷貝到requestScope中,如果使用了@SessionAttributes註解,同時相應屬性被拷貝到sessionScope中。
另外,文中也說了一下關於使用model而不是直接使用request的原因: