5、处理模型数据ModelAndView、Map、Model以及@SessionAttributes注解
2015-11-09 22:30 宏愿。 阅读(966) 评论(0) 编辑 收藏 举报
Spring MVC提供了以下几种途径输出模型数据
—— ModelAndView: 处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。数据会添加到request域中。在页面上可以获取到该数据。
—— Map 及 Model:入参为 org.springframework.ui.Model、org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map中的数据会自动添加到模型中。数据放在request域中。
—— @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性。只能使用在类定义处。
—— @ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。可以使用在方法定义和入参处。
这里介绍一下@SessionAttributes这个注解:
①、它只能使用在类定义处,@Target({ElementType.TYPE})。
②、它有两个属性:String[] value() default {} 和 Class<?>[] types() default {} 。所以,可以通过名字和类型来指定哪个数据对象应该放置在session域中。
下面是一个实例,说明前三种途径的用法。最后的@ModelAttribute在后面单独说:
package com.springmvc.modelAndView_7; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.servlet.ModelAndView; import com.springmvc.pojoParam_6.User; @Controller @RequestMapping("/ModelAndView") @SessionAttributes(value={"school"}, types={User.class}) public class ModelAndViewTest { private static final String SUCCESS = "success"; /** * 1、处理方法的返回值为ModelAndView类型 * 目标方法的返回值可以是ModelAndView类型,其中可以包含视图和模型信息 * SpringMVC会把ModelAndView中model中的数据放入到request域对象中 */ @RequestMapping("/testModelAndView") public ModelAndView testModelAndView(){ String viewName = SUCCESS; ModelAndView modelAndView = new ModelAndView(viewName); //添加模型数据到ModelAndView中,目标页面中在请求域中获取${requestScope.time } modelAndView.addObject("time", new Date()); return modelAndView; } /** * 2、入参为Map类型的实现,也是放在请求域中 * 目标方法可以添加Map类型(实际上也可以是Model类型,或ModelMap类型)的参数实现 */ @RequestMapping("/testMap") public String testMap(Map<String, List<String>> map){ map.put("names", Arrays.asList("Tom", "Jerry", "Mike")); return SUCCESS; } /**
* 3、@SessionAttributes注解方式实现
* 在类上面放置@SessionAttributes注解,这样就能够将注解中指定的属性放置到session域中。
*
* 在这个处理方法中,将user和school放入到map中。单从方法本身来看,和上面的testMap做法没有任何区别。
* 但是,为什么这里的user和school就能够放置到session域中,而上面的names只能放置在request域中呢??
* 原因在于在控制器类定义处使用了 @SessionAttributes(value={"school"}, types={User.class})
* 这个注解。该注解规定了:“名字为school” 和 “类型为User” 的都放置在session域中。
*/ @RequestMapping("/testSessionAttributes") public String testSessionAttributes(Map<String, Object> map){ User user = new User("jerry", "123456", 16, "123@126.com"); map.put("user", user); map.put("school", "HNedu"); return SUCCESS; } }
在/WEB-INFO/views/success.jsp页面中可以获取到request域或者是session域中的数据:
<body> <h1>hello world success!!!</h1> <br/> 模型视图方式,ModelAndView实现,requestScope time:${requestScope.time } <br/> 模型视图方式,ModelAndView实现,sessionScope time:${sessionScope.time } <br/><br/> 模型视图方式,Map实现,requestScope names:${requestScope.names } <br/> 模型视图方式,Map实现,sessionScope names:${sessionScope.names } <br/><br/> 模型视图方式,@SessionAttributes注解实现: <br/> request school: ${requestScope.school } <br/> session school: ${sessionScope.school } <br/> request user: ${requestScope.user } <br/> session user: ${sessionScope.user } <br/> </body>
现在发送三个请求,验证结果:
①:http://localhost:8080/springMVC/ModelAndView/testModelAndView 说明处理方法返回ModelAndView时,将数据放置在request域中。
②:http://localhost:8080/springMVC/ModelAndView/testMap 将数据放置在request域中。
③、http://localhost:8080/springMVC1/ModelAndView/testSessionAttributes 说明将数据放在request和session域中。