7.2.4-处理模型数据
对于MVC框架来说,模型数据是最重要的,因为控制(C)是为了产生模型(M)数据,而视图(V)是为了渲染模型数据。
SpringMVC提供了以下几种途径输出模型数据
ModelAndView
@ModelAttribute
Map及Model
@SessionAttribute
ModelAndView
控制器处理方法如果返回值为ModelAndView,则其既包含视图信息也包含模型数据信息,这样SpringMVC就可以使用试图对模型数据进行渲染了。(目前我理解的视图信息就是一个字符串,这个字符串代表一个url地址也就是一个显示页面,表明模型数据会在这个页面里渲染)可以简单的将模型数据看成一个Map<String ,Object>对象。(模型数据就是一个保存属性的容器,控制器方法将要渲染的数据保存在这里面,传递给试图View进行渲染。)
可以使用以下方法添加模型数据
ModelAndView addObject(String attributeName,Object attributeValue);
ModelAndView addAllObjects(Map<String,?> modleMap);
@ModelAttribute
如果希望将方法入参添加到模型中,仅需在相应入参中使用@ModleAttribute注解即可。
示例:
@RequestMapping(value="/model1")
public String handleModel1(@ModelAttribute("user") User user) {
user.setUserID("1000");
return "/user/createSucess";
}
Spring将请求参数绑定到User对象中,然后再以“user”为键将User对象放到模型中。在准备对视图进行渲染前,SpringMVC还会进一步将模型中的数据转储到视图上下文中以暴露给视图对象。对于JSP视图来说,SPingMVC会将模型数据转储到ServletRequest的属性列表中。
handleModel1()返回的逻辑视图名为/user/createSucess,对应createSucess.jsp对象,这样createSucess.jsp对象就可以使用${user.userName }等方式顺利的访问到模型中的数据了
还可以在方法定义处使用@MdoelAttribute注解。SpringMVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute的方法,并将这些方法的返回值添加到模型中。
UserController.java:在方法中定义处使用@ModelAttribute
@ModelAttribute(“user”) //在访问UserController中的任何一个请求处理方法钱,SPringMVC先执行该方法,并将返回值以user为键添加到模型中。
public User getUser() //这里应该就是将user对象添加到隐含模型里区了
{
User user=new User();
user.setUserID("1001");
return user;
}
@RequestMapping(value="/model2") //在此,模型数据会赋给User的入参,然后根据HTTp请求消息进一步填充覆盖user对象
public String handleModel2(@ModelAttribute("user") User user) {
user.setuserName("tom")
return "/user/showUser";
}
提示:处理方法入参最多只能使用一个SpringMVC的注解,即@RequestParam、@CookieValue、@ModelAttribute只能使用其中更多一个,如果使用了两个就会抛出异常。
Map及Model
SpringMVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器,我们称之为“隐含模型”。如果处理方法的入参为Map或Model类型,SpringMVC就会将隐含模型的引用传给这些入参。在方法体内,开发者既可以通过这个入参对象访问到模型中的左右数据,也可以像模型中添加新的属性数据。
@ModelAttribute(“user”)
public User getUser()
{
User user=new User();
user.setUserID("1001");
return user;
}
@RequestMapping(value="/modle3")
public String handleModel3(ModelMap modelMap) {
modelMap.addAttribute("tesetAttr","value1");
user=(User)modelMap.get("user");
return "/user/showUser";
}
SpringMVC一旦发现Map或Model类型的入参,就将隐含模型对象传递给这些参数。
@SessionAttributes
SpringMVCdui @RequestAttribute和@SessionAttribute的处理流程
(目前还不是很明白)
1、SpringMVC在调用处理方法钱,在请求线程中自动创建一个隐含模型对象
2、调用所有在方法级标注了@ModelAttribute的方法,并将方法的返回值加入隐含模型中。
3、查看Session中是否存在@SessionAttribute(“xxx”)所制定的xxx属性,如果有,将其添加到隐含模型中。如果隐含模型中已经有xxx属性,该步骤会覆盖模型中已有的属性值。
4、对标注了@ModelAttribute(“xxx”)处理方法的入参按如下流程处理
4、1 如果隐含模型中拥有名为xxx的属性,将其赋给改入参,在有请求消息填充该入参对象直接返回,否则到步骤4.2
4.2 如果xxx是会话属性。即在处理类定义出标注了@SessionAttribure(“xxx”),则尝试从绘画中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果会话中找不到对应的属性,则抛出HttpSessionRequiredException异常,否则步骤4.3
4.3 如果隐含模型不存在xxx属性,且xxx也不是会话属性,则创建入参对象实力,在用请求消息填充该入参。