SpringMVC 之 处理数据模型
本节我们将学习并归纳一下SpringMVC中处理数据模型的方法有哪些,各自怎么实现的。
实例&归纳
Spring MVC 提供了以下几种途径输出模型数据:
ModelAndView
处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据。将直接为视图层提供数据服务
实例
Controller
/** * SpringMVC 处理数据模型 使用 ModelAndView 处理数据 * ModelAndView 代表了MVC Web程序中Model与View的对象, * 不过它只是方便您一次返回这两个对象的holder,Model与View两者仍是分离的概念。 */ @RequestMapping("/modelAndViewEx") public ModelAndView modelAndViewEx(Contract contract) throws Exception{ ModelAndView modelAndView = new ModelAndView(); //将一个对象传到视图层,同视图层调用 modelAndView.addObject("modelAndViewContract", contract); //指定需要渲染的试图名称 modelAndView.setViewName("modelAndViewEx/modelAndViewEx"); return modelAndView; }
- JSP
modelAndView-Contract: ${requestScope.modelAndViewContract} <br><br>
Map 、Model、ModelMap
org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。
实例
Controller
/** * SpringMVC 处理数据模型 使用 Map 处理数据 * 在SpringMVC 内部使用了一个 org.springFramework.ui.Model 接口存储模型数据 * 1.SpringMVC 在调用摸一个方法之前都会创建一个隐含的模型对象作为模型数据的存储容器 * * 2.如果被调用的方法的入参为Map或者Model 类型时 SpringMVC 会将隐含的模型的引用传递给这些入参。 * * 3.在方法体内, 我们可以入参对象访问到隐含模型中的数据,同时也可向模型数据模型中添加新的属性数据比如 String、Conllection<T>... * 4.不论入参的时Model还是Map,在方法返回之后隐含的数据模型将会被SpringMVC 转换为一个标准的 ModelAndView对象。 * map中的数据将会被处理为Model数据,返回的字符串类型将默认为 视图名称 * */ @RequestMapping("/mapEx") public String mapEx(Map<String, Object> map, Contract contract) throws Exception { map.put("mapExcontract", contract); map.put("mapExdataKey", "dataValue"); return "modelAndViewEx/modelAndViewEx"; } @RequestMapping("/modelEx") public String modelEx(Model model, Contract contract) throws Exception { //将一个对象放入数据模型中 model.addAttribute("modelExContract", contract); //讲一个字符串放入数据模型中 model.addAttribute("modelExdataKey", "modelEx-dataValue"); return "modelAndViewEx/modelAndViewEx"; } @RequestMapping("/modelMapEx") public String ModelMapEx(ModelMap model, Contract contract) throws Exception { //将一个对象放入数据模型中 model.addAttribute("ModelMapExContract", contract); //讲一个字符串放入数据模型中 model.addAttribute("ModelMapExdataKey", "ModelMapEx-dataValue"); return "modelAndViewEx/modelAndViewEx"; }
- JSP
mapEx-contract: <br><br> mapEx-contract:${requestScope.mapExcontract} <br> mapEx-dataKey:${requestScope.mapExdataKey} <br><br> modelEx-Contract: <br><br> modelEx-Contract:${requestScope.modelExContract} <br> modelEx-dataKey:${requestScope.modelExdataKey} <br><br> ModelMapEx-Contract: <br><br> ModelMapEx-Contract:${requestScope.ModelMapExContract} <br> ModelMapEx-dataKey:${requestScope.ModelMapExdataKey} <br><br>
@SessionAttributes
将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
实例
- Controller
@SessionAttributes(value={"tradePolicy"},types=String.class)
以上代码需要加在类上。
/** * @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 属性值), * 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值) * 注意: 该注解只能放在类的上面. 而不能修饰放方法. */ @RequestMapping("/sessionEx") public String sessionEx(Map<String,Object> map)throws Exception{ TradePolicy tradePolicy = new TradePolicy("ERUP", "ADDRT"); map.put("sessionExtradePolicy",tradePolicy); map.put("tradePolicy", tradePolicy); map.put("sessionExdataKey", "sessionEx-dataValue"); return "modelAndViewEx/modelAndViewEx"; }
- JSP
sessionEx-tradePolicy <br> requestScope-tradePolicy:${requestScope.sessionExtradePolicy} <br> requestScope-dataKey:${requestScope.sessionExdataKey} <br><br> sessionEx-tradePolicy:${sessionScope.tradePolicy} <br> sessionEx-dataKey:${sessionScope.sessionExdataKey} <br><br>
- @ModelAttribute
- 方法入参标注该注解后, 入参的对象就会放到数据模型中。由于该方法内容较多因而单独开了一章来学习@ModelAttribute,请参考 SpringMVC 之 @ModelAttribute&OOP处理
小结
SpringMVC 在做处理数据模型时提供了很多方法供我们使用,因而我们需要熟悉各个方法的实现原理是什么,以更能结合业务逻辑实现我们的需求。
在使用 Map 、Model、ModelMap 作为某个方法的入参时,在该方法返回后SpringMVC 会将 Map 、Model、ModelMap 转化成一个标准的 ModelAndView。