SpringMVC:向三大域对象存数据

1. 简介 

Servlet中的三个域对象

请求域:request会话域:session应用域:application

主要是通过:setAttribute + getAttribute方法来完成在域中数据的传递和共享。

点击跳转Servlet详细概念

// 向域中存储数据
void setAttribute(String name, Object obj);

// 从域中读取数据
Object getAttribute(String name);

// 删除域中的数据
void removeAttribute(String name);

 2. request域对象

在SpringMVC中,在request域中共享数据有以下几种方式:

1. 使用原生Servlet API方式。
2. 使用Model接口。
3. 使用Map接口。
4. 使用ModelMap类。
5. 使用ModelAndView类。

1. 原生Servlet API方式 

原生Servlet必须部署在Tomcat服务器,不方便进行单元测试 

index.html 

<body>
    <h1>向Request请求域存数据</h1>
    <a th:href="@{/testServletAPI}">原生API</a> <br>

Controller层

@Controller
//(controller层)
public class RequestController {
    @RequestMapping("/")
    public String index() {
        return "index";
    }


    //方法一:使用原生Servlet的api向请求域中添加数据,直接传递HttpServletRequest对象即可
    @RequestMapping("/testServletAPI")
    public String testServletAPI(HttpServletRequest request) {
        //向请求域中添加数据
        request.setAttribute("testData", "测试使用原生Servlet向请求域中添加数据");

        //添加成功后向哪个视图跳转并展示
        return "ok";
    }

 展示数据

<body>
    <div th:text="${testData}"></div>

 2. 使用Model接口

<body>
    <h1>向Request请求域存数据</h1>
    <a th:href="@{/testServletModel}">Model接口向请求域中添加数据</a> <br>

Controller层 

//方法二:使用Model接口向请求域中添加数据
    @RequestMapping("/testServletModel")
    //(Model层)
    public String testServletMap(Model model) {
        //向域中添加数据
        model.addAttribute("testData", "测试使用model向请求域中添加数据");
        System.out.println(model.getClass().getName());

        //返回逻辑视图(view层)
        return "ok";
    }
<body>
    <div th:text="${testData}"></div>

3. 使用Map接口

<a th:href="@{/testServletMap}">Map接口向请求域中添加数据</a> <br>
//方法三:使用Map接口向请求域中添加数据
    @RequestMapping("/testServletMap")
    public String testServletMap(Map<String, Object> map) {
        //向请求域中添加数据
        map.put("testData", "测试使用map向请求域中添加数据");
        System.out.println(map.getClass().getName());

        //返回逻辑视图
        return "ok";
    }
<body>
    <div th:text="${testData}"></div>

4. 使用ModelMap类 

    <a th:href="@{/testServletModelMap}">ModelMap类向请求域中添加数据</a> <br>
 //方法四:通过ModelMap类向请求域中添加数据
    @RequestMapping("/testServletModelMap")
    public String testServletModelMap(ModelMap modelMap) {
        //向请求域中添加数据
        modelMap.addAttribute("testData", "测试使用ModelMap类向请求域中添加数据");
        System.out.println(modelMap.getClass().getName());

        //返回逻辑视图
        return "ok";
    }
<body>
    <div th:text="${testData}"></div>

Model、Map、ModelMap三者关系 

通过输出结果可以看出,无论是Model、Map还是ModelMap,底层实例化的对象都是:BindingAwareModelMap。

* 表面上使用了不同的类不同的接口进行创建对象,实际上都使用同一个对象org.springframework.validation.support.BindingAwareModelMap

SpringMVC之所以提供了这些方式,目的就是方便程序员的使用,提供了多样化的方式,可见它的重要性。

 5. 使用ModelAndView类

在SpringMVC框架中为了更好的体现MVC架构模式,提供了一个类:ModelAndView。这个类的实例封装了Model和View。也就是说这个类既封装业务处理之后的数据,也体现了跳转到哪个视图。使用它也可以完成request域数据共享。 

    <a th:href="@{/testServletModelAndView}">ModelAndView类向请求域中添加数据</a> <hr>
//方法五:通过ModelAndView类向请求域中添加数据
    //该写法不需要在方法中传递参数ModelAndView
    /**
     * * 方法的返回值类型不是String,而是ModelAndView对象。
     * * ModelAndView不是出现在方法的参数位置,而是在方法体中new的。
     * * 需要调用addObject向域中存储数据。
     * * 需要调用setViewName设置视图的名字。
     * */
    @RequestMapping("/testServletModelAndView")
    public ModelAndView tesModelAndView() {
        //创建ModeAndView类对象
        ModelAndView modelAndView = new ModelAndView();

        //向请求域中添加数据
        modelAndView.addObject("testData", "测试使用ModeAndView类向请求域中添加数据");

        //绑定视图(绑定逻辑视图名称)
        modelAndView.setViewName("ok");

        //返回ModelAndView对象
        return modelAndView;
    }
<body>
    <div th:text="${testData}"></div>

