域对象共享数据

362 阅读2分钟

一、域对象简介

1、域对象的作用

在一定范围内共享数据,通常有3种域对象:

  • request: 一次请求,多个资源共享数据
  • session: 默认一次会话,多个请求,多个资源共享数据
  • servletContext: 一个应用,多个会话,多个请求,多个资源共享同一份数据

2、生命周期

  • request: 创建-请求开始,销毁-响应结束
  • session: 创建-第一次调用,销毁- tomcat超时三十分钟(默认)、或者手动调用invalidate()、或者服务器非正常关闭
  • servletContext: 创建-启动时,销毁-关闭时

3、使用原则

在满足需求的前提下,能选择小范围的就不选择大范围的。

举例,一个查询列表场景,这种一般放在 request 域中,当然了放在更大的2个里面也可以,但是没必要。

因为除了查询还同时会存在增删改的功能,所以我们要每次去查询一次才可以保证数据是最新的,这时候如果放在更大的域比如 session 中,那么在一次请求中只会用到一次,其他时候这个空间就浪费掉了。

二、向域对象共享数据

1、使用ServletAPI对象向request域对象共享数据

public String requestScope(HttpServletRequest request){
    request.setAttribute("Scope","requestScope");
    return "success";
}

2、使用ModelAndView向request域对象共享数据

public ModelAndView modelAndView(){
    /**
     * ModelAndView有Model和View的功能
     * Model主要用于向请求域共享数据
     * View主要用于设置视图,实现页面跳转
     */
    ModelAndView mav = new ModelAndView();
    //向请求域共享数据
    mav.addObject("Scope", "hello,ModelAndView");
    //设置视图,实现页面跳转
    mav.setViewName("success");
    return mav;
}

3、使用Model向request域对象共享数据

public String model(Model model){
    model.addAttribute("Scope", "hello,Model");
    return "success";
}

4、使用map向request域对象共享数据

public String map(Map<String, Object> map){
    map.put("Scope", "hello,Map");
    return "success";
}

5、使用ModelMap向request域对象共享数据

public String modelMap(ModelMap modelMap){
    modelMap.addAttribute("Scope", "hello,ModelMap");
    return "success";
}

6、向session域共享数据

public String testSession(HttpSession session){
    session.setAttribute("SessionScope", "hello,session");
    return "success";
}

7、向ServletContext(application)域共享数据

public String testApplication(HttpSession session){
	ServletContext application = session.getServletContext();
    application.setAttribute("testApplicationScope", "hello,application");
    return "success";
}

三、Model、ModelMap、Map的关系

Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的

public class ModelMap extends LinkedHashMap<String, Object> {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class BindingAwareModelMap extends ExtendedModelMap {}
不管使用的是ModelModelMapMapModelAndView哪一种方式,底层都将其包装成ModelAndView对象。ModelAndView中,Model表示的是数据,View表示的是视图。