SpringMVC转发与重定向参数传递的实现详解

 更新时间:2022年07月18日 15:36:17   作者:浮生夢  
这篇文章主要介绍了SpringMVC转发与重定向参数传递,对于重定向,可以通过FlashMap或RedirectAttributes来在请求间传递数据,因为重定向涉及两个独立的HTTP请求,而转发则在同一请求内进行,数据可以直接通过HttpServletRequest共享,需要的朋友可以参考下

重定向

@Controller
public class RedirectController {
	@GetMapping("/a")
	public String a(HttpServletRequest request, Model model) {
		request.setAttribute("username", "zhangsan");
		return "redirect:/b";
	}
	@GetMapping("/b")
	@ResponseBody
	public String b(Model model) {
        //这里获取不到值
		String username = (String) model.getAttribute("username");
		return username;
	}
}

以上代码访问/a后,就会重定向到/b,但是由于是两个单独的请求(这两个请求都是由浏览器发出的,所以浏览器上的地址会变成/b)。

那如果我们想把a请求的某些数据传递给b请求,我们就可以用model来实现:

@GetMapping("/a")
public String a(HttpServletRequest request, Model model) {
    model.addAttribute("username", "zhangsan");
    return "redirect:/b";
}

那么在重定向的时候,访问路径为:http://localhost:8080/b?username=zhangsan
这样在b请求中就能拿到username了,比如:

@Controller
public class RedirectController {
	@GetMapping("/a")
	public Strin a(HttpServletRequest request, Model model) {
		model.addAttribute("username", "zhangsan");
		return "redirect:/b";
	}
	@GetMapping("/b")
	@ResponseBody
	public String b(Model model, String username) {
        //这里可以获取不到值
		//String username = (String) model.getAttribute("username");
        //这里可以获取到值
		return username;
	}
}

注意,model.getAttribute()是拿不到username的。

我们可以通过FlashMap来进行传递:

@Controller
public class RedirectController {
	@GetMapping("/a")
	public String a(HttpServletRequest request, Model model) {
		FlashMap outputFlashMap = RequestContextUtils.getOutputFlashMap(request);
		outputFlashMap.put("username", "zhangsan");
		return "redirect:/b";
	}
	@GetMapping("/b")
	@ResponseBody
	public String b(HttpServletRequest request, Model model) {
        //这里可以获取到值
		Map<String, ?> inputFlashMap = RequestContextUtils.getInputFlashMap(request);
		String username = (String) inputFlashMap.get("username");
		return username;
	}
}

把要传递的参数存入outputFlashMap,在b请求里通过inputFlashMap就可以拿到了,底层是基于session来实现的。

在获取时,也可以使用model来获取:

@GetMapping("/b")
@ResponseBody
public String b(HttpServletRequest request, Model model) {
    //这里可以获取到值
    String username = (String) model.getAttribute("username");
    return username;
}

我们也可以利用RedirectAttributes参数来进行传递:

@Controller
public class RedirectController {
	@GetMapping("/a")
	public String a(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes) {
		redirectAttributes.addFlashAttribute("username", "zhangsan");
		return "redirect:/b";
	}
	@GetMapping("/b")
	@ResponseBody
	public String b(HttpServletRequest request, Model model) {
        //这里可以获取到值
		String username = (String) model.getAttribute("username");
		return username;
	}
}

启动仍然时基于FlashMap,进而基于session来的。

转发

转发就比较简单了,因为一直时同一个请求,所以数据本身就是共享的。

@Controller
public class ForwardController {
	@GetMapping("/a")
	public String a(HttpServletRequest request, Model model) {
		request.setAttribute("username", "zhangsan");
		return "forward:/b";
	}
	@GetMapping("/b")
	@ResponseBody
	public String b(HttpServletRequest request, Model model) {
        //这里可以获取到值
		String username = (String) request.getAttribute("username");
		return username;
	}
}

以上就是转发,request是同一个,是共享的,但是注意

model不是同一个,是不共享的,这也能体现出来model和request的区别了,每个Controller中的方法都会对应的一个Model。

@Controller
public class ForwardController {
	@GetMapping("/a")
	public String a(HttpServletRequest request, Model model) {
		model.addAttribute("username", "zhangsan");
		return "forward:/b";
	}
	@GetMapping("/b")
	@ResponseBody
	public String b(HttpServletRequest request, Model model) {
		//这里获取不到值
        String username = (String) model.getAttribute("username");
		return username;
	}
}

到此这篇关于SpringMVC转发与重定向参数传递的实现详解的文章就介绍到这了,更多相关SpringMVC转发与重定向内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Exception 捕获和显示实例详解

    Java Exception 捕获和显示实例详解

    这篇文章主要介绍了Java Exception 捕获和显示实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • 30分钟入门Java8之默认方法和静态接口方法学习

    30分钟入门Java8之默认方法和静态接口方法学习

    这篇文章主要介绍了30分钟入门Java8之默认方法和静态接口方法学习,详细介绍了默认方法和接口,有兴趣的可以了解一下。
    2017-04-04
  • StringBuffer与StringBuilder底层扩容机制与常用方法

    StringBuffer与StringBuilder底层扩容机制与常用方法

    这篇文章主要给大家介绍了StringBuffer、StringBuilder底层扩容机制与常用方法,有感兴趣的小伙伴跟着小编一起来学习吧
    2023-07-07
  • 带你了解Java数据结构和算法之前缀,中缀和后缀表达式

    带你了解Java数据结构和算法之前缀,中缀和后缀表达式

    这篇文章主要为大家介绍了Java的前缀,中缀和后缀表达式 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • JDK21无法导入TimeUnit类的解决办法

    JDK21无法导入TimeUnit类的解决办法

    这篇文章主要给大家介绍了关于JDK21无法导入TimeUnit类的解决办法,TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),需要的朋友可以参考下
    2024-01-01
  • Java数据结构之线段树的原理与实现

    Java数据结构之线段树的原理与实现

    线段树是一种二叉搜索树,是用来维护区间信息的数据结构。本文将利用示例详细讲讲Java数据结构中线段树的原理与实现,需要的可以参考一下
    2022-06-06
  • IDEA无法使用Git Pull的问题

    IDEA无法使用Git Pull的问题

    本文主要介绍了IDEA无法使用Git Pull的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Docker搭建前端Java的开发环境详解

    Docker搭建前端Java的开发环境详解

    相信每个人入职第一天就是搭建本地开发环境,因为我司用的是java,看见了多年不见的eclipse的图标出现我的电脑上,我是难过的。后来知道并不是我一个人有此感受。这篇文章是为了解决前后端开发没有彻底分离的坑,详细的给大家介绍了利用Docker搭建前端Java的开发环境。
    2016-10-10
  • SpringMVC前后端参数映射

    SpringMVC前后端参数映射

    在web开发中我们都要进行前端传参后端取参的过程,本文主要介绍了SpringMVC前后端参数映射,针对GET, POST, PUT, DELETE 请求的参数该如何映射,感兴趣的可以了解一下
    2023-08-08
  • Java之Swagger配置扫描接口以及开关案例讲解

    Java之Swagger配置扫描接口以及开关案例讲解

    这篇文章主要介绍了Java之Swagger配置扫描接口以及开关案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08

最新评论