首頁 > 軟體

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

2022-05-28 22:00:18

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檢視的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com