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,
可以看到展示出了获取到的 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:
获取成功。
(3)使用 Model 向 request 域对象共享数据
这里的 Model 其实就是上面 ModelAndView 中的 Model 。
@RequestMapping("/testModel")
public String testModel(Model model){
model.addAttribute("testScope", "hello,Model");
return "success";
}
测试一下:
获取成功。
(4)使用 map 向 request 域对象共享数据
还可以使用 map 集合来实现,这时候向 map 集合中存放的数据,就是要共享的数据:
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
map.put("testScope", "hello,Map");
return "success";
}
测试一下:
获取成功。
(5)使用 ModelMap 向 request 域对象共享数据
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
modelMap.addAttribute("testScope", "hello,ModelMap");
return "success";
}
测试一下:
获取成功。
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:
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:
获取成功。
感谢《尚硅谷》的学习资源。
来源:https://blog.csdn.net/wessonlan/article/details/124812960


猜你喜欢
- 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下首先来看一下我们要做成的而效果:主页面要显示一个view
- 背景:最近项目中涉及到自定义线程池中子线程获取父线程的traceId,这个数据的传递过程可以用lamdba表达式进行封装实现的。这让我想到s
- 最近在搭建springmvc的框架,遇到的这样的问题:在地址栏访问登陆界面访问不了,http://localhost/XXXX/WEB-IN
- 最近再开发中遇到需要将文件上传到Linux服务器上,至此整理代码笔记。此种连接方法中有考虑到并发问题,在进行创建FTP连接的时候
- 目录一、Ehcache缓存简介Hibernate缓存EhCache缓存特点对比Redis缓存二、集成SpringBoot框架1、核心依赖2、
- 动态内存管理为什么存在动态内存分配我们到现在为止掌握的是什么样的内存开辟方式呢//创建一个变量int val = 20; &n
- 快速排序------------------------------------------------------------------
- 最近在进行android开发过程中,在将 Intent传递给调用的组件并完成组件的调用时遇到点困难,并且之前对Intent的学习也是一知半解
- C#代码与javaScript函数的相互调用 问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量
- 使用redis scan方法无法获取connection,导致线程锁死。0、关键字redisspringbootredistemplates
- 本文实例讲述了Android实现基于滑动的SQLite数据分页加载技术。分享给大家供大家参考,具体如下:main.xml如下:<men
- ViewPager有个方法叫做:setPageTransformer(boolean reverseDrawingOrder, PageTr
- 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。对于文件上传,浏览器在上
- jsoup是一个非常好用的html解析工具。使用时需要下载相应的jar包。下面就是我使用jsoup解析html的表格的java源
- 【开发环境】物理机版本:Win7旗舰版(64位)Android Studio版本:2.1正式版【Android Studio的优势】•基于G
- Apache Shiro官网:https://shiro.apache.org/spring-boot.html.一、依据官网快速搭建Qui
- 1 需求描述我们现在要干一个什么事情呢,我们要在浏览器输入一个请求地址,然后我们的后端就给我返回一个User对象即可,并且我希望以Json的
- 添加Hibernate配置文件提示 解压hibernate.jar包 在org\hibernate目录下找到hibernate-config
- 方法的返回值为什么要有带返回值的方法呢?调用处拿到方法的结果之后,才能根据结果进行下一步操作带返回值方法的定义和调用:如果在调用处,要根据方
- 其实SynchronousQueue 是一个特别有意思的阻塞队列,就我个人理解来说,它很重要的特点就是没有容量。直接看一个例子:packag