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