我就是奇迹

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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 也可以手动指定解析规则。

 

posted on 2025-04-05 00:30  我就是奇迹  阅读(27)  评论(0)    收藏  举报