Contents

Spring MVC的ViewResolver指南

1.概述

所有 MVC 框架都提供了一种处理视图的方法。 Spring 通过视图解析器做到这一点,这使您能够在浏览器中呈现模型,而无需将实现绑定到特定的视图技术。

ViewResolver将视图名称映射到实际视图。

Spring 框架附带了很多视图解析器,例如InternalResourceViewResolverBeanNameViewResolver和其他一些。

这是一个简单的教程,展示了如何设置最常见的视图解析器以及如何在同一配置中使用多个ViewResolver

2. Spring Web 配置

让我们从 web 配置开始;我们将使用*@EnableWebMvc*、@Configuration和*@ComponentScan*对其进行注释:

@EnableWebMvc
@Configuration
@ComponentScan("com.blogdemo.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();
}

一旦定义了 ViewResolver,我们需要定义View类型的 beans,以便DispatcherServlet可以执行它来呈现视图:

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

这是控制器类中相应的处理程序方法:

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

从控制器方法中,视图名称作为“ *sample”*返回,这意味着来自此处理程序方法的视图解析为带有/WEB-INF/view/sample.jspURL 的 JstlView 类。

5. 链接ViewResolver并定义订单优先级

Spring MVC 还支持多个视图解析器

这允许您在某些情况下覆盖特定视图。我们可以通过在配置中添加多个解析器来简单地链接视图解析器。 完成后,我们需要为这些解析器定义一个顺序。order属性用于定义链中调用的顺序。order 属性(最大订单号)越高,视图解析器在链中的位置就越晚。

要定义顺序,我们可以将以下代码行添加到我们的视图解析器的配置中:

bean.setOrder(0);

请注意顺序优先级,因为InternalResourceViewResolver应该具有更高的顺序 - 因为它旨在表示非常明确的映射。如果其他解析器具有更高的顺序,则可能永远不会调用InternalResourceViewResolver

6. 使用 Spring Boot

使用 Spring Boot 时,WebMvcAutoConfiguration 会在我们的应用程序上下文中自动配置InternalResourceViewResolverBeanNameViewResolver bean 。

此外,为模板引擎添加相应的启动器会消除我们必须执行的大部分手动配置。

例如,通过将spring-boot-starter-thymeleaf 依赖添加到我们的 pom.xml 中,Thymeleaf 被启用,并且不需要额外的配置:

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

此启动器依赖项在我们的应用程序上下文中使用名称thymeleafViewResolver配置**ThymeleafViewResolver bean。**我们可以通过提供一个同名的 bean 来覆盖自动配置的 ThymeleafViewResolver。

Thymeleaf 视图解析器通过用前缀和后缀包围视图名称来工作。prefix 和 suffix 的默认值分别是 classpath:/templates/.html

Spring Boot 还提供了一个选项来分别通过设置spring.thymeleaf.prefixspring.thymeleaf.suffix属性来更改前缀和后缀的默认值。

同样,我们有groovy-templatesfreemarkermustache 模板引擎的启动器依赖项,我们可以使用它们来使用 Spring Boot 自动配置相应的视图解析器。

DispatcherServlet使用它在应用程序上下文中找到的所有视图解析器,并尝试每一个,直到得到结果,因此,如果我们计划添加自己的视图解析器,这些视图解析器的顺序变得非常重要。