Spring MVC之转发与重定向

本文探讨了Spring MVC中的两种请求处理方式:转发(forward)和重定向(redirect)。转发是在服务器内部完成资源的跳转,而重定向则涉及到客户端的多次HTTP请求,导致URL显示变化。在需要保持请求上下文时通常使用转发,当需要改变请求URL或者防止表单重复提交时则选择重定向。

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

Spring MVC之转发与重定向

1.转发:forWard

涵义:所谓转发“forward”就是控制器“collection”向服务器发出请求,例如发生资源无法查询时,将会自动将请求转到服务器中的其他资源中,将资源获取到。这就是所谓的转发!转发就是一次控制器与服务器的一次交互动作。

转发过程: 客户端浏览器发送http请求 → web服务器接受此请求 → 调用内部的一个方法在容器内部完成请求处理和转发动作 →
将目标资源发送给客户。

部分代码如下:

注解:/** * 返回String类型转发写法 */
 @RequestMapping("/forwardString") 
public String forwardString(User user, Model model, HttpServletRequest request){ 
System.out.println("forwardString;user="+user); 
model.addAttribute("msgM","来自forwardString"); 
request.setAttribute("msgR","来自forwardString"); 
return "forward:/requestForward/result";
 } 
注解:/** * 返回ModelAndView类型转发写法 */ 
@RequestMapping("/forwardMV")
 public ModelAndView forwardMV(User user,HttpServletRequest request){
 System.out.println("forwardMV;user="+user); 
ModelAndView mv=new ModelAndView("forward:/requestForward/result"); mv.addObject("msgM","来自forwardMV"); 
request.setAttribute("msgR","来自forwardMV"); return mv; } }
优势:
1.	节省服务器资源
2.	只与服务器进行一次交互

2.重定向:redirect
涵义:重定向就是与服务器进行了多次交互的动作。在第一次发送请求时浏览器提示URL地址发生了改变,提示要更新URL方能调用资源。

重定向过程: 客户端浏览器发送http请求 → web服务器接收后发送30X状态码响应及对应新的location给客户浏览器 →
客户浏览器发现是30X响应,则自动再发送一个新的http请求,请求url是新的location地址 →
服务器根据此请求寻找资源并发送给客户。

如若不懂,请参考以下图:图片采用网络,可以对转发与重定向的区别进行理解。
在这里插入图片描述

部分代码如下:

注解:/** * 使用String方式 */
 @RequestMapping("/redirectString") 
public String redirectString(User user, Model model, HttpServletRequest request) { 
System.out.println("redirectString;user="+user); 
//重定向中添加到Model中的数据会以参数的形式拼接在url后,可以用来传递数据 model.addAttribute("msgM","来自redirectString");
 //重定向时,request请求会丢失 request.setAttribute("msgR","来自redirectString"); return "redirect:/requestRedirect/result";
 }

总结:在什么情况下用forward与redirect呢?一般情况下,在获取本地资源下采用forward,在引用外部资源时,就是在URL发生改变时采用重定向“redirect”。

Spring MVC 中,可以使用重定向转发来进行请求的跳转。下面是设定重定向转发的几种方式: 1. 重定向: - 使用 `RedirectView` 类:可以在控制器方法中返回一个 `RedirectView` 对象,设置重定向的目标 URL。 - 使用 `RedirectAttributes` 类:可以在控制器方法中将重定向的目标 URL 添加到 `RedirectAttributes` 对象中,并使用 `redirect:` 前缀来指示重定向。 2. 转发: - 使用 `ModelAndView` 类:可以在控制器方法中返回一个 `ModelAndView` 对象,设置转发的视图名称。 - 使用 `forward:` 前缀:可以在控制器方法中使用 `return "forward:/path"` 的方式来指示转发到指定的路径。 下面是一个示例,展示如何在控制器方法中设定重定向转发: ```java @Controller public class MyController { @GetMapping("/redirect") public RedirectView redirectToUrl() { RedirectView redirectView = new RedirectView(); redirectView.setUrl("https://www.example.com"); return redirectView; } @GetMapping("/redirectWithAttributes") public String redirectWithAttributes(RedirectAttributes attributes) { attributes.addAttribute("param", "value"); return "redirect:/targetUrl"; } @GetMapping("/forward") public ModelAndView forwardToView() { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("forward:/targetView"); return modelAndView; } } ``` 上述代码中,`/redirect` 路径的请求会被重定向到 `https://www.example.com`,`/redirectWithAttributes` 路径的请求会带着参数重定向到 `/targetUrl`,`/forward` 路径的请求会被转发到 `targetView` 视图。 需要注意的是,在设定重定向转发时,可以使用绝对路径或相对路径,具体根据需求来确定。同时,还可以在路径中使用占位符和路径参数来实现动态的跳转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值