第5章处理模型数据
- SpringMVC提供了以下几种途径输出模型数据:
ModelAndView
:处理方法返回值类型为ModelAndView
时,方法体即可通过该对象添加模型数据。Map
及Model
:当入参为org.springframework.ui.Model
、org.springframework.ui.ModelMap
或java.uti.Map
时。在处理方法返回时,Map
中的数据会自动添加到模型中。@ModelAttribute
:方法入参标注该注解后,入参的对象就会放到数据模型中。@SessionAttributes
:将模型中的某个属性暂存到HttpSession
中,以便多个请求之间可以共享这个属性。
ModelAndView
- 控制器处理方法的返回值如果为
ModelAndView
时,则其既包含视图信息,也包含模型数据信息。 - 添加模型数据:
MoelAndView addObject(String attributeName, Object attributeValue)
ModelAndView addAllObject(Map<String, ?> modelMap)
- 设置视图:
void setView(View view)
void setViewName(String viewName)
Map及Model
- SpringMVC在内部使用了一个
org.springframework.ui.Model
接口存储模型数据。 - 具体步骤:
- Spring MVC在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
- 如果方法的入参为
Map
或Model
类型,SpringMVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可通过这个入参对象访问到模型中的所有数据,也可向模型中添加新的属性数据。
示例
@ModelAttribute
- 在方法定义上使用
@ModelAttribute
注解,SpringMVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute
注解的方法。 - 在方法的入参前使用
@ModelAttribute
注解:- 可从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参。
- 将方法入参对象添加到模型中。
@SessionAttributes
- 若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个
@SessionAttributes
,SpringMVC将在模型中对应的属性暂存到HttpSession
中。 @SessionAttributes
除了可以通过属性名指定需要放到会话中的属性外,还可通过模型属性的对象类型指定哪些模型属性需要放到会话中。@SessionAttributes(types=User.class)
会将隐含模型中所有类型为User.class
的属性添加到会话中。- @SessionAttributes(value={"user1","user2"})
- @SessionAttributes(types={User.class,Dept.class})
- @SessionAttributes(value={"user1", "user2"},types={Dept.class})
示例
由@SessionAttributes引发的异常
org.springframework.web.HttpSessionRequiredException:Session attribute "user" required - not found in session
- 如果在处理类定义处标注了
@SessionAttributes("xxx")
,则尝试从会话中获取该属性,并将其赋给该入参,然后再用请求消息填充该入参对象。如果在会话中找不到对应的属性,则抛出HttpSessionRequiredException
异常。
如何避免
以上是 第5章处理模型数据 的全部内容, 来源链接: utcz.com/z/511915.html