1. 程式人生 > >SpringMvc @SessionAttributes與@SessionAttribute及@ModelAttribute

SpringMvc @SessionAttributes與@SessionAttribute及@ModelAttribute

[email protected](加在類上面的註解)

將模型中的某個屬性值暫存到HttpSession中,以便多個請求之間可以共享這個屬性

value:通過指定key將model中的資料存在session域中

types:將model中指定型別的額資料存在session域中

@Controller
//把model當中key為name的存在了session當中
@SessionAttributes("name")
public class MyController {
    @RequestMapping("/testsession")
    public String etstsession(Model model){
        //把資料存到了request域
        model.addAttribute("name","dell");
        return "/result2.jsp";
    }
}
@Controller
//把model當中String型別的屬性都存在了session當中
@SessionAttributes(types=String.class)
public class MyController {
    @RequestMapping("/testsession")
    public String etstsession(Model model){
        //把資料存到了request域
        model.addAttribute("name","dell");
        return "/result2.jsp";
    }
}

 
[email protected]

使用SessionAttribute來訪問預先存在的全域性會話屬性,註解標記在處理器對映方法上來獲取引數

假設提前在session域中存了key值為name的鍵值對             如若沒有,伺服器會報錯

 @RequestMapping("testsession2")
    public String testsession2(@SessionAttribute("name") String name){
        System.out.println(name);
        return "/result2.jsp";
    }

[email protected]

@modelAttribute修飾引數

可以指定一個類的實體存到model中的key值,如果不指定,則預設是將類名的第一個字母小寫作為key值

@RequestMapping("/testModelAttribute")
    //會自動的把對應的模型存放在model當中
    public String testModelAttribute(@ModelAttribute("GOODS") Goods mygoods, Model model){
        System.out.println(mygoods);
        System.out.println(model.asMap());
        return "/result3.jsp";
    }
/*
*Goods{name='aa', price=20}
*{GOODS=Goods{name='aa', price=20}
*/

@modelAttribute修飾方法

被@modelAttribute標記的方法會在requestmapping對應對映方法之前被執行,

並且會把對映方法中的model先傳到該方法中供其先設定部分引數   

如果有key值相同,則會被覆蓋

@ModelAttribute
    public void testModelAttribute(Model model){
        System.out.println("ModelAttribute被執行");
        model.addAttribute("sex","male");
    }

    @RequestMapping("/testModelAttribute")
    //會自動的把對應的模型存放在model當中
    public String testModelAttribute(@ModelAttribute("GOODS") Goods mygoods, Model model){
        System.out.println(mygoods);
        System.out.println(model.asMap());
        return "/result3.jsp";
    }
/*
*ModelAttribute被執行
*Goods{name='aaa', price=20}
*{sex=male, GOODS=Goods{name='aaa', price=20},
*/
 @ModelAttribute
    public void testModelAttribute(Model model){
        System.out.println("ModelAttribute被執行");
        model.addAttribute("sex","male");
    }

    @RequestMapping("/testModelAttribute")
    //會自動的把對應的模型存放在model當中
    public String testModelAttribute(@ModelAttribute("GOODS") Goods mygoods, Model model){
        model.addAttribute("sex","female");
        System.out.println(mygoods);
        System.out.println(model.asMap());
        return "/result3.jsp";
    }
//key為sex的鍵值對屬性male被覆蓋為female
/*
*ModelAttribute被執行
*Goods{name='aaa', price=20}
*{sex=female, GOODS=Goods{name='aaa', price=20}
*/

注意點:在往被@ModelAttribute標記的方法中傳入的model時,session中的資料也會被先傳入到model中