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.prefix 和 spring.thymeleaf.suffix 屬性來更改默認前綴和後綴的選項。
同樣,我們還擁有用於 groovy-templates、freemarker 和 mustache 模板引擎的啓動依賴,我們可以使用它們通過 Spring Boot 自動配置相應的 view resolvers。
DispatcherServlet 會使用上下文中找到的所有 view resolvers,並嘗試每個 view resolver,直到獲得結果。因此,如果我們要添加自己的 view resolvers,則 view resolvers 的排序變得非常重要。
7. 結論
在本教程中,我們使用 Java 配置配置了一個視圖解析器鏈。通過調整優先級,我們可以設置它們的調用順序。