之前的几篇文章介绍了处理请求的各个注解以及POJO对象接收和Servlet原生API参数类型支持等内容,这些内容主要解决的都是如何接收和映射请求数据。
接下来我们重点来看看如何处理和返回模型数据。之前我们控制器类的处理方法返回的都是String,来生成我们最终的物理url路径。可输出的模型数据还可以有多种类型。
Spring MVC 提供了以下几种途径输出模型数据:
ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
Map 及 Model: 入参为org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map
中的数据会自动添加到模型中。
@SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
@ModelAttribute: 方法入参标注该注解后, 入参的对象就会放到数据模型中
从本篇开始,我们进入一个小环节,就是模型数据处理篇,本篇先介绍其中的ModelAndView。
ModelAndView
我们编写控制器类的一个方法如下,方法中我们构造了一个ModelAndView对象,并将最终的物理url的相应的返回段作为构造参数(其实就是原先return的字符串,现在作为ModelAndView的构造方法的参数)。SpringMVC会和以前一样处理请求并转向目标url。那么,我们为什么还要用ModelAndView对象呢?这是因为,我们可以将某些模型数据添加到ModelAndView对象中,SpringMVC会把ModelAndView中的model数据放入request域对象中。
源码解析结论:实际上,无论处理方法返回的是String、ModelAndView还是上面的任何类型,springMVC内部都会统一转换为一个ModelAndView。
控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。
• 添加模型数据:
– MoelAndView addObject(String attributeName, Object attributeValue)
– ModelAndView addAllObject(Map<String, ?> modelMap)
• 设置视图:
– void setView(View view)
– void setViewName(String viewName)
好,现在我们看个例子,控制器类的处理方法如下:我们添加了类似于key,value形式的数据,我们稍后会在目标页面用EL表达式进行显示。这里,我们value既有String的例子,也有对象的例子。
package com.happyBKs.springmvc.handlers;import java.util.Date;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;import com.happyBKs.springmvc.beans.Location;@RequestMapping("/model")@Controllerpublic class ModelDataHandler { /* * 目标方法返回值可以使ModelAndView类型 * 可以包含视图和模型信息 * SpringMVC会把ModelAndView中的model数据放入request域对象中。 * * 这里需要注意的是,其实处理函数无论返回String,ModelAndView,Map类型,SpringMVC内部都会自动统一转换为ModelAndView * */ @RequestMapping("/ModelAndView") public ModelAndView handle1() { String reStr="ModelAndViewTest"; ModelAndView mv=new ModelAndView(reStr); mv.addObject("time", new Date()); Location loc=new Location(); loc.setCity("urban"); loc.setProvince("Shanghai"); mv.addObject("local", loc); return mv; }}
目标页面:/views/ModelAndView.jsp (model/ModelAndView)
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%><%@ page isELIgnored="false"%>Insert title here time: ${ requestScope.time } location: ${ requestScope.local.city },${ requestScope.local.province }
注意:JSP页面EL表达式记得要写上命令<%@ page isELIgnored="false"%>,否则就搞笑了,小白可以试一下。
后面的文章,我会对另外几种模型数据输出作介绍。