SpringMVC-07-@ModelAttribute注解功能

在人生的道路上,不管是潇洒走一回,或者是千山独行,皆须是自己想走的路,虽然,有的人并不是很快就能找到自己的方向和道路,不过,只要坚持到底,我相信,就一定可以找到自己的路,只要找到路,就不必怕路途遥远了。

导读:本篇文章讲解 SpringMVC-07-@ModelAttribute注解功能,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123895.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!