1.SpringMVC中的转发和重定向
1.什么是转发
请求转发
- 概念:一种在服务器内容资源跳转的方式【内部】【同一个请求链】
- 原理图:
转发的方法:
- 得到转发器 request.getRequestDispatcher(“/要跳转到地址”)
- 调用转发器的方法: forward(request, response) //将请求和响应对象转发给下一个页面
- 写成一句话: request.getRequestDispatcher(“/url”).forward(request, response);
转发的特点:
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求,可以使用request对象来共享数据
访问例子:http://localhost:8080/request_demo/demo4 请求域中数据不会丢失
2.什么是重定向
- 概念:由客户端浏览器进行的页面跳转,两次发送请求给不同的页面。
- 原理图:
重定向的方法:
response.sendRedirect(“访问的地址”)
重定向的特点:
- 地址栏发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是两次请求。不能使用request对象来共享数据
重定向和转发的区别
区别 | 转发 | 重定向 |
---|---|---|
根目录 | 使用的服务器端根目录: http://localhost:8080/项目访问地址/ | 使用浏览器端的根目录: http://localhost:8080/ |
地址栏 | 不会变化 | 会 |
哪里跳转 | 由服务器进行的跳转 | 由客户端浏览器进行的跳转 |
请求域 | 不会丢失数据 | 会,因为不是同一次请求 |
总结: 转发相当于是把A的请求在B与C之间共享
如果想要单纯的做跳转,使用重定向
如果想要做在多个页面交互中,需要把请求中的数据共享的可以使用转发
实质
forward是应用程序内部跳转(可以在当前web应用中任意跳转)
sendRedirect是重定向,即相当于用户在地址栏直接输入URL发送请求.当需要跳转到其他的web应用,只能使用sendRedirect。
了解了什么是转发,什么是重定向,下面让我们看看在Spring-MVC中如何使用重定向和转发
3.通过SpringMVC来实现转发和重定向 - 无需视图解析器
1.测试前,在我们的springmvc-servlet.xml文件中,将视图解析器注释掉
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
2.注释掉后编写我们的controller
package com.sangyu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author sangYu
* @date 2023/3/2
*/
@Controller
public class HelloController {
@RequestMapping("/01")
public String test01(Model model){
model.addAttribute("msg","hello01");
//转发
return "/hello01.jsp";
}
@RequestMapping("/02")
public String test03(Model model){
model.addAttribute("msg","hello02");
//转发2
return "forward:/hello01.jsp";
}
@RequestMapping("/03")
public String test02(Model model){
model.addAttribute("msg","hello03");
//重定向
return "redirect:/hello01.jsp";
}
}
需要注意的是,我们的hello01.jsp需要写在web目录下,写在WEB-INF目录下无法访问
forward:转发
redirect:重定向
4.通过SpringMVC来实现转发和重定向 - 有视图解析器
1.首先在springmvc-servlet.xml文件中定义我们的视图解析器
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
2.重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方嘛 , 所以注意路径问题.
可以重定向到另外一个请求实现
package com.sangyu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author sangYu
* @date 2023/3/2
*/
@Controller
public class HelloController {
@RequestMapping("/01")
public String test01(Model model){
model.addAttribute("msg","hello01");
//转发
return "hello01";
}
@RequestMapping("/02")
public String test02(Model model){
model.addAttribute("msg","hello02");
//重定向
return "redirect:/index.jsp";
}
}