Spring MVC 确定视图类型(JSP、Thymeleaf、Freemarker)主要依赖于 视图解析器(ViewResolver) 的配置。具体来说,Spring 会通过以下几种方式判断 当前使用的视图类型:
1. 通过 Spring Boot 自动配置
如果你使用 Spring Boot,Spring Boot 会自动判断你使用的 模板引擎(JSP、Thymeleaf、Freemarker),规则如下:
• 如果你的 pom.xml 或 build.gradle 依赖中包含了某个视图模板的依赖,Spring Boot 会默认使用该视图解析器。
• 如果你同时引入多个模板引擎,Spring Boot 会根据优先级选择默认的视图解析器。
Spring Boot 视图解析器的默认优先级(如果都存在):
1. Thymeleaf(spring-boot-starter-thymeleaf)
2. Freemarker(spring-boot-starter-freemarker)
3. JSP(spring-boot-starter-web + tomcat-embed-jasper)
示例:如果你引入 Thymeleaf 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
🔹 结果:Spring Boot 会自动使用 Thymeleaf 解析视图,不会使用 JSP 或 Freemarker。
2. 通过 ViewResolver 配置
如果你使用的是 Spring MVC(非 Spring Boot),你需要 手动配置视图解析器。Spring 会根据你配置的 视图解析器(ViewResolver) 来决定使用哪种视图。
(1)JSP 视图解析器
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // 视图文件存放目录
resolver.setSuffix(".jsp"); // 视图后缀
return resolver;
}
📌 解析规则
• return "index"; → /WEB-INF/views/index.jsp
(2)Thymeleaf 视图解析器
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setCharacterEncoding("UTF-8");
return resolver;
}
📌 解析规则
• return "index"; → /templates/index.html
(3)Freemarker 视图解析器
@Bean
public FreeMarkerViewResolver freemarkerViewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setSuffix(".ftl"); // 视图后缀
resolver.setCache(true);
return resolver;
}
📌 解析规则
• return "index"; → /templates/index.ftl
3. 通过 spring.mvc.view.prefix & spring.mvc.view.suffix 配置
在 Spring Boot 的 application.properties 配置文件 中,也可以手动指定视图类型:
JSP
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
📌 解析规则
• return "index"; → /WEB-INF/views/index.jsp
Freemarker
spring.freemarker.template-loader-path=classpath:/templates/
spring.freemarker.suffix=.ftl
📌 解析规则
• return "index"; → /templates/index.ftl
Thymeleaf
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
📌 解析规则
• return "index"; → /templates/index.html
4. 如果多个视图解析器同时存在怎么办?
如果你在项目中同时配置了 多个视图解析器(例如 InternalResourceViewResolver 和 ThymeleafViewResolver),Spring MVC 会按照 解析器的顺序 来解析视图。
调整解析器优先级
你可以通过 setOrder() 来设置解析器的优先级:
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setOrder(1); // 优先级最高,先解析 Thymeleaf
return resolver;
}
@Bean
public InternalResourceViewResolver jspViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setOrder(2); // 低优先级,JSP 作为备选
return resolver;
}
📌 解析逻辑
• Spring 先尝试 Thymeleaf,如果找不到视图文件,就会 尝试 JSP。
5. 如何检查当前使用的视图解析器?
如果你不确定 Spring MVC 当前使用的是 JSP、Thymeleaf 还是 Freemarker,可以:
1. 查看 application.properties 配置
2. 检查 pom.xml 依赖
3. 在代码中打印 ViewResolver 解析的视图路径
@Autowired
private List<ViewResolver> viewResolvers;
@PostConstruct
public void printViewResolvers() {
System.out.println("已注册的视图解析器:");
for (ViewResolver resolver : viewResolvers) {
System.out.println(resolver.getClass().getName());
}
}
🔹 运行后输出示例
已注册的视图解析器:
org.thymeleaf.spring5.view.ThymeleafViewResolver
👉 说明 当前使用的是 Thymeleaf,而不是 JSP 或 Freemarker。
总结
• Spring Boot 会根据 pom.xml 依赖 自动选择视图解析器(Thymeleaf > Freemarker > JSP)。
• 手动配置 ViewResolver 可以指定解析器,比如:
• JSP 使用 InternalResourceViewResolver
• Thymeleaf 使用 ThymeleafViewResolver
• Freemarker 使用 FreeMarkerViewResolver
• 多个解析器共存时,可以用 setOrder() 设置优先级,Spring MVC 会按顺序匹配视图。
• 使用 application.properties 也可以手动指定解析规则。
浙公网安备 33010602011771号