Spring MVC @ModelAttribute 详解

来源:互联网 发布:进出口贸易数据查询 编辑:程序博客网 时间:2024/05/21 10:01

SpringMVC中的@ModelAttribute将请求参数绑定到Model对象,一共具有如下三个作用:

①在方法参数上使用。绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑

定流程,而且自动暴露为模型数据用于视图页面展示时使用;

②在方法上使用。暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为

模型数据,用于视图页面展示时使用。

③暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用

对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping 注解的方法)之前,自动添加到模型对象中,

用于视图页面展示时使用;



一、在方法参数上使用@ModelAttribute注解

一个用在方法参数上的@ModelAttribute注解指示了参数应该从模型(这里所说的“模型”指 Model)中获取。如果模型中不存在,参数会首先被实例化,然后添加到模型中。一旦模型中存在,这个参数的字段会被所有的名字匹配的请求参数所填充。这在 Spring MVC 中叫做数据绑定,它能够把你从要对每一个字段进行类型转换的繁重体力劳动中解救出来,是非常有用的机制。

public String test1(@ModelAttribute("user") UserModel user)


只是此处多了一个注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。

如请求参数包含“?username=zhang&password=123&workInfo.city=bj”自动绑定到user 中的username属性、password属性以及workInfo属性的city属性中。

二、在方法上使用@ModelAttribute注解

用在方法上的@ModelAttribute指示那个方法的目的是添加一个或多个模型属性(model attributes)。@ModelArrtibute修饰方法都在同一个控制器中的@RequestMapping方法之前调用。这样的方法和@RequestMapping方法支持的参数类型相同,但是不能直接映射到请求。在控制器中的@ModelAttribute方法的调用时机是在同一个控制器中的@RequestMapping方法之前。

// 添加一个属性// 这个方法的返回值被添加到名为 “account” 的模型下// 你可以自定义这个名字,像这样 @ModelAttribute("myAccount")@ModelAttributepublic Account addAccount(@RequestParam String number) {
 return accountManager.findAccount(number); 
}// 添加多个属性@ModelAttributepublic void populateModel(@RequestParam String number, Model model) {    model.addAttribute(accountManager.findAccount(number));    // add more ...}

   @ModelAttribute方法用于构建带有常用属性的模型,比如用状态或者宠物类型填充一个下拉框,或者取回一个命令对象如 Account,把它用作 HTML 表单数据。后一种情况在下一节会进行更深入的讨论。

  注意,有两种形式的@ModelAttribute方法。第一种,方法通过返回属性来隐式地添加属性。第二种,方法接受一个Model参数,并把任何数量的属性添加给它。你可以根据需要选择其中的任何一种。

在不显式指定属性名的时候发生了什么?这种情况下,被赋值的模型属性的缺省名称是基于其类型的。比如,如果一个方法返回一个 Account 类型的对象的话,那么缺省名就是“account”。你可以通过注解@ModelAttribute的值来改变。如果直接添加属性到模型的话,请使用合适的方法 addAttribute(..) 的重载。

  注解@ModelAttribute也可以用在@RequestMapping方法上。这种情况下,@RequestMapping方法的返回值被拦截为一个模型属性,而不是一个视图名。


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

//@ModelAttribute修饰的方法都在同一个控制器中的@RequestMapping方法之前调用。//model属性名称就是value值,即"user",model属性对象就是方法的返回值@ModelAttribute("user")public User userModel(@RequestParam("loginname") String loginname,  @RequestParam("password") String password) {User user = new User();user.setLoginname(loginname);user.setPassword(password);return user;}//@ModelAttribute("user") User user 注释方法参数,参数user的值就是userModel方法中的model属性@RequestMapping(value="/login")public String login(@ModelAttribute("user") User user) {user.setUserName("管理员");return "login";}

四、在暴露表单引用对象为模型数据

Java代码  收藏代码
  1. /** 
  2.  * 设置这个注解之后可以直接在前端页面使用hb这个对象(List)集合 
  3.  * @return 
  4.  */  
  5. @ModelAttribute("hb")  
  6. public List<String> hobbiesList(){  
  7.     List<String> hobbise = new LinkedList<String>();  
  8.     hobbise.add("basketball");  
  9.     hobbise.add("football");  
  10.     hobbise.add("tennis");  
  11.     return hobbise;  
  12. }  

 

JSP页面展示出来

Java代码  收藏代码
  1. <br>  
  2. 初始化的数据 :    ${hb }  
  3. <br>  
  4.   
  5.     <c:forEach items="${hb}" var="hobby" varStatus="vs">  
  6.         <c:choose>  
  7.             <c:when test="${hobby == 'basketball'}">  
  8.             篮球<input type="checkbox" name="hobbies" value="basketball">  
  9.             </c:when>  
  10.             <c:when test="${hobby == 'football'}">  
  11.                 足球<input type="checkbox" name="hobbies" value="football">  
  12.             </c:when>  
  13.             <c:when test="${hobby == 'tennis'}">  
  14.                 网球<input type="checkbox" name="hobbies" value="tennis">  
  15.             </c:when>  
  16.         </c:choose>  
  17.     </c:forEach>  

 备注:

1、通过上面这种方式可以显示出一个集合的内容

2、上面的jsp代码使用的是JSTL,需要导入JSTL相关的jar包

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>



原创粉丝点击