一.转发与重定向的区别

1.重定向:重定向是两次请求,http特点是本身是无状态的,所以状态会丢失,地址栏的地址也会发生改变。由此产生会话的概念,重定向的过程中,传输的信息会丢失。

2.转发:转发是服务器内部把对一个request/response的处理权,移交给另外一个 ,对客户端来说,只是知道自己最早请求的资源,并不知道服务器内部的转移传递,传输的信息不会丢失。

request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp
response.sendRedirect("new.jsp");//重定向到new.jsp



二.控制器

这里展示转发与重定向的内容,其基础环境依然是学习记录(一)中的环境,没有区别。

package com.yzy.controller;/*
@author fishgoudan
@date 2019/9/5 - 11:06
*/

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/send")
public class Send {

    //转发
    @RequestMapping("/forward")
    public String forward(Model model){
        //springmvc model默认上在请求域当中存储值
        model.addAttribute("who","forward");
        return "forward";
    }
    @RequestMapping("/redirect")
    public String redirect(Model model){
        model.addAttribute("who","redirect");
        System.out.println("redirect");
//         如果是重定向就和视图解析规则无关了,也就不存在什么前后缀拼接
//        不带/的写法是相对路径,根据当前上下文,在当前send的上下文中
        return "redirect:/jsp/redirect.jsp";
//        结果,浏览器中访问不到model,因为model的值在uri中显示了,被当作参数了,而不是属性Attribute
    }
//    这个呢,是想要用redirect去访问别的controller
    @RequestMapping("/redirectAnother")
    public String redirectAnother(){
        System.out.println("hello");
        return "redirect:/baby/hello";
    }
    @RequestMapping("/forwardAnother")
    public String forwardAnother(Model model){
        model.addAttribute("who","oofuck");
        return "forward:/baby/hello";
    }
}
一共有四个函数,作用分别是

      1.转发:当访问send/forward的时候,转发到forward页面。在页面中能访问到方法中的model的属性Attribute,也就说明了,转发的时候不会丢失传输的信息

作为重定向时候,return内容必须前面是"redirect:"+“重定向目标的url”

      3.重定向到其他Controller:return格式不变,写上目标的Controller和具体RequestMapping的路径即可,可以转发到其他Controller,信息会丢失。

      4.转发到其他Controller:return格式: return “forward:/路径”(参照上面代码内容),可以转发到其他Controller,并且信息不会丢失

三.jsp页面

只是建了两个页面forward.jsp和redirect.jsp,在jsp目录下。内容都是下图所示:

SpringMVC在转发请求时头部信息 springmvc中的转发和重定向_服务器