📅  最后修改于: 2023-12-03 15:20:12.847000             🧑  作者: Mango
Spring Boot 提供了视图解析器(ViewResolver)来将控制器返回的逻辑视图名称解析为具体的视图实现。
Spring Boot 预先配置了两个视图解析器:
ThymeleafViewResolver 用于渲染 Thymeleaf 模板,而 InternalResourceViewResolver 则用于渲染 JSP 页面。
这两个视图解析器都可以通过以下属性进行配置:
例如,要将视图名称“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;
}
除了系统默认的视图解析器外,还可以添加其他视图解析器。
Spring Boot 支持的视图解析器类型有:
要添加其他视图解析器,可以创建实现 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;
}
可以使用 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;
}
视图解析器是 Spring Boot 中渲染视图的关键。通过使用不同类型的视图解析器,可以灵活地渲染不同种类的视图。同时,多视图解析器的使用也能提升系统的可用性和灵活性。