第六节 属性域使用(request域、session域、application域)
1.request域
在SpringMVC中,当我们想把一个对象存入请求域有很多种操作方式,用哪一个都可以。
①使用Model对象
@RequestMapping("/requestAttrModel") public String requestAttrModel(Model model) { model.addAttribute("appleAttrName", "appleAttrValue"); return "result"; }
②使用ModelMap
@RequestMapping("/requestAttrModelMap") public String requestAttrModelMap(ModelMap modelMap) { modelMap.addAttribute("bananaAttrName", "bananaAttrValue"); return "result"; }
③使用Map
@RequestMapping("/requestAttrMap") public String requestAttrMap(Map<String, Object> map) { map.put("orangeAttrName", "orangeAttrValue"); return "result"; }
④使用HttpServletRequest
@RequestMapping("/requestAttrRequest") public String requestAttrRequest(HttpServletRequest request) { request.setAttribute("grapeAttrName", "grapeAttrName"); return "result"; }
2.session域
向session域存入数据,真正有效的办法只有一个
@RequestMapping("/sessionAttr") public String sessionAttr(HttpSession session) { session.setAttribute("sessionAttrName", "sessionAttrValue"); return "result"; }
3.application域
向application域存入数据需要先拿到ServletContext对象。前面介绍过获取ServletContext对象的两种方法。拿到ServletContext对象后调用setAttribute()方法。
servletContext.setAttribute(“appAttrName”,“appAttrValue”);
4.ModelAndView
在把数据存入请求域时还有一个方法:使用ModelAndView对象。
@RequestMapping("/modelAndView") public ModelAndView testModelAndView() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("result"); modelAndView.addObject("mavAttrName", "mavAttrValue"); return modelAndView; }
见名知意,ModelAndView就是把模型和视图封装到一起。其实即使我们没有明确使用ModelAndView,SpringMVC也会在handler方法执行完成后把模型和视图封装到ModelAndView对象中。
//检查handler方法的返回值是否为ModelAndView类型 if (returnValue instanceof ModelAndView) { ModelAndView mav = (ModelAndView) returnValue; //合并模型对象 mav.getModelMap().mergeAttributes(implicitModel); return mav; } //检查handler方法的返回值是否为Model类型 else if (returnValue instanceof Model) { //创建ModelAndView对象并将之前收集的模型对象存进去 return new ModelAndView().addAllObjects(implicitModel).addAllObjects(((Model) returnValue).asMap()); } //检查handler方法的返回值是否为View类型 else if (returnValue instanceof View) { //创建ModelAndView对象并存入视图和模型 return new ModelAndView((View) returnValue).addAllObjects(implicitModel); } //检查handler方法的返回值是否为Map类型 else if (returnValue instanceof Map) { //创建ModelAndView对象并将之前收集的模型对象存进去 return new ModelAndView().addAllObjects(implicitModel).addAllObjects((Map<String, ?>) returnValue); } //检查handler方法的返回值是否为String类型 else if (returnValue instanceof String) { //创建ModelAndView对象并把handler方法返回的字符串作为视图名称,且存入之前收集的模型数据 return new ModelAndView((String) returnValue).addAllObjects(implicitModel); }