 总结

* 对于处理器方法:不论是调用Model接口、Map接口、ModelMap类还是ModelAndView类最终调用结束后都会返回一个ModelAndView对象
* 该ModelAndView对象给最终会返回给DispatcherServlet类
*
* 当请求路径不是JSP时都会走前端控制器DispatcherServlet,前端控制器都会调用一个核心方法doDispatcher(),
* 这个方法会找到对应的处理器执行对应的处理方法,处理器最终会返回一个逻辑视图(或者ModelAndView对象)
* 最终会将逻辑视图封装成View对象,再将View对象和Model对象封装成ModelAndView对象进行返回

 3. session域对象

在SpringMVC中使用session域共享数据,实现方式有多种,其中比较常见的两种方式:

1. 使用原生Servlet API
2. 使用SessionAttributes注解

1. 使用原生Servlet API  

@Controller
public class SessionScopeTestController {

    @RequestMapping("/testSessionScope1")
    public String testServletAPI(HttpSession session) {
        // 向会话域中存储数据
        session.setAttribute("testSessionScope1", "使用原生Servlet API实现session域共享数据");
        return "view";
    }

}

 2. 使用@SessionAttributes注解 

<h1>向Session会话域存数据</h1>
    <a th:href="@{/testSessionModel}">Model接口向Session会话域添加数据</a> <hr>
@Controller
//向session里面存数据只需加多一个注解@SessionAttributes
@SessionAttributes(value = {"testSessionData"})
public class SessionController {
    //向session域存数据
    @RequestMapping(value = "/testSessionModel")
    public String testSessionController(Model model) {
        model.addAttribute("testSessionData", "通过model方式向session域里面存数据");
        return "ok";
    }
}
    <div th:text="${session.testSessionData}"></div>

4. application域对象

在SpringMVC实现application域数据共享,最常见的方案就是直接使用Servlet API了: 

  <h1>向Application应用域存数据</h1>
    <a th:href="@{/testApplicationServlet}">Application应用域一般都是用原生Servlet的API进行操作</a>
@Controller
public class ApplicationController {
    @RequestMapping("/testApplicationServlet")
    public String testApplication(HttpServletRequest request) {
        //获取应用域对象
        ServletContext application = request.getServletContext();

        //通过应用域对象进行存储数据
        application.setAttribute("testApplication", "向应用域存储数据");

        //返回逻辑视图
        return "ok";
    }
}
    <div th:text="${application.testApplication}"></div>

相关推荐

  1. SpringMVC对象数据

    2024-06-06 22:30:06       10 阅读
  2. SpringMVC-对象共享数据

    2024-06-06 22:30:06       30 阅读
  3. SpringMVC之获取请求参数和对象共享数据

    2024-06-06 22:30:06       23 阅读
  4. springMvcrequest作用存储数据的4种方式

    2024-06-06 22:30:06       34 阅读
  5. C++ /五法则(__cplusplus 前兼容)

    2024-06-06 22:30:06       19 阅读
  6. img 跨 和 缓

    2024-06-06 22:30:06       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 22:30:06       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 22:30:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 22:30:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 22:30:06       18 阅读

热门阅读

  1. Excel的VLOOKUP函数的用法

    2024-06-06 22:30:06       6 阅读
  2. C# virtual 关键字

    2024-06-06 22:30:06       8 阅读
  3. SAP ABAP下拉筛选框实现

    2024-06-06 22:30:06       7 阅读
  4. c++学习笔记“类和对象”;友元函数

    2024-06-06 22:30:06       8 阅读
  5. map和set

    map和set

    2024-06-06 22:30:06      8 阅读
  6. GPT发展途径

    2024-06-06 22:30:06       8 阅读
  7. 索引的强大作用和是否创建的索引越多越好

    2024-06-06 22:30:06       7 阅读
  8. DDR write leveling失败

    2024-06-06 22:30:06       9 阅读
  9. 域名的端口号范围

    2024-06-06 22:30:06       10 阅读
  10. 软件设计模式概述

    2024-06-06 22:30:06       9 阅读
  11. JVM基础

    JVM基础

    2024-06-06 22:30:06      7 阅读
  12. 前端 实现有时间限制的缓存

    2024-06-06 22:30:06       10 阅读
  13. 深度学习之动量momentum介绍

    2024-06-06 22:30:06       8 阅读