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

2022-09-28 11:28:28 浏览数 (1)

第六节 属性域使用(request域、session域、application域) 1.request域

在SpringMVC中,当我们想把一个对象存入请求域有很多种操作方式,用哪一个都可以。 ①使用Model对象

代码语言:javascript复制
@RequestMapping("/requestAttrModel")
public String requestAttrModel(Model model) {
    model.addAttribute("appleAttrName", "appleAttrValue");
    return "result";
}

②使用ModelMap

代码语言:javascript复制
@RequestMapping("/requestAttrModelMap")
public String requestAttrModelMap(ModelMap modelMap) {
    modelMap.addAttribute("bananaAttrName", "bananaAttrValue");
    return "result";
}

③使用Map

代码语言:javascript复制
@RequestMapping("/requestAttrMap")
public String requestAttrMap(Map<String, Object> map) {
    map.put("orangeAttrName", "orangeAttrValue");
    return "result";
}

④使用HttpServletRequest

代码语言:javascript复制
@RequestMapping("/requestAttrRequest")
public String requestAttrRequest(HttpServletRequest request) {
    request.setAttribute("grapeAttrName", "grapeAttrName");
    return "result";
}

2.session域 向session域存入数据,真正有效的办法只有一个

代码语言:javascript复制
@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对象。

代码语言:javascript复制
@RequestMapping("/modelAndView")
public ModelAndView testModelAndView() {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("result");
    modelAndView.addObject("mavAttrName", "mavAttrValue");
    return modelAndView;
}

见名知意,ModelAndView就是把模型和视图封装到一起。其实即使我们没有明确使用ModelAndView,SpringMVC也会在handler方法执行完成后把模型和视图封装到ModelAndView对象中。

代码语言:javascript复制
//检查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);
}

0 人点赞