Spring MVC框架:第四章:属性域使用(request域、session域、application域)

第六节 属性域使用(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);
}