Springmvc中轉發和重定向

文采杰出發表於2024-07-08
  • 配置IndexController
package com.powernode.springmvc.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class IndexController {
    @RequestMapping("/")
    public ModelAndView index(){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("index");
        return modelAndView;
    }
}
  • 配置index.html頁面
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a th:href="@{/a}">A頁面</a><br>
<a th:href="@{/b}">B頁面</a><br>
</body>
</html>
  • 配置ForwardController類
package com.powernode.springmvc.controller;

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

@Controller
public class ForwardController {
    @RequestMapping("/a")
    public String toA(){
        //返回邏輯檢視名稱view物件為ThymeleafView
        return "a";
        //返回的不是邏輯檢視名稱,而是以轉發的方式跳轉到另一個頁面,轉發底層會建立InternalResourceView然後根據"forward:/b"建立ThymeleafView:"b"物件
//        return "forward:/b";
        //重定向底層會建立RedirectView物件,見圖1,然後根據"redirect:/b"建立ThymeleafView物件,見圖2
//        return "redirect:/b";
    }

    @RequestMapping("/b")
    public String toB(){
        return "b";
    }
}

圖1:
圖2:

這說明轉發底層建立的檢視物件是:InternalResourceView。
思考:既然會建立InternalResourceView,應該會對應一個檢視解析器呀(InternalResourceViewResolver)?但是我在springmvc.xml檔案中只配置了ThymeleafViewResolver,並沒有配置InternalResourceViewResolver呀?這是為什麼?
這是因為forward: 後面的不是邏輯檢視名,而是一個請求路徑。因此轉發是不需要檢視解析器的。
另外,轉發使用的是InternalResourceView,也說明了轉發是內部資源的跳轉。(Internal是內部的意思,Resource是資源的意思。)同時InternalResourceViewSpring 也是MVC框架內建的,專門為JSP模板語法準備的

相關文章