SpringMVC域对象共享数据示例详解

作者:把苹果咬哭的测试笔记 时间:2023-03-10 22:21:21 

SpringMVC域对象共享数据

一、域对象

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,

SpringMVC域对象共享数据示例详解

可以看到展示出了获取到的 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:

SpringMVC域对象共享数据示例详解

获取成功。

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

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

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

测试一下:

SpringMVC域对象共享数据示例详解

获取成功。

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

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

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

测试一下:

SpringMVC域对象共享数据示例详解

获取成功。

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

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

测试一下:

SpringMVC域对象共享数据示例详解

获取成功。

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:

SpringMVC域对象共享数据示例详解

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:

SpringMVC域对象共享数据示例详解

获取成功。

感谢《尚硅谷》的学习资源。

来源:https://blog.csdn.net/wessonlan/article/details/124812960

标签:SpringMVC,域对象,共享数据
0
投稿

猜你喜欢

  • SpringBoot @CompentScan excludeFilters配置无效的解决方案

    2022-08-01 09:06:42
  • IDEA部署JavaWeb项目到Tomcat服务器的方法

    2023-11-02 23:21:22
  • C#交错数组用法实例

    2022-08-13 09:34:55
  • MyBatis中的resultMap简要概述

    2023-11-16 06:51:34
  • 高效的java版排列组合算法

    2022-01-24 07:13:13
  • 详解Android USB转串口通信开发基本流程

    2022-01-04 10:12:15
  • 关于Spring事务隔离、传播属性与@Transactional注解

    2021-11-15 04:37:11
  • 如何基于Java实现对象List排序

    2022-01-28 03:59:16
  • c# 实现RSA非对称加密算法

    2021-10-15 10:54:06
  • while和for可以相互转换的例子分享

    2023-08-23 02:17:46
  • C#的Excel导入、导出

    2023-09-10 01:00:24
  • 浅谈Java安全之C3P0链利用与分析

    2022-05-23 20:31:17
  • Android Button按钮点击背景和文字变化操作

    2023-10-27 22:27:22
  • 深入探究Spring底层核心原理

    2023-03-05 08:32:16
  • C++形参与实参的区别实例解析

    2023-11-02 23:39:05
  • Java数据结构之线段树详解

    2022-09-03 08:13:32
  • C#删除文件目录或文件的解决方法

    2022-12-13 09:25:03
  • 深入解析:打造自动消失的对话框

    2022-04-07 02:53:56
  • 使用JDBC实现数据访问对象层(DAO)代码示例

    2021-11-12 23:33:46
  • C#绘制中国象棋棋盘

    2021-05-27 15:08:44
  • asp之家 软件编程 m.aspxhome.com