來源:http://blog.csdn.net/xiejx618/article/details/43638537###;
參考資料:spring-framework-reference的Using @ModelAttribute on a method和Using @ModelAttribute on a method argument
先看一個沒有使用@ModelAttribute的Controller方法.
- @RequestMapping("/save")
- public String save(User user) {
- user.setUsername("U love me");
- userService.save(user);
- return "result";
- }
執行此方法時會將key爲"user"(注意:這裏即使參數名稱是user1,key一樣還是"user"),value爲user的對象加入到model.在jsp頁面可以通過${user.id}和${user.name}得到值的,即上面方法和下面方法是相當的.
- @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);
- user.setUsername("U love me");
- userService.save(user);
- return "result";
- }
1.在方法上使用@ModelAttribute
- @ModelAttribute("user1")
- public User addUser(User user) {
- return new User(520,"I love U");
- }
2.在方法參數上使用@ModelAttribute.
- @RequestMapping("/save")
- public String save(@ModelAttribute User user) {
- user.setUsername("U love me");
- userService.save(user);
- return "result";
- }
使用了@ModelAttribute可修改這個key,不一定是"user",此情況下,用與不用@ModelAttribute沒有區別.
3.再來看看在方法和方法參數上結合使用@ModelAttribute,即上面兩步的兩個方法都添加UserController,如下:
- @ModelAttribute("user1")
- public User addUser(User user) {
- return new User(520,"I love U");
- }
- @RequestMapping("/save")
- public String save(@ModelAttribute User user) {
- user.setUsername("U love me");
- userService.save(user);
- return "result";
- }
再來個小小假設,將上面@ModelAttribute("user1")的user1改爲user,其它不變.雖然執行了addUser方法,那麼執行到save方法內,user對象的字段值還是來源於請求,最後返回到jsp頁面,model裏也只有一個User類型對象.
4.另類:
- @ModelAttribute
- @RequestMapping("/save")
- public String save(@ModelAttribute User user) {
- user.setUsername("U love me");
- userService.save(user);
- return "result";
- }
二.下面再看看結合@SessionAttributes的用法.
1.先看看這段代碼
- @Controller
- @RequestMapping("user")
- @SessionAttributes("test")
- public class UserController {
- @RequestMapping(value = "test1")
- public String test1(Map<String, Object> model, SessionStatus sessionStatus) {
- model.put("test","something");
- //sessionStatus.setComplete();
- return "user/list";
- }
- @RequestMapping(value = "test2")
- public String test2(Map<String,?> model) {
- Object test = model.get("test");
- System.out.println(test);
- return "user/list";
- }
- }
2.再看結合@ModelAttribute的用法.
- @Controller
- @RequestMapping("user")
- @SessionAttributes("test")
- public class UserController {
- @RequestMapping(value = "test1")
- public String test1(HttpServletRequest request) {
- User user = new User("xiejx618");
- request.getSession().setAttribute("test",user);
- return "user/list";
- }
- @RequestMapping(value = "test2")
- public String test2(@ModelAttribute("test") User user,SessionStatus sessionStatus) {
- System.out.println(user.getUsername());
- sessionStatus.setComplete();
- return "user/list";
- }
- }
我個人很少這樣用,用原始的寫法就清晰很多了,但要看明白別人寫的代碼。