第5章处理模型数据

编程

  • SpringMVC提供了以下几种途径输出模型数据:

    • ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。
    • MapModel:当入参为org.springframework.ui.Modelorg.springframework.ui.ModelMapjava.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在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
    • 如果方法的入参为MapModel类型,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

回到顶部