【SpringMVC 从 0 开始】域对象共享数据

简介: 【SpringMVC 从 0 开始】域对象共享数据

一、域对象


1. 域对象的作用


就是在一定范围内可以共享数据,通常有 3 种:


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


2. 域对象生命周期


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


3. 使用原则


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


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


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


二、向域对象共享数据


1. 向 request 域对象共享数据


(1)使用 servletAPI 向 request 域对象共享数据


@Controller
public class ScopeController {
    @RequestMapping("/testServletAPI")
    public String testServletAPI(HttpServletRequest request){
        request.setAttribute("testScope", "hello,servletAPI");
        return "success";
    }
}


在控制器方法里,设置 request 域对象中的数据,key 是testScope,value是"hello,servletAPI",最后这个请求转发到了 success.html 上。


那么在 success.html 中就可以获得域对象中的数据了,直接使用 key:


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>success</p>
<p th:text="${testScope}"></p>
</body>
</html>


现在访问http://localhost:8080/springmvc/testServletAPI


可以看到展示出了获取到的 request 域中共享的数据。


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


ModelAndView 有 Model和 View的功能,Model主要用于向请求域共享数据,View主要用于设置视图,实现页面跳转。这种也是 springMVC 建议使用的方式。


注意控制器方法必须要返回 ModelAndView 类型的对象。


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


访问一下http://localhost:8080/springmvc/testModelAndView


1268169-20210815085033434-1316734779.png


获取成功。


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


这里的 Model 其实就是上面 ModelAndView 中的 Model 。


@RequestMapping("/testModel")
public String testModel(Model model){
    model.addAttribute("testScope", "hello,Model");
    return "success";
}


测试一下:


1268169-20210815085512671-327516228.png


获取成功。


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


还可以使用 map 集合来实现,这时候向 map 集合中存放的数据,就是要共享的数据:


@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
    map.put("testScope", "hello,Map");
    return "success";
}


测试一下:


1268169-20210815085755624-1847269968.png


获取成功。


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


@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
    modelMap.addAttribute("testScope", "hello,ModelMap");
    return "success";
}


测试一下:


1268169-20210815090413589-583839490.png


获取成功。


Model、ModelMap、Map的关系


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


分别查看源码可知如下关系:


public interface Model{}
public class ModelMap extends LinkedHashMap<String, Object> {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class BindingAwareModelMap extends ExtendedModelMap {}


2. 向 session 域共享数据


直接使用 servlet 原生的 HttpSession 即可:


@RequestMapping("/testSession")
public String testSession(HttpSession session){
    session.setAttribute("testSessionScope", "hello,session");
    return "success";
}


success 页面也需要修改了,通过 session.testSessionScope获取数据展示:


... ...
<p th:text="${session.testSessionScope}"></p>
... ...


重新部署访问http://localhost:8080/springmvc/testSession


1268169-20210815093819210-1168773508.png

3. 向 application 域共享数据


其实这里的 application 指的就是 ServletContext 对象,用 session.getServletContext() 来获取即可:


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


success.html 修改:


... ...
<p th:text="${application.testApplicationScope}"></p>
... ...


重新部署访问http://localhost:8080/springmvc/testApplication


1268169-20210815094521048-851537068.png


获取成功。

相关文章
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
这篇文章详细解释了在IntelliJ IDEA中如何使用Mute Breakpoints功能来快速跳过程序中的后续断点,并展示了如何一键清空所有设置的断点。
SpringMVC入门到实战------5、域对象共享数据 Request、Session、Application、Model、ModelAndView、Map、ModelMap的详细使用及代码实例
|
5月前
|
JSON 前端开发 数据格式
SpringMVC的数据响应-直接回写json字符串
SpringMVC的数据响应-直接回写json字符串
|
6月前
|
前端开发 Java Spring
数据之桥:深入Spring MVC中传递数据给视图的实用指南
数据之桥:深入Spring MVC中传递数据给视图的实用指南
91 3
|
6月前
SpringMVC 域对象共享数据
SpringMVC 域对象共享数据
30 0
|
6月前
【SpringMVC】SpringMVC方式,向作用域对象共享数据(ModelAndView、Model、map、ModelMap)
【SpringMVC】SpringMVC方式,向作用域对象共享数据(ModelAndView、Model、map、ModelMap)
66 1
|
6月前
SpringMVC之获取请求参数和域对象共享数据
【1月更文挑战第18天】 一、SpringMVC获取请求参数 1、通过ServletAPI获取 2、通过控制器方法的形参获取请求参数 3、@RequestParam 4、@RequestHeader 5、@CookieValue 6、通过POJO获取请求参数 7、解决获取请求参数的乱码问题 二、域对象共享数据 1、使用ServletAPI向request域对象共享数据 2、使用ModelAndView向request域对象共享数据 3、使用Model向request域对象共享数据 4、使用map向request域对象共享数据 5、使用ModelMap向request域对象共享数据
104 0
|
6月前
SpringMVC之域对象共享数据
SpringMVC之域对象共享数据
|
6月前
|
设计模式 JSON 前端开发
Spring MVC 详解(连接、获取参数、返回数据)
Spring MVC 详解(连接、获取参数、返回数据)
|
6月前
|
前端开发 JavaScript Java
让你了解什么是spring MVC模型数据(附大量代码)
让你了解什么是spring MVC模型数据(附大量代码)
78 0
|
6月前
|
前端开发
SpringMVC-RESTful快速开发及案例:基于RESTful页面数据交互
SpringMVC-RESTful快速开发及案例:基于RESTful页面数据交互
74 0