@ModelAttribute註解在兩種地方可使用java
從這裏咱們能夠看到該註解能夠用在參數上也能夠用在方法體上。session
如今咱們就來說解這兩種方式。app
在方法定義上使用 @ModelAttribute 註解:Spring MVC
在調用目標處理方法前,會先逐個調用在方法級上標註了
@ModelAttribute 的方法函數
@ModelAttribute("user1") public User getUser() { User user = new User(); user.setId(1L); user.setName("jjjj"); user.setPassword("iiiii"); return user; } @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST}) public String doHello4(Map<String, Object> map) { System.out.println(map.get("user1")); return "success"; }
當咱們發出/hello4.do這個請求時,SpringMvc 在執行該請求前會先逐個調用在方法級上標註了
@ModelAttribute 的方法,而後將該模型參數放入doHello4()函數的Map參數中。測試
如上執行結果以下:spa
SpringMVC先從模型數據中獲取對象,再將請求參數綁定到對象中,再傳入形參,而且數據模型中的對象會被覆蓋code
@RequestMapping(value = "hello7") public ModelAndView doHello6( @ModelAttribute("user1") User user, ModelAndView modelAndView) { System.out.println(user + ":hello7"); modelAndView.setViewName("redirect:/hello/hello4.do"); return modelAndView; } @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST}) public String doHello4(Map<String, Object> map) { System.out.println(map.get("user1")); return "success"; } @ModelAttribute("user1") public User getUser() { User user = new User(); user.setId(1L); user.setName("jjjj"); user.setPassword("iiiii"); return user; }
測試結果以下:對象
發出的請求信息以下:get
http://localhost:8080/SSMProjectMaven/hello/hello7.do?id=5&name=Lilyio
咱們只傳入了id和name參數,可是在測試結果中咱們發現password也有值。
這說明了,SpringMVC會先在數據模型中尋找屬性user1,把user1的屬性賦值給user中,而後再將請求中的參數綁定到user中,若是請求參數中有的參數已經綁定到了user中,那麼請求參數會覆蓋掉user中已存在的值,而且user對象會被放入數據模型中覆蓋掉原來的user1對象。也就是模型數據中的user1的優先級低於請求參數。
@SessionAttributes只能使用在類定義上。
若但願在多個請求之間共用某個模型屬性數據,則能夠在
控制器類上標註一個 @SessionAttributes, Spring MVC
將在模型中對應的屬性暫存到 HttpSession 中。
• @SessionAttributes 除了能夠經過屬性名指定須要放到會
話中的屬性外,還能夠經過模型屬性的對象類型指定哪些
模型屬性須要放到會話中
– @SessionAttributes(types=User.class) 會將隱含模型中全部類型
爲 User.class 的屬性添加到會話中。
– @SessionAttributes(value={「user1」, 「user2」})
– @SessionAttributes(types={User.class, Dept.class})
– @SessionAttributes(value={「user1」, 「user2」},
types={Dept.class})
@Controller @RequestMapping("hello") @SessionAttributes(value = {"user1"}) public class HelloAction { @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST}) public String doHello4(Map<String, Object> map, HttpSession session) { System.out.println(map.get("user1")); System.out.println("session:" + session.getAttribute("user1")); return "success"; } @ModelAttribute("user1") public User getUser() { User user = new User(); user.setId(1L); user.setName("jjjj"); user.setPassword("iiiii"); return user; } }
SpringMVC會把數據模型中的user1對象放入session中,因此咱們在doHello4()中能夠在session中取到user1對象。
測試結果以下:
注意一下這種狀況:
@Controller @RequestMapping("hello") @SessionAttributes(value = {"user1", "msg"}) public class HelloAction { @RequestMapping(value = "hello7") public ModelAndView doHello6( @ModelAttribute("user1") User user, ModelAndView modelAndView) { modelAndView.addObject("msg", user.getId() + ":" + user.getName() + ":" + user.getPassword() + ":" + user.getCars()); System.out.println(user + ":hello7"); modelAndView.setViewName("redirect:/hello/hello4.do"); return modelAndView; } @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST}) public String doHello4(Map<String, Object> map, HttpSession session) { System.out.println(map.get("user1")); System.out.println("session:" + session.getAttribute("user1")); System.out.println(map.get("msg")); System.out.println("session:" + session.getAttribute("msg")); return "success"; } @ModelAttribute("user1") public User getUser() { User user = new User(); user.setId(1L); user.setName("jjjj"); user.setPassword("mmmmm"); return user; } }
測試結果以下:
這種狀況代表了ModelAndView裏的符合@SessionAttributes(value = {"user1", "msg"})這裏面定義的value值,那麼這個屬性也會被放入到Session對象裏。而且同時證實若是在一個方法裏帶有Map參數,SpringMVC不只會把標有@ModelAttribute註解的屬性放入Map中,也會把@SessionAttributes(value = {"user1", "msg"})中的屬性放入Map中。注意若是經過
session.setAttribute("xxx", "kkkk");
這種方法放入到session中的屬性是不會被放入到map中的。
如下這段代碼的測試證實了該結論:
@Controller @RequestMapping("hello") @SessionAttributes(value = {"user1", "msg"}) public class HelloAction { @RequestMapping(value = "hello4", method = {RequestMethod.GET, RequestMethod.POST}) public String doHello4(Map<String, Object> map, HttpSession session) { System.out.println(map.get("user1")); System.out.println("session:" + session.getAttribute("user1")); System.out.println(map.get("msg")); System.out.println("session:" + session.getAttribute("msg")); System.out.println("map:" + map.get("xxx")); System.out.println("session:" + session.getAttribute("xxx")); return "success"; } @RequestMapping(value = "hello7") public ModelAndView doHello6( @ModelAttribute("user1") User user, ModelAndView modelAndView, HttpSession session) { session.setAttribute("xxx", "kkkk"); modelAndView.addObject("msg", user.getId() + ":" + user.getName() + ":" + user.getPassword() + ":" + user.getCars()); System.out.println(user + ":hello7"); modelAndView.setViewName("redirect:/hello/hello4.do"); return modelAndView; } @ModelAttribute("user1") public User getUser() { User user = new User(); user.setId(1L); user.setName("jjjj"); user.setPassword("mmmmm"); return user; } }
測試結果以下:
咱們能夠看到從map裏取不出"xxx"的值,而從session裏咱們取出了「xxx」的值。
可是當咱們在
@SessionAttributes(value = {"user1", "msg", "xxx"})
這裏添加上「xxx」這個值,再執行上述代碼能夠看到map中取出了"xxx"的值。