Spring MVC框架:第四章:屬性域使用(request域、session域、application域)
第六節(jié) 屬性域使用(request域、session域、application域)
1.request域
在SpringMVC中,當(dāng)我們想把一個(gè)對(duì)象存入請(qǐng)求域有很多種操作方式,用哪一個(gè)都可以。
①使用Model對(duì)象
@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域存入數(shù)據(jù),真正有效的辦法只有一個(gè)
@RequestMapping("/sessionAttr")
public String sessionAttr(HttpSession session) {
session.setAttribute(“sessionAttrName”, “sessionAttrValue”);
return “result”;
}
3.application域
向application域存入數(shù)據(jù)需要先拿到ServletContext對(duì)象。前面介紹過獲取ServletContext對(duì)象的兩種方法。拿到ServletContext對(duì)象后調(diào)用setAttribute()方法。
servletContext.setAttribute(“appAttrName”,“appAttrValue”);
4.ModelAndView
在把數(shù)據(jù)存入請(qǐng)求域時(shí)還有一個(gè)方法:使用ModelAndView對(duì)象。
@RequestMapping("/modelAndView")
public ModelAndView testModelAndView() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName(“result”);
modelAndView.addObject(“mavAttrName”, “mavAttrValue”);
return modelAndView;
}
見名知意,ModelAndView就是把模型和視圖封裝到一起。其實(shí)即使我們沒有明確使用ModelAndView,SpringMVC也會(huì)在handler方法執(zhí)行完成后把模型和視圖封裝到ModelAndView對(duì)象中。
//檢查handler方法的返回值是否為ModelAndView類型
if (returnValue instanceof ModelAndView) {
ModelAndView mav = (ModelAndView) returnValue;
//合并模型對(duì)象
mav.getModelMap().mergeAttributes(implicitModel);
return mav;
}
//檢查handler方法的返回值是否為Model類型
else if (returnValue instanceof Model) {
//創(chuàng)建ModelAndView對(duì)象并將之前收集的模型對(duì)象存進(jìn)去
return new ModelAndView().addAllObjects(implicitModel).addAllObjects(((Model) returnValue).asMap());
}
//檢查handler方法的返回值是否為View類型
else if (returnValue instanceof View) {
//創(chuàng)建ModelAndView對(duì)象并存入視圖和模型
return new ModelAndView((View) returnValue).addAllObjects(implicitModel);
}
//檢查handler方法的返回值是否為Map類型
else if (returnValue instanceof Map) {
//創(chuàng)建ModelAndView對(duì)象并將之前收集的模型對(duì)象存進(jìn)去
return new ModelAndView().addAllObjects(implicitModel).addAllObjects((Map<String, ?>) returnValue);
}
//檢查handler方法的返回值是否為String類型
else if (returnValue instanceof String) {
//創(chuàng)建ModelAndView對(duì)象并把handler方法返回的字符串作為視圖名稱,且存入之前收集的模型數(shù)據(jù)
return new ModelAndView((String) returnValue).addAllObjects(implicitModel);
}