zoukankan      html  css  js  c++  java
  • (七)springmvc之ModelAttribute注解

    一、没有使用@ModelAttribute的Controller方法.

        @RequestMapping("/save")  
        public String save(User user) {  
            user.setUsername("U love me");  
            userService.save(user);  
            return "result";  
        }  
    • 其中User包含id和username两个私有属性,含有公共setter和getter方法.
      执行此方法时会将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";  
          }  

    二、在方法上使用@ModelAttribute

        @ModelAttribute("user1")  
        public User addUser(User user) {  
            return new User(520,"I love U");  
        }  
    • 执行UserController内带有@RequestMapping的方法之前,都会先执行此addUser方法.并且执行addUser过程中会添加两个对象到model,先将key为"user"的对象(由addUser方法的User user引起的),再添加key为"user1"的对象(由注解@ModelAttribute("user1")引起的).这样model中就有两个User的对象,一个对象名为user1值为new User(520,"I love U"),另一个对象名为“user”(形参对象类型首字母小写)值为jsp页面传过来的值set到user中。

    三、在方法参数上使用@ModelAttribute

        @RequestMapping("/save")  
        public String save(@ModelAttribute User user) {  
            user.setUsername("U love me");  
            userService.save(user);  
            return "result";  
        }  
    • 此方法会先从model去获取key为"user"的对象,如果获取不到会通过反射实例化一个User对象,再从request里面拿值set到这个对象,然后把这个User对象添加到model(其中key为"user").
      使用了@ModelAttribute可修改这个key,不一定是"user",此情况下,用与不用@ModelAttribute没有区别.

    四、在方法和方法参数上结合使用@ModelAttribute

        @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";  
        }  
    • 假设要执行保存用户操作,根据一分析可知,先执行完会产生两个User类型的对象(一个key是"user",另一个key是"user1")添加到model,再执行save方法,此时会先从model去找key为"user"的对象,能找到再从request取值set到这个User对象.最后返回到jsp页面,model里也只有两个User类型对象.
      再来个小小假设,将上面@ModelAttribute("user1")的user1改为user,其它不变.虽然执行了addUser方法,那么执行到save方法内,user对象的字段值还是来源于请求,最后返回到jsp页面,model里也只有一个User类型对象

    五、另类

        @ModelAttribute  
        @RequestMapping("/save")  
        public String save(@ModelAttribute User user) {  
            user.setUsername("U love me");  
            userService.save(user);  
            return "result";  
        }  
    • 此种情况,会添加一个key为"user"的User对象到model,还会添加一个key为"string",value为"result"的对象到model,而视图名称则变为了"save"而不是"result".相信一般开发者都不会这样用.
  • 相关阅读:
    【赛前集训】20190902
    【2019csp模拟】树上相交路径
    如何给网站添加SSL证书(西部数码)?
    如何将页面blob类型的视频链接下载下来?
    VUE笔记:运行Vue报错error in ./*xxxxx&lang=scss Syntax Error: TypeError: this.getOptions is not a function
    VUE笔记:Failed to resolve loader: sass-loader
    VUE笔记:VScode(英文版)快速生成VUE模板的设置
    VUE笔记:运行VUE报错 Node Sass version 6.0.1 is incompatible with ^4.0.0.
    VUE笔记:yarn add sass-loader node-sass -dev
    Excel多条件求和:SUM和SUMIFS的综合使用
  • 原文地址:https://www.cnblogs.com/shyroke/p/7777849.html
Copyright © 2011-2022 走看看