1. 概述
所有 MVC 框架都提供了处理视图的方式,Spring 也不例外。Spring 通过 ViewResolver(视图解析器) 实现了这一机制,它使得我们可以在不绑定具体视图技术的前提下将模型渲染到浏览器中。
简单来说,ViewResolver 的作用就是将逻辑视图名映射为实际的视图对象。
Spring 内置了多种 ViewResolver 实现,比如:
InternalResourceViewResolver
BeanNameViewResolver
- 等等
本文将带你快速上手几种常用的 ViewResolver,并展示如何在同一个配置中使用多个 ViewResolver。
2. Spring Web 配置
首先,我们从 Web 配置入手。使用如下注解定义配置类:
@EnableWebMvc
@Configuration
@ComponentScan("com.baeldung.web")
public class WebConfig implements WebMvcConfigurer {
// 所有 web 相关的配置都在这里
}
在这个配置类中,我们将定义所需的 ViewResolver。
3. 添加 InternalResourceViewResolver
这是最常用的 ViewResolver 之一,适用于 JSP 视图。它允许我们通过设置 prefix
和 suffix
来拼接最终的视图路径。
@Bean
public ViewResolver internalResourceViewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".jsp");
return bean;
}
示例中我们使用了 JSTL 支持的 JstlView
,并将视图文件放在 /WEB-INF/view/
路径下,后缀为 .jsp
。
对应的一个简单 JSP 页面如下:
<html>
<head></head>
<body>
<h1>This is the body of the sample view</h1>
</body>
</html>
✅ 这个配置下,你不需要写 Controller,直接访问对应的路径就能渲染 JSP。
4. 添加 BeanNameViewResolver
这个 ViewResolver 会将视图名当作 Spring 容器中的 Bean 名来查找对应的 View 实例。
首先,将 BeanNameViewResolver
加入配置中:
@Bean
public BeanNameViewResolver beanNameViewResolver(){
return new BeanNameViewResolver();
}
接着,我们需要定义一个类型为 View
的 Bean:
@Bean
public View sample() {
return new JstlView("/WEB-INF/view/sample.jsp");
}
对应的 Controller 方法如下:
@GetMapping("/sample")
public String showForm() {
return "sample";
}
此时,返回的视图名 "sample"
会被解析为上面定义的 Bean,即指向 /WEB-INF/view/sample.jsp
的 JSTL 视图。
⚠️ 注意:这种方式适用于需要自定义 View 行为的场景,使用上更灵活但也更复杂。
5. 多个 ViewResolver 的链式调用与优先级设置
Spring MVC 支持 多个 ViewResolver 协同工作,这在需要覆盖某些视图时非常有用。
我们只需在配置中添加多个 ViewResolver 即可实现链式调用。
不过,为了控制执行顺序,我们需要为每个 ViewResolver 设置 order
属性。数值越小,优先级越高。
bean.setOrder(0);
⚠️ 注意顺序:比如 InternalResourceViewResolver
通常应放在最后,因为它会兜底处理所有未匹配的视图。如果其他 ViewResolver 的 order 更小,它可能永远都不会被调用。
6. 在 Spring Boot 中使用 ViewResolver
在 Spring Boot 中,WebMvcAutoConfiguration 会自动为你配置 InternalResourceViewResolver
和 BeanNameViewResolver
。
如果你使用模板引擎,比如 Thymeleaf,只需引入对应的 starter,Spring Boot 会自动配置好对应的 ViewResolver。
例如,添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>${spring-boot-starter-thymeleaf.version}</version>
</dependency>
✅ 这样 Thymeleaf 就自动启用了,并且默认配置了 ThymeleafViewResolver
,其前缀是 classpath:/templates/
,后缀是 .html
。
你可以通过如下配置项来自定义前缀和后缀:
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
类似地,Spring Boot 也为如下模板引擎提供了 starter:
- groovy-templates
- freemarker
- mustache
引入对应的 starter 后,它们的 ViewResolver 也会自动配置好。
⚠️ 注意:DispatcherServlet 会依次尝试所有 ViewResolver,直到找到合适的视图为止,因此 顺序很重要。如果你需要自定义 ViewResolver,记得设置合适的 order。
7. 总结
本篇文章带你了解了 Spring MVC 中常见的 ViewResolver 配置方式,包括:
InternalResourceViewResolver
用于 JSPBeanNameViewResolver
用于 Bean 名映射- 多个 ViewResolver 的链式调用及优先级控制
- Spring Boot 下的自动配置机制
这些知识点对于构建灵活的视图层非常有帮助,尤其在项目需要支持多种视图技术时。
📌 示例代码可在 GitHub 项目 中找到。