Loading

Spring MVC 处理模型数据(@ModelAttribute)

SpringMVC中的模型数据是非常重要的,因为MVC中的控制(C)请求处理业务逻辑来生成数据模型(M),而视图(V)就是为了渲染数据模型的数据。

直白来讲,上面这句话的意思就是:当有一个查询的请求,控制器(C)会把请求拦截下来,然后把根据请求的内容对它进行分配适合的处理方法,在处理方法上进行处理查询的业务逻辑,得到了数据,再把数据封装成数据模型对象,最后把数据模型(M)对象传给了视图(V),让视图去渲染数据模型。
 
-----以下内容来自《Spring3.0就这么简单》
我们知道SpringMVC通过@RequestMapping将请求引导到处理方法上,使用适合的方法签名(@RequestParam/@PathVariable等)将请求消息绑定到入参中(入参:方法的参数)。方法入参绑定请求消息只是处理方法第一步,还有更为重要的任务等待完成,即根据入参执行相应的逻辑,产生模型数据,导向到特定视图。
 
 
如何将模型数据输出给视图是SpringMVC框架的一项重要工作,SpringMVC提供了以下几种途径输出模型数据:
  • ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。
  • @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。
  • Map及Model:入参为org.springframework.ui.Model、org.springframework.uiModelMap或java.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中。
  • @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性。
 
在这里只讲解@ModelAttribute的使用和理解:
@ModelAttribute相当于是什么?
自己的理解:
        我觉得@ModelAttribute其实相当于我们自己手动操作封装对象的过程,比如说:在Servlet中,本来是要我们自己从request中获取请求参数,然后进行封装成对象,根据这个封装好的对象进行业务逻辑操作,最终从Dao层获取到返回的数据,我们再把这些数据封装成对象,返回给视图jsp。视图jsp就可以使用el表达式等方式直接调用。@ModelAttribute就是解决了我们自己手动操作封装对象、传递对象给视图的操作
 
@ModelAttribute放置的位置不同也有不同的功能。那么@ModelAttribute可以放置在哪些位置呢?如下:
  • 可以在方法入参上使用@ModelAttribute注解
  • 还可以在方法定义中使用@ModelAttribute注解
  1. 放在方法入参上使用:
