Springboot redirect重定向使用RedirecAtrributes传递数据

news2024/10/6 17:26:42

参考资料

  1. 【转载】关于重定向RedirectAttributes的用法
  2. RedirectAttributes 的使用

目录

  • 前期准备
  • 一. RedirecAtrributes重定向传参
  • 三. 重定向目标页面接收参数


前期准备

⏹配置文件

server:
  servlet:
    context-path: /jmw

⏹访问url

http://localhost:8080/jmw/test16/init?name=贾飞天&age=18

⏹test16.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <!--
        因为我们配置了 server.servlet.context-path 来指定项目路径,
        而使用 @{}的方式可以自动添加项目路径
        size=${param.size()},name=${param.name} 会渲染为 ?size=xxx&name=xxx
    -->
    <a th:href="@{/test16/changeView(size=${param.size()},name=${param.name})}">页面重定向</a>
</div>
</body>

⏹Thymeleaf渲染之后的效果

<a href="/jmw/test16/changeView?size=2&name=%E8%B4%BE%E9%A3%9E%E5%A4%A9">页面重定向</a>

一. RedirecAtrributes重定向传参

  • redirectAttributes.addAttributie("key", value);
    这种方法相当于在重定向链接地址追加传递的参数。
    以上重定向的方法等同于 return "redirect:/重定向目标页面url?key=value" ,注意这种方法直接将传递的参数暴露在链接地址上,非常的不安全,慎用。

  • redirectAttributes.addFlashAttributie("key", value);
    这种方法是隐藏了参数,链接地址上不直接暴露,但是能且只能在重定向的 “页面” 获取 param 参数值。其原理就是将设置的属性放到 session 中,session中的属性在重定向到目标页面后马上销毁。

import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@GetMapping("/changeView")
public String changeView(@RequestParam String name, RedirectAttributes redirectAttributes) {

    System.out.println(name);  // 贾飞天
	
	// 准备重定向要传递的参数
    Map<String, String> mapParam = new HashMap<>();
    mapParam.put("key1", "110");
    mapParam.put("key2", "120");

    // 在重定向时,会将值放入session中,重定向到目标页面之后,会从session中清除
    redirectAttributes.addFlashAttribute("mapParam1", mapParam);
    // 相当于拼参数放在url后面
    redirectAttributes.addAttribute("param2", name);

    return "redirect:/test17/init";
}

三. 重定向目标页面接收参数

  • 使用ModelMap来接收 redirectAttributes.addFlashAttribute() 中放入的数据
  • 也可以使用ModelAttribute来接收 redirectAttributes.addFlashAttribute() 中放入的数据
  • 使用@RequestParam来接收 redirectAttributes.addAttribute() 中放入的数据
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Controller
@RequestMapping("/test17")
public class Test17Controller {

    @Resource
    private HttpServletRequest request;

    @GetMapping("/init")
    public ModelAndView init(
            // 使用ModelMap来接收 redirectAttributes.addFlashAttribute() 中放入的数据
            ModelMap mapParam1,
            // 也可以使用ModelAttribute来接收 redirectAttributes.addFlashAttribute() 中放入的数据
            @ModelAttribute("mapParam1") Map<String, String> mapParam2,
            // 使用@RequestParam来接收 redirectAttributes.addAttribute() 中放入的数据
            @RequestParam(value = "param2" ,required = false) String param2
    ) {

        System.out.println(mapParam1);  // {mapParam1={key1=110, key2=120}}
        System.out.println(param2);  // 贾飞天

        Map<String, String[]> parameterMap = request.getParameterMap();
        System.out.println(parameterMap);
        /*
        	param2=["贾飞天"]
		*/

        // 如果不为空,说明是从其他页面重定向过来的
        if (!mapParam1.isEmpty()) {

            // 两种获取方式相同
            Map mapParam_1 = (Map)mapParam1.getAttribute("mapParam1");
            System.out.println(mapParam_1.get("key1"));  // 110
            Map mapParam_2 = (Map)mapParam1.get("mapParam1");
            System.out.println(mapParam_2.get("key2"));  // 120
			
			// 将map放入request的Attribute中
            request.setAttribute("testMap", mapParam2);
        }

        // 指定跳转的页面
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("test17");
        return modelAndView;
    }
}

