SpringMVC 的视图--转发与重定向

本文详细讲解了SpringMVC中的转发与重定向的区别,包括它们的内部原理、浏览器行为、Request域数据共享,并提供了相关代码实例。重点展示了如何在Thymeleaf视图中利用这两种方式,以及它们在视图解析和数据传递中的作用。
摘要由CSDN通过智能技术生成

转发与重定向的区别

转发是实际上是服务器内部的一次请求,重定向是客户端的两次请求。基本表现为转发时候浏览器地址不会发生改变,而重定向会改变。由此导致对应 Request 域来说,转发能够在内共享数据,而重定向则不能。当然,转发只能跳转服务器内部的URL指令,重定向能够跳转服务器外部URL。两者各有用途,本文主要简单罗列在 Spring MVC 中的基本使用。

直接将 Spring MVC 的转发与重定向代码复制如下:

@Controller
@RequestMapping("/testView")
public class VieController {
    @RequestMapping("/testThymeleafView")
    public String thymeleafView(){
        return "first";
    }
    @RequestMapping("/testForward")
    public String forwardView(){
        return "forward:/testView/testThymeleafView";
    }
    @RequestMapping("/testRedirect")
    public String redirectView(){
        return "redirect:/testView//testThymeleafView";
    }
}

浏览器代码地址
其中第一个请求 http://localhost:8080/SpringMVC/testView/testForward 为转发和重定向的页面,这里利用了 ThymeleafView 技术,转发的页面为 first.html 。
/testForward 请求为转发页面。 /testRedirect 为重定向页面。
首先,观察浏览器的不同点,
分别在输入:
http://localhost:8080/SpringMVC/testView/testRedirect
http://localhost:8080/SpringMVC/testView/testForward
浏览器会显示:
http://localhost:8080/SpringMVC/testView//testThymeleafView
http://localhost:8080/SpringMVC/testView/testForward
浏览器地址会在重定向的时候再次发送一个新的URL,在转发时则不会改变。

request 于内容变化
为了更好的测试,将后端代码改为:

@Controller
@RequestMapping("/testView")
public class VieController {
    @RequestMapping("/testThymeleafView")
    public String thymeleafView(HttpServletRequest request){
        return "first";
    }
    @RequestMapping("/testForward")
    public String forwardView(HttpServletRequest request){
        request.setAttribute("test","testForward");
        return "forward:/testView/testThymeleafView";
    }
    @RequestMapping("/testRedirect")
    public String redirectView(HttpServletRequest request){
        request.setAttribute("test","testRedirect");
        return "redirect:/testView/testThymeleafView";
    }
}

这里主要分别修改 Request 域的数据,其中 键值为 test ,对于转发与重定向分别写入,对前端页面进行展示最终 Request 域中 test 的 value 值。
代码如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.themleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
测试结果:
<p th:text="${test}"></p>
</body>
</html>

浏览器输入:http://localhost:8080/SpringMVC/testView/testForward
前端显示为

测试结果:
testForward

由此可知在转发状态下,转发的页面能够进行数据共享的。

浏览器输入:http://localhost:8080/SpringMVC/testView/testRedirect
测试结果

测试结果:

结果为空可知,重定向无法共享 Request 域的数据。
当然,Application,Session 这两个更大范围的域在转发和重定向都是可以共享数据的。

在 Spring MVC 中,无论是直接到页面还是转发重定向,都会经过SpringMVC中的视图解析器的View接口,视图的作用渲染数据,将模型Model中的数据展示给用户。SpringMVC视图的种类很多,默认有转发视图和重定向视图。若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView。
在代码中,ThymeleafView当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置
的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转。
SpringMVC中默认的转发视图是InternalResourceView,SpringMVC中创建转发视图的情况:当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转。
SpringMVC中默认的重定向视图是RedirectView,当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转。

Spring MVC 中确定哪个接口的源码方法如下:

View view;
if (viewName != null) {
      view = this.resolveViewName(viewName, mv.getModelInternal(), locale, request);
      if (view == null) {
            throw new ServletException("Could not resolve view with name '" + mv.getViewName() + "' in servlet with name '" + this.getServletName() + "'");
     }
    } else {
       view = mv.getView();
       if (view == null) {
       throw new ServletException("ModelAndView [" + mv + "] neither contains a view name nor a View object in servlet with name '" + this.getServletName() + "'");
   }}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringMVC提供了两种方式来实现重定向转发:逻辑视图名和重定向/转发关键字。 1. 逻辑视图实现重定向转发 重定向转发可以通过在处理器方法中返回逻辑视图实现。具体实现方式如下: - 转发:在处理器方法中返回逻辑视图名,SpringMVC会将逻辑视图名解析为对应的视图对象,并将请求转发到该视图。 ```java @RequestMapping("/forward") public String forward() { return "forward:/some/other/url"; } ``` - 重定向:在处理器方法中返回逻辑视图名,并在逻辑视图名前加上"redirect:"前缀,SpringMVC会将逻辑视图名解析为重定向的目标地址,并将请求重定向到该地址。 ```java @RequestMapping("/redirect") public String redirect() { return "redirect:/some/other/url"; } ``` 2. 重定向/转发关键字实现重定向转发 重定向转发还可以通过使用SpringMVC提供的重定向/转发关键字实现。具体实现方式如下: - 转发使用"forward:"关键字加上转发目标地址,SpringMVC会将请求转发到该地址。 ```java @RequestMapping("/forward") public String forward() { return "forward:/some/other/url"; } ``` - 重定向使用"redirect:"关键字加上重定向目标地址,SpringMVC会将请求重定向到该地址。 ```java @RequestMapping("/redirect") public String redirect() { return "redirect:/some/other/url"; } ``` 总之,SpringMVC提供了多种方式来实现重定向转发开发者可以根据实际需求选择合适的方式来实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值