天天看点

Spring MVC Web项目中 Controller传递模型数据到视图

Spring MVC Web传递模型数据到视图 依赖 Spring的Model类 org.springframework.ui.Model

在Spring MVC Web程序中,controller处理请求 ,生成数据模型,指定渲染数据模型的逻辑视图名,那这些数据模型是需要和请求,逻辑视图名一起返回给DispatcherServlet的。这里就讲一下 在controller中 怎么把 处理请求生成的 数据模型 传递到视图中。

传递数据模型到视图有3钟方式:使用Spring的Model类,使用非Spring类型Map,直接把controller中方法返回数据模型而不是逻辑视图名。下面分别说明这几种方式。

1.使用Spring的Model类 org.springframework.ui.Model

控制器方法 接受一个Model类型参数, 处理请求生成的数据 放到Model中。它会传递给视图,这样数据就能 通过视图 渲染到客户端

Model类实际上就是一个Map(key-value 对的集合)。

Model的key 推荐 显示声明模型的key,如果没有显示指定的话,key会根据value的对象类型 推断决定。(在本例中,也就是spittleList)

2.使用非Spring类 java.util.Map

因为Spring.Model实际上就是一个 Map

3.处理器方法直接返回对象或集合

当处理器方法像这样 返回对象或集合时,这个值会放到模型中,

模型的key会根据其类型推断得出(在本例中,也就是spittleList)。

而逻辑视图的名称将会根据请求路径推断得出。因为这个方法处理针对“/spittles”的GET请求,因此视图的名称将会是spittles(去掉开头的斜线)。

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import spittr.Spittle.Spittle;

@Controller
@RequestMapping("/")
public class SpittleController {

	@RequestMapping(value = "/spittleModel", method = RequestMethod.GET)
	public String spittlesByModel(Model model) {
		// 模拟数据
		List<Spittle> spittleList = new ArrayList<Spittle>();
		spittleList.add(new Spittle("model message one", new Date()));
		spittleList.add(new Spittle("model message two", new Date()));
		// 1.使用Spring Model类 把controller处理请求生成的模型数据 传递给 视图
		model.addAttribute("spittleList", spittleList);
		return "spittles";
	}

	@RequestMapping("/spittleMap")
	public String spittlesByMap(Map map) {
		// 模拟数据
		List<Spittle> spittleList = new ArrayList<Spittle>();
		spittleList.add(new Spittle("map message one", new Date()));
		spittleList.add(new Spittle("map message two", new Date()));
		// 2.使用非Spring Map类 把controller处理请求生成的模型数据 传递给 视图
		map.put("spittleList", spittleList);
		return "spittles";
	}

	@RequestMapping("/spittles")
	public List<Spittle> spittles() {
		// 模拟数据
		List<Spittle> spittles = new ArrayList<Spittle>();
		spittles.add(new Spittle(" message one", new Date()));
		spittles.add(new Spittle(" message two", new Date()));
		// 3.使用非Spring Map类 把controller处理请求生成的模型数据 传递给 视图
		return spittles;
	}
}
           

4.数据已经放到了模型中,在JSP中该如何访问它呢   视图中的处理如下(视图使用.jsp),先不解释

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page isELIgnored="false"%>
<html>
  <head>
    <title>Spitter</title>
   </head>
  <body>   
      <h1>Recent Spittles</h1>           
      <ul >
        <c:forEach items="${spittleList}" var="spittle" >
         
            <div><c:out value="${spittle.message}" /></div>
            <div>
              <span><c:out value="${spittle.time}" /></span>
              <span>(<c:out value="${spittle.latitude}" />, <c:out value="${spittle.longitude}" />)</span>
            </div>
          </li>
        </c:forEach>
      </ul>
      
    </div>
  </body>
</html>
           

5.浏览器中 预览结果 

http://localhost:8080/spittr/spittleModel 测试方式1

http://localhost:8080/spittr/spittleMap   测试方式2

http://localhost:8080/spittr/spittles   测试方式3

继续阅读