1. 程式人生 > >Spring MVC整理系列(05)————Spring MVC配置解析及整合SpriSpring MVC之@ModelAttribute、@SessionAttributes以及Model的使用介紹

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的原因:
這裡寫圖片描述