SpringMVC使用域对象共享数据

news2024/10/6 4:13:46

1、SpringMVC中的域对象

此处只有request、session、servletContext被使用,而page是jsp页面的域,不使用jsp。

  • request:一次请求的范围内
  • session:一次会话的范围内
  • servletContext:整个web的应用范围内

2、向request域对象共享数据的几种方式

(1)使用ServletAPI

控制器方法存入数据

@RequestMapping("/testRequestByServletAPI")
public String testRequestByServletAPI(HttpServletRequest request){
    request.setAttribute("username", "zhangsan");
    request.setAttribute("password", "123456");

    return "success";
}

前端页面读取数据

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

(2)使用ModelAndView

什么是ModelAndView

ModelAndView是一个类,可以利用它的对象设置当前请求的视图跳转数据共享

不管使用什么方式,Spring最终都会将模型数据和视图封装到ModelAndView中。

ModelAndView对象的作用

有两个功能。

Model:向request域中共享数据

View:设置视图跳转。可以设置视图名称(setViewName),也可以设置视图(setView)

示例

通过ModelAndView,向request域中存放数据

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
    ModelAndView mav = new ModelAndView();
    //处理模型数据,即向request域共享数据
    mav.addObject("username", "lisi");
    mav.addObject("password", "456789");

    //处理视图数据,即设置视图名称
    mav.setViewName("success");

    return mav;
}

读取数据和之前的前端页面一致

<p th:text="${username}"></p>
<p th:text="${password}"></p>

注意

如果在控制器方法中使用了ModelAndView对象,那么该mav对象必须作为方法的返回值返回

否则SpringMVC无法知晓你使用了ModelAndView

(3)使用Model

什么是Model

指的是ModelAndView中的Model

Model的作用

共享数据

示例

@RequestMapping("/testModel")
public String testModel(Model model){
    model.addAttribute("username", "wangwu");
    model.addAttribute("password", "555555");
    return "success";
}

注意

单独使用Model

  • 形参是Model类型
  • 返回值是String类型,返回视图名称

(4)使用Map集合

什么叫使用map向request域共享数据

之前将Model类型作为控制器方法的形参,通过设置model的参数,就达到了共享数据的效果。

如果使用Map集合,也是一样的效果。

将Map类型作为形参,方法体中给map添加键值对,也可以直接将键值对保存到域对象。

示例

@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){

    map.put("username", "gaoliu");
    map.put("password", "666666");

    return "success";
}

(6)原理分析及总结

a. 为什么Model、ModelMap、Map,都能以同样的方式共享数据?

Model、ModelMap、Map类型的参数,其实本质上都是 BindingAwareModelMap 类型。这是Spring做的,并不是原生类型。

具体来说,它们实例化时,都用的是 BindingAwareModelMap 这个类。

那么Model、ModelMap、Map一定存在着联系。

先看Model的源码

public interface Model {...}

说明它是Spring中,模型部分的顶层接口。

ModelMap的源码

public class ModelMap extends LinkedHashMap<String, Object> {...}

它继承了LinkedHashMap,而LinkedHashMap实现了Map接口。所以ModelMap也属于一个Map接口的实现类

ModelMap的继承结构

BindAwareModelMap是ModelMap的子类,所以BindAwareModelMap可以实例化ModelMap。既然ModelMap实现了Map,那么BindAwareModelMap也可以实例化Map

BindAwareModelMap的继承结构

BindAwareModelMap的父类是ExtendedModelMap

public class ExtendedModelMap extends ModelMap implements Model {...}

ExtendedModelMap继承了ModelMap类,并且实现了Model接口,所以BindAwareModelMap可以实例化Model类型

总结

Model、ModelMap、Map的关系:

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

b.为什么这几种方式都没有指定request域,却都被称作向request域对象中共享数据?

首先,Model、ModelMap或是Map的方式,最终都会由SpringMVC封装成ModelAndView对象。

而使用ModelAndView的方式,是我们自己组装了ModelAndView对象并返回给了SpringMVC。

所以,这个问题的本质是,ModelAndView对象如何向request域对象中存放数据?

