视图解析器
MVC 配置简化了视图解析器(View Resolvers)的注册。
以下示例使用 JSP 和 Jackson 作为 JSON 渲染的默认 View,配置了内容协商视图解析:
java
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.enableContentNegotiation(new JacksonJsonView());
registry.jsp();
}
}kotlin
@Configuration
class WebConfiguration : WebMvcConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.enableContentNegotiation(JacksonJsonView())
registry.jsp()
}
}xml
<mvc:view-resolvers>
<mvc:content-negotiation>
<mvc:default-views>
<bean class="org.springframework.web.servlet.view.json.JacksonJsonView"/>
</mvc:default-views>
</mvc:content-negotiation>
<mvc:jsp/>
</mvc:view-resolvers>但请注意,FreeMarker、Groovy Markup 和脚本模板也需要对底层的视图技术进行配置。以下示例适用于 FreeMarker:
java
@Configuration
public class FreeMarkerConfiguration implements WebMvcConfigurer {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.enableContentNegotiation(new JacksonJsonView());
registry.freeMarker().cache(false);
}
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("/freemarker");
return configurer;
}
}kotlin
@Configuration
class FreeMarkerConfiguration : WebMvcConfigurer {
override fun configureViewResolvers(registry: ViewResolverRegistry) {
registry.enableContentNegotiation(JacksonJsonView())
registry.freeMarker().cache(false)
}
@Bean
fun freeMarkerConfigurer() = FreeMarkerConfigurer().apply {
setTemplateLoaderPath("/freemarker")
}
}xml
<mvc:view-resolvers>
<mvc:content-negotiation>
<mvc:default-views>
<bean class="org.springframework.web.servlet.view.json.JacksonJsonView"/>
</mvc:default-views>
</mvc:content-negotiation>
<mvc:freemarker cache-views="false"/>
</mvc:view-resolvers>
<mvc:freemarker-configurer>
<mvc:template-loader-path location="/freemarker"/>
</mvc:freemarker-configurer>补充教学
1. 视图解析器的作用
它的任务是根据控制转发回来的视图名称(String),找到真正的视图资源(如一个 .jsp 文件或一个 .ftl 模板)。
2. 内容协商解析器 (ContentNegotiatingViewResolver)
它本身不负责解析视图,而是代理其他解析器。它会根据客户端请求的媒体类型(如 JSON 或 HTML),从多个候选视图中自动挑选出最合适的一个。
3. JSP 的默认配置
registry.jsp() 默认会在 /WEB-INF/ 目录下查找 JSP 文件。如果你使用的是 Spring Boot,现代开发习惯通常更倾向于使用 Thymeleaf 或 FreeMarker,因为 JSP 对嵌入式服务器的支持有限。