SpringMVC:向三大域对象存数据

2024-06-03 01:04

本文主要是介绍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>

这篇关于SpringMVC:向三大域对象存数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025595

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推