ModelandView是将 视图信息和数据封装到一起的,spring来解析ModelandView中的信息,包括视图和数据 ,然后将数据set到request里面,并且根据model里面的视图信息以及spring mvc的配置让request进行跳转。

 

3、向session域对象共享数据

使用ServletAPI比较简单

@RequestMapping("/testSession")
public String testSession(HttpSession session){
    session.setAttribute("username", "xiaowb");
    session.setAttribute("password", "000000");
    return "success";
}

前端获取session域对象中的值

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

thymeleaf获取session域对象中的数据时,需要加session.键名

4、向servletContext域对象共享数据

注意

在jsp、Thymeleaf等模板引擎中,servletContext通常被叫做application,本质是一样的。

所以在获取servletContext对象时,最好也叫做application。

使用ServletAPI比较简单

@RequestMapping("/testSessionContext")
public String testServletContext(HttpSession session){
    ServletContext application = session.getServletContext();
    application.setAttribute("username", "xiaocs");
    application.setAttribute("password", "999999");
    return "success";
}

前端获取application域对象中的值

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

thymeleaf获取application域对象中的数据时,需要加application.键名

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL高级第十七篇:数据库主从复制原理及保证数据一致性

MySQL高级第十七篇&#xff1a;数据库主从复制原理及保证数据一致性 一、概述1. 提升数据库的并发能力2. 主从复制的作用&#xff1f; 二、主从复制原理三、搭建一主一从环境四、如何解决数据一致性问题&#xff1f;1. 方案一、异步复制2. 方案二、半同步复制3. 方案三、组复制…

3.黑马Springboot原理篇自己修改笔记

原理篇 1.自动配置的工作流程 1.1 bean的加载方式 方式一&#xff1a;配置文件<bean/>标签 缺点&#xff1a;配置bean太繁琐 方式二&#xff1a;配置文件扫描注解定义bean⭐️ 获取bean方式 ①通过配置文件&#xff0c;扫描指定包&#xff0c;加载bean ②通过注解声…

C++ STL之string容器的模拟实现

目录 一、经典的string类问题 1.出现的问题 2.浅拷贝 3.深拷贝 二、string类的模拟实现 1.传统版的string类 2.现代版的string类&#xff08;采用移动语义&#xff09; 3.相关习题* 习题一 习题二 4.写时拷贝 5.完整版string类的模拟实现[注意重定义] MyString.h…

磁珠的工作原理

磁珠是一个耗能元器件&#xff0c;他能把频率相对较高的信号以热量的形式耗散掉&#xff0c;保留频率相对较低的信号。 主要有这种插件的磁珠&#xff0c;还有这种贴片的磁珠。 下面我们来看下磁珠具体工作原理。 磁珠的构造我们可以简单的看成一个导线穿过环形铁氧体的磁性材…

[渗透教程]-015-网络与系统渗透

文章目录 1.0基本概念2.0 网络与系统渗透基本原理2.1 渗透测试2.2 入侵和预防2.3 案例一:从信息收集到入侵提权2.3.1 从域名到ip2.3.2 从IP获取旁站2.3.3 收集系统与⽹络配置详细信息2.3.4 踩点2.3.5发现漏洞2.3.6漏洞利用2.3.7维持系统控制权2.3.8清理访问痕迹2.4 案例二:Goo…

TryHackMe-Jeff(boot2root | Hard?)

Jeff 你能破解杰夫的网络服务器吗&#xff1f; 如果你发现自己在暴力破解SSH&#xff0c;你就做错了。 端口扫描 循例nmap 进80&#xff0c;是一个空页面&#xff0c;查看源代码 将jeff.thm加入hosts 上gobuster /admin是空页面&#xff0c;/backups也没东西&#xff0c;/up…

Centos安全加固策略

目录 密码安全策略 设置密码的有效期和最小长度 设置用户密码的复杂度 登录安全策略 设置用户远程登录的安全策略 安全的远程管理方式 访问控制 限制root用户登录 修改ssh 22端口 设置登录超时时间 限制IP访问 安全审计 审核策略开启 日志属性设置 查看系统登录…

基础巩固、探寻Java装箱和拆箱的奥妙!