//UserController.java在方法入参处使用@ModelAttribute
@RequestMapping(value="/model")
public String handleModel(@ModelAttribute("user") User user){
    user.setUserId("1000");
    return "/user/createSuccess";
}
SpringMVC 将请求消息绑定到User对象中,然后再以“user”为键将User对象放到模型中。
在准备对视图进行渲染前,SpringMVC还会进一步将模型中的数据转储到视图的上下文中以暴露给视图对象。
对于JSP视图来说,SpringMVC会将模型数据转储到ServletRequest的属性列表中(即通过ServletRequest#setAttribute(String name,Object o )保存)。
handleModel()返回的逻辑视图名为 /user/createSuccess,对应createSuccess.jsp视图对象,这样createSuccess.jsp就可以使用${user.userName}等方式顺利访问到模型中的数据了。
 
   2.  在方法定义中使用@ModelAttribute注解:
除了可以在方法入参上使用@ModelAttribute注解,还可以在方法定义中使用@ModelAttribute注解。SpringMVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute的方法,并将这些方法的返回值添加到模型中。如下:
@ModelAttribute("user")
public User getUser(){          <---1//访问UserController中的任何一个请求处理方法前,
    User user = new User();         //SpringMVC先执行该方法,并将返回值以user为键添加到模型中 
    user.setUserId("1001");
    return user;
}
@RequestMapping(value="/model")
public String handleModel(@ModelAttribute("user") User user){     <---2 //在此,模型数据会赋给User的入参,
    user.setUserName("tom");                                           //然后再根据HTTP请求消息进一步填充覆盖user对象
    return "/user/showUser";
}
当访问UserController中的任何一个请求处理方法前,都会事先执行标注了@ModelAttribute的getUser()方法,并将其返回值以user为键添加到模型中。
由于 ② 处的handleModel()方法使用了入参级的@ModelAttribute注解,且属性名和 ① 处方法级@ModelAttribute的属性名相同。这时,SpringMVC会将 ① 处获取的模型属性先赋值给 ② 处的人参user,然后再根据HTTP请求消息对user进行填充覆盖,得到一个整合版本的user对象。
 
提示: 处理方法入参最多只能使用一个SpringMVC的注解,如 handleModel (@ModelAttribute("user") User user)的user入参使用了@ModelAttribute,就不能再使用@RequestParam或@CookieValue。如果使用了两个注解,SpringMVC就跑出异常。 
 
注:由于参考网上内容太多,忘记了出处...如有侵权请告知,Email: JamKong@126.com

SpringMVC中的模型数据是非常重要的,因为MVC中的控制(C)请求处理业务逻辑来生成数据模型(M),而视图(V)就是为了渲染数据模型的数据。

直白来讲,上面这句话的意思就是:当有一个查询的请求,控制器(C)会把请求拦截下来,然后把根据请求的内容对它进行分配适合的处理方法,在处理方法上进行处理查询的业务逻辑,得到了数据,再把数据封装成数据模型对象,最后把数据模型(M)对象传给了视图(V),让视图去渲染数据模型。
 
-----以下内容来自《Spring3.0就这么简单》
我们知道SpringMVC通过@RequestMapping将请求引导到处理方法上,使用适合的方法签名(@RequestParam/@PathVariable等)将请求消息绑定到入参中(入参:方法的参数)。方法入参绑定请求消息只是处理方法第一步,还有更为重要的任务等待完成,即根据入参执行相应的逻辑,产生模型数据,导向到特定视图。
 
 
如何将模型数据输出给视图是SpringMVC框架的一项重要工作,SpringMVC提供了以下几种途径输出模型数据:
  • ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。
  • @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。
  • Map及Model:入参为org.springframework.ui.Model、org.springframework.uiModelMap或java.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中。
  • @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性。
 
在这里只讲解@ModelAttribute的使用和理解:
@ModelAttribute相当于是什么?
自己的理解:
        我觉得@ModelAttribute其实相当于我们自己手动操作封装对象的过程,比如说:在Servlet中,本来是要我们自己从request中获取请求参数,然后进行封装成对象,根据这个封装好的对象进行业务逻辑操作,最终从Dao层获取到返回的数据,我们再把这些数据封装成对象,返回给视图jsp。视图jsp就可以使用el表达式等方式直接调用。@ModelAttribute就是解决了我们自己手动操作封装对象、传递对象给视图的操作
 
@ModelAttribute放置的位置不同也有不同的功能。那么@ModelAttribute可以放置在哪些位置呢?如下:
  • 可以在方法入参上使用@ModelAttribute注解
  • 还可以在方法定义中使用@ModelAttribute注解
  1. 放在方法入参上使用:
//UserController.java在方法入参处使用@ModelAttribute
@RequestMapping(value="/model")
publicString handleModel(@ModelAttribute("user")User user){
user.setUserId("1000");
return"/user/createSuccess";
}
SpringMVC 将请求消息绑定到User对象中,然后再以“user”为键将User对象放到模型中。
在准备对视图进行渲染前,SpringMVC还会进一步将模型中的数据转储到视图的上下文中以暴露给视图对象。
对于JSP视图来说,SpringMVC会将模型数据转储到ServletRequest的属性列表中(即通过ServletRequest#setAttribute(String name,Object o )保存)。
handleModel()返回的逻辑视图名为 /user/createSuccess,对应createSuccess.jsp视图对象,这样createSuccess.jsp就可以使用${user.userName}等方式顺利访问到模型中的数据了。
 
   2.  在方法定义中使用@ModelAttribute注解:
除了可以在方法入参上使用@ModelAttribute注解,还可以在方法定义中使用@ModelAttribute注解。SpringMVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute的方法,并将这些方法的返回值添加到模型中。如下:
@ModelAttribute("user")
publicUser getUser(){ <---1//访问UserController中的任何一个请求处理方法前,
User user =newUser(); //SpringMVC先执行该方法,并将返回值以user为键添加到模型中
user.setUserId("1001");
return user;
}
 
@RequestMapping(value="/model")
publicString handleModel(@ModelAttribute("user")User user){ <---2 //在此,模型数据会赋给User的入参,
user.setUserName("tom"); //然后再根据HTTP请求消息进一步填充覆盖user对象
return"/user/showUser";
}
当访问UserController中的任何一个请求处理方法前,都会事先执行标注了@ModelAttribute的getUser()方法,并将其返回值以user为键添加到模型中。
由于 ② 处的handleModel()方法使用了入参级的@ModelAttribute注解,且属性名和 ① 处方法级@ModelAttribute的属性名相同。这时,SpringMVC会将 ① 处获取的模型属性先赋值给 ② 处的人参user,然后再根据HTTP请求消息对user进行填充覆盖,得到一个整合版本的user对象。
 
提示: 处理方法入参最多只能使用一个SpringMVC的注解,如 handleModel (@ModelAttribute("user") User user)的user入参使用了@ModelAttribute,就不能再使用@RequestParam或@CookieValue。如果使用了两个注解,SpringMVC就跑出异常。 
posted @ 2016-10-11 09:44  JamKong  阅读(2044)  评论(0编辑  收藏  举报