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实现批量下载文件的示例代码

    Java实现批量下载文件的示例代码

    这篇文章主要为大家详细介绍了Java如何实现批量下载文件,并以压缩输出流的形式返回前端,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2023-10-10
  • Idea中Springboot热部署无效问题解决

    Idea中Springboot热部署无效问题解决

    这篇文章主要介绍了Idea中Springboot热部署无效问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 基于java实现斗地主代码实例解析

    基于java实现斗地主代码实例解析

    这篇文章主要介绍了基于java实现斗地主代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 关于Java中增强for循环使用的注意事项

    关于Java中增强for循环使用的注意事项

    for循环语句是java循环语句中最常用的循环语句,一般用在循环次数已知的情况下使用,这篇文章主要给大家介绍了关于Java中增强for循环使用的注意事项,需要的朋友可以参考下
    2021-06-06
  • SpringMvc MultipartFile实现图片文件上传示例

    SpringMvc MultipartFile实现图片文件上传示例

    本篇文章主要介绍了SpringMvc MultipartFile实现图片文件上传示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-02-02
  • Java线程变量ThreadLocal详细解读

    Java线程变量ThreadLocal详细解读

    这篇文章主要介绍了Java线程变量ThreadLocal详细解读,多线程访问同一个变量的时候,很容易出现问题,特别是多线程对一个共享变量进行写入的时候,为了线程的安全在进行数据写入时候会进行数据的同步,需要的朋友可以参考下
    2024-01-01
  • Mybatis动态SQL实例详解

    Mybatis动态SQL实例详解

    这篇文章主要给大家介绍了关于Mybatis动态SQL的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Pattern.compile函数提取字符串中指定的字符(推荐)

    Pattern.compile函数提取字符串中指定的字符(推荐)

    这篇文章主要介绍了Pattern.compile函数提取字符串中指定的字符,使用的是Java中的Pattern.compile函数来实现对指定字符串的截取,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Mybatis动态调用表名和字段名的解决方法

    Mybatis动态调用表名和字段名的解决方法

    今天在项目开发中有个业务是需要限制各个用户对某些表里的字段查询以及某些字段是否显示,这种情况下,就需要构建sql来动态传入表名、字段名了,下面给大家介绍mybatis动态调用表名和字段名的解决方法,一起看看吧
    2016-10-10
  • Java 日期时间工具包–java.time的使用

    Java 日期时间工具包–java.time的使用

    这篇文章主要介绍了Java 日期时间工具包–java.time的使用,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04

最新评论