前言 今天在逛某知名论坛的时候&#xff0c;看到一篇"请不要使用包装类型&#xff0c;避免造成性能损失"的文章。一下子就吸引了我的注意。大意就是&#xff0c;能用基本数据类型就尽量用基本数据类型&#xff0c;因为包装类型自动拆箱、装箱会带来性能损失尤其是循环…

函数式编程#3纯函数的概念

纯函数的概念 文章目录 纯函数的概念纯函数的两种形式&#xff1a;调用目标本身,不会改变函数内部,不受函数外部影响 函数的副作用如何理解"相同的输入得到相同的输出"不是纯函数的映射关系是纯函数的映射关系 纯函数的两种形式&#xff1a; 调用目标本身,不会改变 …

gcc编译 与交叉编译(x86 to arm) (一)单个文件编译

1.1、gcc编译单个c程序&#xff08;hello.c) gcc hello.c -o hello (hello是生成的可执行程序的名字&#xff09;1.2、交叉编译hello.c 源平台&#xff1a; UOS_X86_64 目标平台&#xff1a;UOS_arm 方法&#xff1a;使用现成的交叉编译工具链 参考资料&#xff1a;交叉编译…

【UE】water插件的简单使用

UE Editor版本&#xff1a;4.26 目录 一、岛屿外观修改 二、波浪参数设置 三、水体海洋的颜色设置 四、 水体河流 五、创建可浮在水体上的actor 一、岛屿外观修改 1. 保证“Landmass”和“Water”插件已启用 启用后&#xff0c;搜索water可以看到如下组件 2. 激活地形编…

LeetCode:6390. 滑动子数组的美丽值

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;6390. 滑动子数组的美丽值 题目描述&#xff1a;给你一个长度为 n 的整…

vulnhub DC:4渗透笔记

靶场下载地址:https://vulnhub.com/entry/dc416-2016,168/ 信息收集 使用nmap确定靶场ip地址 扫描ip确定开放端口 开放22 80端口&#xff0c;访问一下网页端(这边断了一次靶机ip改为192.168.100.138) 漏洞利用 登录框尝试爆破 发现用户名密码admin happy 登录进入后发现这里…

【自然语言处理】【大模型】LaMDA:用于对话应用程序的语言模型

LaMDA&#xff1a;用于对话应用程序的语言模型 《LaMDA: Language Models for Dialog Applications》 论文地址&#xff1a;https://arxiv.org/abs/2201.08239 相关博客 【自然语言处理】【大模型】LaMDA&#xff1a;用于对话应用程序的语言模型 【自然语言处理】【大模型】Dee…

如何衡量 SLO 的有效性?

衡量 SLO 及错误预算策略是否有效&#xff0c;其实就是看实际运行后&#xff0c;是否真的能达到我们的期望。我们可以从下面三个关键维度来看。 SLO 达成情况。我们用达成&#xff08;Met&#xff09;&#xff0c;或未达成&#xff08;Missed&#xff09;来表示。“人肉”投入…

阿里EGES

EGES&#xff1a;Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba 阿里的EGES是Graph Embedding的一个经典应用&#xff0c;在内容冷启和物料召回上面有较多的落地潜力。主要思想是根据用户交互的物料作为节点构建物料图&#xff0c;在传统的Dee…

(二)AIGC—Stable Diffusion(2)

越往后&#xff0c;加的噪声越多&#xff0c;逐渐递增 正常的话&#xff0c;类似RNN&#xff0c;前向传递&#xff0c;不利于模型训练。 如果直接从x0到xt最好&#xff0c;DPPM这篇论文就实现了这一目标 beta这一参数在扩散过程是已知的&#xff0c;前期设计好&#xff0c;从0…

从0搭建Vue3组件库(六):前端流程化控制工具gulp的使用

随着前端诸如webpack&#xff0c;rollup&#xff0c;vite的发展&#xff0c;gulp感觉似乎好像被取代了。其实并没有&#xff0c;只不过它从台前退居到了幕后。我们仍然可以在很多项目中看到它的身影&#xff0c;比如elementplus、vant等。现在gulp更多的是做流程化的控制。 比如…

【算法题解】28.子集的递归解法

这是一道 中等难度 的题 题目来自&#xff1a; https://leetcode.cn/problems/subsets/ 题目 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 …

51单片机(二)成功点亮LED

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其实STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…