📜  spring boot 中的 viewresolver - Java (1)

📅  最后修改于: 2023-12-03 15:20:12.847000             🧑  作者: Mango

Spring Boot 中的 ViewResolver

Spring Boot 提供了视图解析器(ViewResolver)来将控制器返回的逻辑视图名称解析为具体的视图实现。

1. 系统默认视图解析器

Spring Boot 预先配置了两个视图解析器:

  • ThymeleafViewResolver
  • InternalResourceViewResolver

ThymeleafViewResolver 用于渲染 Thymeleaf 模板,而 InternalResourceViewResolver 则用于渲染 JSP 页面。

这两个视图解析器都可以通过以下属性进行配置:

  • prefix:视图文件的前缀。
  • suffix:视图文件的后缀。
  • viewNames:解析哪些视图。

例如,要将视图名称“home”解析为位于“/WEB-INF/views/home.jsp”的 JSP 文件,可以使用以下配置:

@Bean
public InternalResourceViewResolver jspViewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    resolver.setViewNames("home");
    resolver.setOrder(0);
    return resolver;
}
2. 其他视图解析器

除了系统默认的视图解析器外,还可以添加其他视图解析器。

2.1 视图解析器的类型

Spring Boot 支持的视图解析器类型有:

  • UrlBasedViewResolver:基于 URL 的视图解析器。
  • ResourceBundleViewResolver:基于 ResourceBundle 的视图解析器。
  • XmlViewResolver:基于 XML 的视图解析器。
  • BeanNameViewResolver:基于 Bean 名称的视图解析器。
  • FreeMarkerViewResolver:用于渲染 FreeMarker 模板的视图解析器。
  • VelocityViewResolver:用于渲染 Velocity 模板的视图解析器。
  • TilesViewResolver:用于渲染 Apache Tiles 布局的视图解析器。
2.2 添加视图解析器

要添加其他视图解析器,可以创建实现 ViewResolver 接口的类,并使用 @Bean 注解将其添加到 Spring 容器中。

例如,要使用 FreeMarkerViewResolver 渲染 FreeMarker 模板,可以使用以下配置:

@Bean
public FreeMarkerViewResolver freemarkerViewResolver() {
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
    resolver.setPrefix("/templates");
    resolver.setSuffix(".ftl");
    resolver.setViewNames("*");
    resolver.setExposeRequestAttributes(true);
    resolver.setRequestContextAttribute("request");
    resolver.setOrder(1);
    return resolver;
}
3. 多视图解析器

可以使用 MultipleComponentsViewResolver 类来配置多个视图解析器,并定义它们的顺序。当控制器返回视图名称时,MultipleComponentsViewResolver 将尝试使用所有配置的视图解析器来解析视图,直到找到一个可用的解析器。

例如,如果想要使用 ThymeleafViewResolver、FreeMarkerViewResolver 和 InternalResourceViewResolver 按顺序解析视图:

@Bean
public MultipleComponentsViewResolver multipleComponentsViewResolver() {
    List<ViewResolver> resolvers = new ArrayList<>();
    resolvers.add(thymeleafViewResolver());
    resolvers.add(freemarkerViewResolver());
    resolvers.add(jspViewResolver());

    MultipleComponentsViewResolver resolver = new MultipleComponentsViewResolver();
    resolver.setViewResolvers(resolvers);
    return resolver;
}
4. 总结

视图解析器是 Spring Boot 中渲染视图的关键。通过使用不同类型的视图解析器,可以灵活地渲染不同种类的视图。同时,多视图解析器的使用也能提升系统的可用性和灵活性。