之前的几篇文章介绍了处理请求的各个注解以及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")
@Controller
public 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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
time: ${ requestScope.time }
<br/>
location: ${ requestScope.local.city },${ requestScope.local.province }
</body>
</html>
注意:JSP页面EL表达式记得要写上命令<%@ page isELIgnored="false"%>,否则就搞笑了,小白可以试一下。
后面的文章,我会对另外几种模型数据输出作介绍。
来源:oschina
链接:https://my.oschina.net/u/1156339/blog/420310