springMVC笔记系列(13)——模型数据处理篇 之 ModelAndVIew对象

时光毁灭记忆、已成空白 提交于 2020-12-19 08:40:58

之前的几篇文章介绍了处理请求的各个注解以及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"%>,否则就搞笑了,小白可以试一下。

后面的文章,我会对另外几种模型数据输出作介绍。




易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!