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”。