知識庫 / Spring / Spring MVC RSS 訂閱

Spring MVC 中 ViewResolver 指南

Spring MVC
HongKong
10
02:52 PM · Dec 06 ,2025

1. 概述

所有 MVC 框架都提供了一種處理視圖的方式。

Spring 通過視圖解析器來實現這一點,允許您在不與特定視圖技術綁定的情況下,在瀏覽器中渲染模型。

<em>ViewResolver</em> 將視圖名稱映射到實際視圖。

Spring 框架提供了許多視圖解析器,例如 <em>InternalResourceViewResolver</em><em>BeanNameViewResolver</em> 以及其他一些。

本教程演示瞭如何設置最常見的視圖解析器以及 如何在同一配置中使用多個 ViewResolver

2. Spring Web 配置

讓我們從 Web 配置開始,並使用 <em @EnableWebMvc</em><em @Configuration</em><em @ComponentScan</em>> 註解進行標註。

@EnableWebMvc
@Configuration
@ComponentScan("com.baeldung.web")
public class WebConfig implements WebMvcConfigurer {
    // All web configuration will go here
}

在這裏,我們將配置我們的視圖解析器。

3. 添加 InternalResourceViewResolver

ViewResolver 允許我們為視圖名稱設置屬性,如前綴或後綴,從而生成最終的視圖頁面 URL。

@Bean
public ViewResolver internalResourceViewResolver() {
    InternalResourceViewResolver bean = new InternalResourceViewResolver();
    bean.setViewClass(JstlView.class);
    bean.setPrefix("/WEB-INF/view/");
    bean.setSuffix(".jsp");
    return bean;
}

為了這種示例的簡潔性,我們不需要一個控制器來處理請求。

我們只需要一個簡單的 jsp頁面,將其放置在 /WEB-INF/view 文件夾中,如配置中所定義。

<html>
    <head></head>
    <body>
        <h1>This is the body of the sample view</h1>
    </body>
</html>

4. 添加 BeanNameViewResolver 視圖解析器

這是一個 ViewResovler 的實現,它將視圖名稱解釋為當前應用程序上下文中 bean 的名稱。 這樣的每個 View 可以用 XML 或 Java 配置中定義為 bean。

首先,我們將 BeanNameViewResolver 添加到之前的配置中:

@Bean
public BeanNameViewResolver beanNameViewResolver(){
    return new BeanNameViewResolver();
}

一旦視圖解析器定義好,我們需要定義類型為 View 的 Bean,以便由 DispatcherServlet 執行,從而渲染視圖:

@Bean
public View sample() {
    return new JstlView("/WEB-INF/view/sample.jsp");
}

以下是來自控制器類中對應的處理方法:

@GetMapping("/sample")
public String showForm() {
    return "sample";
}

從控制器方法中,視圖名稱返回為“sample”,這意味着該處理方法中的視圖解析到 JstlView 類,URL 為 /WEB-INF/view/sample.jsp

5. 鏈接 ViewResolvers 並定義優先級

Spring MVC 也支持 多個視圖解析器

這允許您在某些情況下覆蓋特定的視圖。 我們可以通過將多個解析器添加到配置中來簡單地鏈接視圖解析器。

一旦我們完成了這些,我們就需要為這些解析器定義一個順序。 order 屬性 用於定義鏈中調用的順序。 順序屬性越高(最大的順序號),視圖解析器在鏈中的位置越晚。

要定義順序,我們可以將以下代碼行添加到我們的視圖解析器的配置中:

bean.setOrder(0);

請注意優先級設置,因為 InternalResourceViewResolver 應該具有更高的優先級——因為它旨在代表一個非常明確的映射。如果其他解析器具有更高的優先級,則 InternalResourceViewResolver 可能永遠不會被調用。

6. 使用 Spring Boot

當使用 Spring Boot 時,<strong>WebMvcAutoConfiguration</strong> 會自動配置應用程序上下文中的 `InternalResourceViewResolver  和   BeanNameViewResolver bean。

此外,添加與模板引擎對應的 starter 可以減少我們手動配置的工作量。

例如,通過將 <a href="https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf">spring-boot-starter-thymeleaf</a> 依賴添加到 pom.xml 中,Thymeleaf 就被啓用,並且不需要進行任何額外的配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>${spring-boot-starter-thymeleaf.version}</version>
</dependency>

此啓動依賴配置了 ThymeleafViewResolver Bean,名稱為 thymeleafViewResolver,在我們的應用程序上下文中。我們可以通過提供同名的 Bean 來覆蓋自動配置的 ThymeleafViewResolver。

Thymeleaf view resolver 通過在視圖名稱周圍添加前綴和後綴來工作。前綴和後綴的默認值為 ‘classpath:/templates/’ 和 ‘.html’。

Spring Boot 還提供了通過設置 spring.thymeleaf.prefixspring.thymeleaf.suffix 屬性來更改默認前綴和後綴的選項。

同樣,我們還擁有用於 groovy-templatesfreemarkermustache 模板引擎的啓動依賴,我們可以使用它們通過 Spring Boot 自動配置相應的 view resolvers。

DispatcherServlet 會使用上下文中找到的所有 view resolvers,並嘗試每個 view resolver,直到獲得結果。因此,如果我們要添加自己的 view resolvers,則 view resolvers 的排序變得非常重要。

7. 結論

在本教程中,我們使用 Java 配置配置了一個視圖解析器鏈。通過調整優先級,我們可以設置它們的調用順序。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.