内容协商在视图View上的应用【享学Spring MVC】 (3)

我们已经知道,默认情况下Spring MVC可没有使用此内容协商视图解析器,因此若有同一资源,多视图展示的需求,我们是需要手动配置(开启)支持的。

通过检索可以看到ViewResolverRegistry它为我们提供了便捷使用的方式:

当然你也可以通过单独配置一个ContentNegotiatingViewResolver @Bean的方式来做,原理也很简单很好解释。本文我就给个最佳实践作为参考示例

public class ViewResolverRegistry { ... public void enableContentNegotiation(View... defaultViews) { initContentNegotiatingViewResolver(defaultViews); } public void enableContentNegotiation(boolean useNotAcceptableStatus, View... defaultViews) { ContentNegotiatingViewResolver vr = initContentNegotiatingViewResolver(defaultViews); vr.setUseNotAcceptableStatusCode(useNotAcceptableStatus); } // 初始化一个内容协商视图解析器 private ContentNegotiatingViewResolver initContentNegotiatingViewResolver(View[] defaultViews) { // ContentNegotiatingResolver in the registry: elevate its precedence! // 请保证它是最高优先级的:在所有视图解析器之前执行 // 这样即使你配置了其它的视图解析器 也会先执行这个(后面的被短路掉) this.order = (this.order != null ? this.order : Ordered.HIGHEST_PRECEDENCE); // 调用者自己已经配置好了一个contentNegotiatingResolver,那就用他的 if (this.contentNegotiatingResolver != null) { // 若存在defaultViews,那就处理一下把它放进contentNegotiatingResolver里面 if (!ObjectUtils.isEmpty(defaultViews) && !CollectionUtils.isEmpty(this.contentNegotiatingResolver.getDefaultViews())) { List<View> views = new ArrayList<>(this.contentNegotiatingResolver.getDefaultViews()); views.addAll(Arrays.asList(defaultViews)); this.contentNegotiatingResolver.setDefaultViews(views); } } else { // 若没配置就自己new一个 并且设置好viewResolvers this.contentNegotiatingResolver = new ContentNegotiatingViewResolver(); this.contentNegotiatingResolver.setDefaultViews(Arrays.asList(defaultViews)); // 注意:这个viewResolvers是通过此ViewResolverRegistry配置进来的 // 若仅仅是容器内的Bean,这里可捕获不到。所以如果你有特殊需求建议你自己set // 若仅仅是jsp()/tiles()/freeMarker()/groovy()/beanName()这些,内置的支持即可满足要求儿聊 // ViewResolverRegistry.viewResolver()可调用多次,因此可以多次指定 若有需要个性化,可以调用此方法 this.contentNegotiatingResolver.setViewResolvers(this.viewResolvers); if (this.contentNegotiationManager != null) { this.contentNegotiatingResolver.setContentNegotiationManager(this.contentNegotiationManager); } } return this.contentNegotiatingResolver; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsspx.html