前台页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <div>[[${param.param2}]]</div>

    <!--如果map中有值,才进行渲染-->
    <th:block th:if="${not #maps.isEmpty(testMap)}">
        <div>[[${testMap.key1}]]</div>
        <div>[[${testMap.key2}]]</div>
    </th:block>

</div>
</body>
<script th:inline="javascript">
    const testMap = [[${testMap}]];
    console.log(testMap);
</script>
</html>

在这里插入图片描述

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

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

相关文章

NX二次开发(C#)-UI Styler-选择对象TaggedObject转换为Body、Face等对象

文章目录 1、前言2、选择对象的过滤器2、选择对象类型为TaggedObject3、TaggedObject转换为Face类型1、前言 前面的博客中已经写过了UI Styler中选择对象(selection)的一些内容,但是依然有读者不知道运用,本文将在前文的基础上更加深入的介绍选择对象的应用(建议与https:/…

DevExpress Universal添加对.NET 7的支持

DevExpress Universal添加对.NET 7的支持 DevExpress已经发布了整个产品系列的主要更新。 CodeRush Ultimate 22.2-为许多重构添加了核心性能优化和增强。 DevExpress.NET MAUI 22.2-添加了对Material Design 3指南的支持&#xff0c;以及对数据网格的自定义过滤、排序和分组。…

PCB封装

目录 1.PCB元器件库分类及命名 1.2PCB封装图形要求 2.封装制作 手工制作封装的操作步骤 1.PCB元器件库分类及命名 元器件采用大写字母表示&#xff0c;PCB元器件库分类及命名如表。 2.PCB封装图形要求 &#xff08;1&#xff09;外形&#xff1a;指元器件的最大外形尺寸。封…

【微电网优化】基于粒子群实现微网经济调度,环境友好调度附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Java 中的不同参数类型

是不是还傻傻分不清参数配置到底怎么写&#xff0c;写在哪个位置&#xff0c;那么这篇文章就让你学会。 目录 1、Program arguments 2、VM options 3、Environment variables 最佳实践 打开 IDEA 的 Run Configuration&#xff0c;可以看到以下参数配置 VM optionsProgram…

springboot+vue美食网站idea maven

目 录 摘 要 I 1 绪论 1 1.1研究背景 1 1. 2研究现状 1 1. 3研究内容 2 2 系统关键技术 3 2.1 springboot框架 3 2.2 JAVA技术 3 2.3 MYSQL数据库 4 2.4 B/S结构 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1. 2经济可行…

12.11哈希表

目录 一.哈希表 1.概念 2 冲突-概念 3 冲突-避免 4 冲突-避免-哈希函数设计 直接定制法--(常用) 2. 除留余数法--(常用) 3. 平方取中法--(了解) 4. 折叠法--(了解) 5. 随机数法--(了解) 6. 数学分析法--(了解) 5 冲突-避免-负载因子调节&#xff08;重点掌握&#…

151-160-mysql-高级篇-设计规范及其他调优策略

151-mysql-高级篇-设计规范以及其他调优策略&#xff1a; 1、数据库的设计规范 1. 范 式 1.1 范式简介 **在关系型数据库中&#xff0c;关于数据表设计的基本原则、规则就称为范式。**可以理解为&#xff0c;一张数据表的设计结构需要满足的某种设计标准的级别。要想设计一…

iOS 组件二进制与源码查看及调试方案

好久没有写文章了这里记录一下把项目代码二进制化提高编译效率的整个过程中碰到的问题和解决方案 先提一下优化编译速度的基本方向基本就是从不同的编译阶段来出主意&#xff0c;比如&#xff1a; 预编译阶段的头文件查找&#xff1a; 一款可以让大型iOS工程编译速度提升50%的…

[附源码]Node.js计算机毕业设计大学生心理咨询系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

无法安装vmnet8虚拟网络适配器、vmware network editor未响应、注册失败,请检查账号数据库配置是否正确的解决

文章目录虚拟网络适配器安装 | vmware network editor未响应注册失败&#xff0c;请检查账号数据库配置是否正确的解决关于第一次安装虚拟机的全文约 423 字&#xff0c;预计阅读时长&#xff1a; 2分钟虚拟网络适配器安装 | vmware network editor未响应 原因&#xff1a;卸载…

JDK8 ThreadLocal 源码解析与最佳实践

文章目录用法Example1Example2Springboot Transcation 注解的原理Entry 的 Key 设置为弱引用有什么好处内存泄漏问题为什么 ThreadLocal 不需要 ReferenceQueueget()getEntrygetEntryAfterMissThis class provides thread-local variables. These variables differ from their …

路径规划|多目标海洋捕食者算法(MOMPA)求解最短路径问题(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计1

LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计1 LabVIEW面向对象编程(OOP)采用仪器为中心的硬件抽象层(HAL)&#xff0c;使用面向对象的设计模式&#xff0c;可以部署一个仪器重用库&#xff0c;该库可以随着需求和仪器趋势的变化而增长&#xff0c;同时在不可避免的硬件过…

【Redis】主从复制

一、简介 1、什么是主从复制 主机数据更新后根据配置和策略&#xff0c;自动同步到备机的master/slave机制&#xff0c;Matser以写为主&#xff0c;Slave以读为主&#xff0c;简单来说如下图 2、主从复制的好处 读写分离&#xff1a;Matser以写为主&#xff0c;Slave以读为主…

指针的初步认识

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、指针是什么1.1 如何理解编址…

《深入分布式缓存-从原理到实践》笔记

《深入分布式缓存-从原理到实践》笔记 笔记作者&#xff1a;arthury.dy.lee 日期&#xff1a;2018.12.05 笔记只是本人觉得重要的部分的一些摘要或总结&#xff0c;更侧重于后5章。其它更详细内容&#xff0c;请自行买书阅读。 文章目录《深入分布式缓存-从原理到实践》笔记…

【Linux C】线程简单介绍

线程的概念 基本概念 进程&#xff1a;是指⼀个内存中运⾏的应⽤程序&#xff0c;每个进程都有⼀个独⽴的内存空间&#xff0c;⼀个应⽤程序可以同时运⾏多个进程&#xff1b;进程也是程序的⼀次执⾏过程&#xff0c;是系统运⾏程序的基本单位&#xff1b;系统运⾏⼀个程序即…

时序预测 | MATLAB实现具有外生回归变量的ARIMAX时间序列预测(含AR、MA、ARIMA、SARIMA、VAR对比)

时序预测 | MATLAB实现具有外生回归变量的ARIMAX时间序列预测(含AR、MA、ARIMA、SARIMA、VAR对比) 目录 时序预测 | MATLAB实现具有外生回归变量的ARIMAX时间序列预测(含AR、MA、ARIMA、SARIMA、VAR对比)预测效果基本介绍程序设计ARMAARMAARIMASARIMAARIMAXVAR参考资料预测效果…

LC-6260. 矩阵查询可获得的最大分数(最小堆,并查集+离线(海平面上升问题))【周赛323】

6260. 矩阵查询可获得的最大分数 难度困难7 给你一个大小为 m x n 的整数矩阵 grid 和一个大小为 k 的数组 queries 。 找出一个大小为 k 的数组 answer &#xff0c;且满足对于每个整数 queres[i] &#xff0c;你从矩阵 左上角 单元格开始&#xff0c;重复以下过程&#xf…