一.转发与重定向的区别
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目录下。内容都是下图所示: