SpringMVC視圖轉發重定向區別及控制器詳解

SpringMVC視圖

SpringMVC 中的視圖是 View 接口,視圖的作用是渲染數據,將模型 Model 中的數據展示給用戶。

視圖的種類很多,默認有:轉發視圖和重定向視圖。

若使用的視圖技術為 Thymeleaf,在 SpringMVC 的配置文件中配置瞭 Thymeleaf 的視圖解析器,由此視圖解析器解析之後所得到的是 ThymeleafView。

一、ThymeleafView

當控制器方法中所設置的視圖名稱沒有任何前綴時,此時的視圖名稱會被 SpringMVC 配置文件中所配置的視圖解析器解析。

回顧下spring配置文件裡的視圖解析器的配置:

<!-- 配置Thymeleaf視圖解析器 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!-- 視圖前綴 -->
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <!-- 視圖後綴 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8" />
                    </bean>
                </property>
            </bean>
        </property>
    </bean>

視圖名稱拼接視圖前綴和視圖後綴所得到的最終路徑,會通過轉發的方式實現跳轉。

之前寫的代碼示例一直都是這種,比如:

@RequestMapping("/testThymeleafView")
    public String testThymeleafView() {
        return "success";
    }

二、轉發視圖

SpringMVC中默認的轉發視圖是 InternalResourceView 。

當控制器方法中所設置的視圖名稱以forward:為前綴時,創建 InternalResourceView 視圖。

此時的視圖名稱不會被 SpringMVC 配置文件中所配置的視圖解析器解析,而是會將前綴"forward:"去掉,剩餘部分作為最終路徑通過轉發的方式實現跳轉。

@Controller
public class ViewController {
    @RequestMapping("/testThymeleafView")
    public String testThymeleafView() {
        return "success";
    }
    @RequestMapping("/testToForward")
    public String testToForward() {
        return "forward:/testThymeleafView";
    }
}

控制器方法 testToForward 中,進行瞭轉發forward:/testThymeleafView,去掉forward:之後,就可以轉發到/testThymeleafView上。

也就是說,當我訪問 http://localhost:8080/springmvc/testToForward,應該跳轉顯示出 success 頁。

三、重定向視圖

SpringMVC 中默認的重定向視圖是 RedirectView 。

當控制器方法中所設置的視圖名稱以redirect:為前綴時,創建 RedirectView 視圖。

此時的視圖名稱不會被 SpringMVC 配置文件中所配置的視圖解析器解析,而是會將前綴"redirect:"去掉,剩餘部分作為最終路徑通過重定向的方式實現跳轉。

繼續新增一個控制器方法 testRedirect() 來測試一下:

@Controller
public class ViewController {
    @RequestMapping("/testThymeleafView")
    public String testThymeleafView() {
        return "success";
    }
    @RequestMapping("/testToForward")
    public String testToForward() {
        return "forward:/testThymeleafView";
    }
    @RequestMapping("/testRedirect")
    public String testRedirect() {
        return "redirect:/testThymeleafView";
    }
}

嗯?testToForward()和testRedirect()最終都是訪問/testThymeleafView,那這2個還不是一樣?

其實不一樣。

  • 轉發訪問/testToForward時,頁面看到的是 success 頁面,瀏覽器地址欄仍然是/testToForward。
  • 重定向訪問/testRedirect時,頁面看到的是 success 頁面,地址欄裡也變成瞭/testThymeleafView。

四、轉發和重定向區別

轉發瀏覽器是發生一次請求,重定向是2次。

轉發可以獲取請求域中的數據,但是重定向不可以。因為轉發用到一次請求,也就是用到的request對象是同一個。重定向是發送2次請求,是2個request對象。

轉發可以訪問 WEB-INF 中的資源,但是重定向不可以。因為 WEB-INF 下面的資源具有隱藏性,隻能通過服務器內部來訪問,不能通過瀏覽器來訪問。

轉發不可以跨域,重定向可以。轉發是發生在服務器內部的,就隻能訪問內部的資源。而瀏覽器發送瞭2次請求,通過瀏覽器可以訪問任何資源,比如我重定向到百度首頁。

五、視圖控制器 view-controller

視圖控制器實際上是 springMVC 配置文件裡的一個標簽,作用也是實現請求地址和視圖頁面的映射關系。

當控制器方法中,僅僅用來實現頁面跳轉,即隻需要設置視圖名稱時,可以將處理器方法使用view-controller標簽進行表示。

比如:

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

這裡就可以註釋掉,在springmvc 配置文件中用視圖控制器來配置。

<!--
        path:設置處理的請求地址
        view-name:設置請求地址所對應的視圖名稱
    -->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>

註意這裡用的命名空間是 mvc,要去添加上。

重新部署,訪問http://localhost:8080/springmvc/:

依然可以訪問成功。

但是當我點擊 index 中的超鏈接的時候報錯瞭404:

這是因為當在配置文件中配置瞭 view-controller 之後,控制器中寫的所有請求映射都失效瞭。

還需要再加入一個配置,設置開啟 mvc 註解驅動的標簽:

<!--開啟 mvc 的註解驅動-->
    <mvc:annotation-driven />

再次點擊跳轉,訪問成功:

感謝《尚矽谷》的學習資源,以上就是SpringMVC視圖轉發重定向區別及控制器示例詳解的詳細內容,更多關於SpringMVC視圖的資料請關註WalkonNet其它相關文章!

推薦閱讀: