Controller之间的重定向

这篇博客探讨了Java中重定向和请求转发的区别,特别是在Spring框架下如何进行带参数的重定向。介绍了三种Spring支持的重定向方式,包括通过Model、URL拼接和RedirectAttributes。强调了如果目标Controller没有返回值且参数列表为空时,重定向可能会导致错误。还提到了RedirectAttributes的addFlashAttributes方法,并简要说明了目标Controller如何根据初始Controller传递参数的方式(如@RequestParam和@PathVariable)来接收参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java中原生的重定向和请求转发
重定向:response.sendRedirect(url) 如果有参数,就只将参数拼接在url 上
请求转发:request.getRequestDispatcher(url).forward(request,response) 请求转发的参数一般存放在request 域中

在spring 中提供的重定向的方式(当然可以使用原生的重定向)主要介绍带参的重定向
1. 将参数放在Model 中

public String Test(Model model){
    int id =5;
	model.addAttributes("id",id);
	return "redirect:/user/{id}";
}
这样传递的URL:/user/5
目标Controller 接收参数:
@GetMapping("/user/{id}")
public void ToController(Model model,@PathVariable("id") Interget id){.....}
很遗憾的是:测试失败报错model 中没有“id”  尚待解决

Model:可以作为controller 的入参,同时可以向页面传递数据(在有引擎模板的时候在页面中使用el 语句获取里面的值)本质上数据是保存在session 中的;

数据的领域模型也叫做Model:这是一个抽象的概念

2. 直接将数据拼接在URL后面

return “redirect:/user?id =”+id;
直接拼接参数在遇到中文是会出错
严谨一点不是很建议这样使用

3. 使用一个特别好用的类RedirectAttributes

public String Test(RedirectAttributes att){
	int id = 5;
	att.addAttriutes("id",id);
	return "redirect:/user";
}
URL:/user?id =5
目标Controller接收数据
@Get Mapping("/user")
public void toController(@RequestParam("id") Integer id,HttpServletResponse response ){.....}

这里有一个细节要注意:如果重定向的 目标Controller 没有返回值(void ) 参数列表里面一定要加:HttpServletResponse response 不然就会报错
RedirectAttributes 还有一个方法:addFlashAttributes(key,value);
addFlashAttributes 的用法:

1. 向页面传递数据:本质上市存放在session 中的,在页面使用el 表达式获取相应的数据
2. 用于传递数据:数据会被隐【接收的方式还是get但是数据会被隐藏】
 att.addFlashAttribute("id",x);
 return "redirect:/tget";
 接收:
 @GetMapping("/tget")
  public void  TargetTest(@ModelAttribute("id")Integer id, HttpServletResponse response){ }
 
  1. 使用ModelAndView
public ModelAndView Test(){
	return new ModelAndView(url )  如果有参数直接拼接在url 上面
}
拼接的URL:/user?id = 5;
接收:
@RequestParam("id")
好处:不受@ResponseBody 的限制。当返回类型为String时就不能有注解@ResponseBody

重定向基本是get 方式,目标Controller 怎么接收参数取决于起始Controller是怎么将参数传过去的:

1. 字符串拼接:?–@RequestParam()
2. 占位/{id} --@PathVariable()

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值