实体类如下:
public class User {
private String username;
private String password;
public User() {}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
// TODO 重写toString方法
}
@ModelAttribute无返回值
package com.mzs.article.controller;
import com.mzs.article.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/user")
public class UserController {
@ModelAttribute(name = "db")
public void init(@RequestParam(required = false) String id, Model model) {
User user = new User();
user.setId("1");
user.setUsername("tom");
user.setPassword("123");
model.addAttribute("user", user);
}
@RequestMapping(value = "/test")
public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "user") User user3) {
System.out.println(user);
System.out.println(user2);
System.out.println(user3);
User user4 = (User) model.asMap().get("user");
System.out.println(user4);
return "success";
}
}
结果输出如下:
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
可见,@ModelAttribute在参数中,表示从model里寻找并装配成对应的实体类。
而对于无返回值情况下,即使指定了@ModelAttribute的name,也只以model中添加的为准。
@ModelAttribute有返回值
package com.mzs.article.controller;
import com.mzs.article.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/user")
public class UserController {
@ModelAttribute
public User init(@RequestParam(required = false) String id) {
User user = new User();
user.setId("1");
user.setUsername("tom");
user.setPassword("123");
return user;
}
@RequestMapping(value = "/test")
public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "user") User user3) {
System.out.println(user);
System.out.println(user2);
System.out.println(user3);
User user4 = (User) model.asMap().get("user");
System.out.println(user4);
return "success";
}
}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
@ModelAttribute有返回值 且 指定了name
package com.mzs.article.controller;
import com.mzs.article.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/user")
public class UserController {
@ModelAttribute(name = "db")
public User init(@RequestParam(required = false) String id) {
User user = new User();
user.setId("1");
user.setUsername("tom");
user.setPassword("123");
return user;
}
@RequestMapping(value = "/test")
public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "user") User user3) {
System.out.println(user);
System.out.println(user2);
System.out.println(user3);
User user4 = (User) model.asMap().get("user");
System.out.println(user4);
return "success";
}
}
User{id='null', username='null', password='null'}
User{id='null', username='null', password='null'}
User{id='null', username='null', password='null'}
User{id='null', username='null', password='null'}
如果有返回值的情况下,以@ModelAttribute指定的name为准。
重新修改下:
package com.mzs.article.controller;
import com.mzs.article.pojo.User;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/user")
public class UserController {
@ModelAttribute(name = "db")
public User init(@RequestParam(required = false) String id) {
User user = new User();
user.setId("1");
user.setUsername("tom");
user.setPassword("123");
return user;
}
@RequestMapping(value = "/test")
public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "db") User user3) {
System.out.println(user);
System.out.println(user2);
System.out.println(user3);
User user4 = (User) model.asMap().get("db");
System.out.println(user4);
return "success";
}
}
User{id='null', username='null', password='null'}
User{id='null', username='null', password='null'}
User{id='1', username='tom', password='123'}
User{id='1', username='tom', password='123'}
@ModelAttribute与@RequestMapping联用
@ModelAttribute
@RequestMapping(value = "/test")
public String test(User user, @ModelAttribute User user2, Model model, @ModelAttribute(name = "user") User user3) {
System.out.println(user);
System.out.println(user2);
System.out.println(user3);
User user4 = (User) model.asMap().get("user");
System.out.println(user4);
return "success";
}
结果是404:
<h1>HTTP Status 404 - /WEB-INF/jsp/user/test.jsp</h1>
可见test被转换成了test.jsp,(是由RequestToViewNameFilter处理的)。