2.7 @ModelAttribute注解
-
用来将请求参数绑定到 Model模型对象
-
特性:模型对象pojo要先于 controller 方法之前创建,所以被 @ModelAttribute 注解的方法会在 Controller 每个方法执行之前都执行。因此一个 Controller 映射多个 URL 时,要谨慎使用。
-
@ModelAttribute 在Controller中的应用位置
- 应用在方法上
- 应用在方法的参数上
- 应用在方法上,并且方法也使用了 @RequestMapping
2.7.1 应用在方法上
- 无返回值
@Controller
public class ModelController {
@ModelAttribute
public void beforeMethod(@RequestParam(required = false) String username, Model model){
model.addAttribute("username",username);
}
@RequestMapping("/result")
protected String afterMethod(){
return "result";
}
}
- 地址栏输入地址回车后,Spring MVC 会先执行 beforeMethod 方法,将 username的值存入到 Model 中。然后执行 afterMethod方法,这样 name 的值就被带到了 model 方法中。也就是将封装model和返回view分开独立的方法进行
@RequestMapping("/result")
protected String afterMethod(@RequestParam(required = false) String username, Model model){
model.addAttribute("username",username);
return "result";
}
- 有返回值
/*有返回值*/
@ModelAttribute("username")
public String beforeMethod(@RequestParam(required = false) String username){
return username;
}
@RequestMapping("/result")
protected String afterMethod(){
return "result";
}
- 返回值对象 username 会被默认放到隐含的 Model 中,在 Model 中value 为返回的值, key 有两种情况:
1.ModelAttribute(“username”)中value属性有值时key为其属性值
1.ModelAttribute(“username”)中value属性没有值时,为返回值类型首字母小写。等同于
model.addAttribute("string", name);
。
2.7.2 应用在方法的参数上
- 注解在方法的参数上,调用方法时,模型的值会被注入。
- 这在实际使用将表单属性映射到模型对象。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
String username;
String pwd;
}
@Controller
@RequestMapping("/sys")
public class ModelController {
@RequestMapping("/login")
protected String afterMethod(@ModelAttribute("user")User user,Model model){
if ("zs".equals(user.getUsername())&&"123456".equals(user.getPwd())){
model.addAttribute("msg","验证ok");
}else {
model.addAttribute("msg","验证false");
}
return "result";
}
}
- index.jsp
<form action="/sys/login" method="post">
<input type="text" name="username" placeholder="login">
<input type="text" name="pwd" placeholder="login">
<input type="submit" value="提交">
</form>
@ModelAttribute(“user”)User user,Model model有3个作用
- 将请求参数封装到 user 对象中
- 创建 User 实例
- 以指定了key的“user”为键值存储在 Model 对象中,和“model.addAttribute(“user”,user)”语句的功能一样。没有指定key时以User user中User类型user为kay
2.7.3 应用在方法的参数上,并且方法也使用了 @RequestMapping
@Controller
//@RequestMapping("/sys")
public class ModelController {
@RequestMapping("/result")
@ModelAttribute("msg")
protected String afterMethod(@RequestParam(required = false) String username){
return username;
}
}
@ModelAttribute 和 @RequestMapping 注解同时应用在方法上时,有以下作用:
- 方法的返回值会存入到 Model 对象中,key 为 ModelAttribute 的 value 属性值。
- 方法的返回值不再是方法的访问路径,访问路径会变为 @RequestMapping 的 value 值,例如:@RequestMapping(value = “/index”) 跳转的页面是 index.jsp 页面。
注意:不能加类请求路径
2.7.4 作用
-
控制登录权限,例如拦截器、过滤器等。
-
也可以用此注解,利用先执行 @ModelAttribute注解的方法进行权限验证,用子类中的任意请求即可测试
public class BaseController {
@ModelAttribute
public void isLogin(HttpSession session) throws Exception {
if (session.getAttribute("user") == null) {
throw new Exception("没有权限");
}
}
}
@RequestMapping("/user")
public class ModelAttributeController extends BaseController {
@RequestMapping("/add")
public String add() {
return "addSuccess";
}
@RequestMapping("/update")
public String update() {
return "updateSuccess";
}
}