SpringMVC-07-@ModelAttribute注解功能

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 注解同时应用在方法上时,有以下作用:

  1. 方法的返回值会存入到 Model 对象中,key 为 ModelAttribute 的 value 属性值。
  2. 方法的返回值不再是方法的访问路径,访问路径会变为 @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";
    }
}
下一篇:SpringMVC-08-类型转换器(Converter)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值