天天看点

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类型的对象。

继续阅读