spring的@ModelAttribute作用

spring的@ModelAttribute作用

最近好忙,几乎没有时间阅读和记录,主要是由于公司把项目由php开始转到java阵营了。这让从php起步的我来说,多少伴随着重新使用一门语言的陌生感。

不过,伴随着陌生感的,还有久违的新鲜感,我个人非常喜欢这种赶脚,仿佛重新找到了一片净土~~

废话不多说,忙里抽闲,记录一下这几天学习到的新姿势:@ModelAttribute注解

这个注解来自Spring,主要用于MVC中的Model对象(用于保存数据模型),从这个解释来看并不觉得有什么复杂的,但是貌似它的用法比较多,下面转载几个看到的例子~

例子1:注解返回类型为void的方法

  
  
  
  
@Controller   public class HelloWorldController {       @ModelAttribute         public void populateModel(@RequestParam String name, Model model) {          model.addAttribute("who", name);           }          @RequestMapping(value = "/helloWorld")          public String helloWorld() {                  return "helloWorld";          }    }

上面的代码,在获取请求/helloWorld后,populateModel方法会在helloWorld方法之前被调用,它把请求参数kazaff(/helloWorld?name=kazaff)赋值到model的名为who的键中,在它执行后,helloWorld方法才会被调用,返回的Model就是由@ModelAttribute注解的方法创建的。

这个例子纯粹用于演示@ModelAttribute,实际中我想没人会这么用~~

例子2:注解返回具体对象的方法

  
  
  
  
 @ModelAttribute    public Account addAccount(@RequestParam String name) {          return accountManager.findAccount(name);   }

这种用于主要用于和例子1进行比较,它直接返回的Account类型的对象会隐式的赋值给model对象的account键中,我个人感觉这一点其实并不那么实用。

例子3:带Value参数的注解返回具体对象的方法

  
  
  
  
@Controller  public class HelloWorldController {        @ModelAttribute("who")        public String addAccount(@RequestParam String name) {            return name;        }         @RequestMapping(value = "/helloWorld")      public String helloWorld() {             return "helloWorld";       }   }

这个例子应该没什么好说的了,大家推测也能得到结果!

上面的三个例子对@ModelAttribute的用法我个人觉得比较另类,被@ModelAttribute注解的方法会在此Controller中每个映射URL的方法执行之前被执行,可见灵活度太差。

例子4:@ModelAttribute和@RequestMapping同时注释一个方法

  
  
  
  
@Controller  public class HelloWorldController {          @RequestMapping(value = "/helloWorld")           @ModelAttribute("who")          public String helloWorld() {               return "kazaff";         } }

注意,这么写的话,helloWorld方法的返回值并不表示一个视图名称,而是表示model的一个键值,视图名称由RequestToViewNameTranslator根据请求的URL转换为逻辑视图名称,上例中为helloWorld

例子5:注解方法的参数

  
  
  
  
@Controller   public class HelloWorldController {       @ModelAttribute("user")         public User addAccount() {                return new User("kazaff","kazaff.me");        }          @RequestMapping(value = "/helloWorld")     public String helloWorld(@ModelAttribute("user") User user) {            return "helloWorld";         }   }

上例中,参数user的值来源于addAccount方法的返回值。

例子6:抽风用法

  
  
  
  
@Controller   public class HelloWorldController {        @RequestMapping(value = "/helloWorld")     public String helloWorld(@ModelAttribute User user) {          return "helloWorld";       }  }

这种用法是我最开始看到的,其实这种写法的话,完全可以省略掉这个注解!Spring可以直接把请求中携带的数据转换成User类型的对象。

你可能感兴趣的:(ModelAttribute)