Spring ViewResolver

AbstractCachingViewResolver、XmlViewResolver、ResourceBundleViewResolver、UrlBasedViewResolver、InternalResourceViewResolver、VelocityViewResolver、FreeMarkerViewResolver
、ContentNegotiatingViewResolver


加载

org.springframework.web.servlet.view.ContentNegotiatingViewResolver

问题点:

是不是所有的ViewResolver都是通过ContentNegotiatingViewResolver这个加载的 --> 不是

ContentNegotiatingViewResolver起到的作用是什么

只有一个jspView的时候会不会调用ContentNegotiatingViewResolver

privatevoidinitViewResolvers(ApplicationContextcontext){this.viewResolvers=null;if(this.detectAllViewResolvers){//FindallViewResolversintheApplicationContext,includingancestorcontexts.Map<String,ViewResolver>matchingBeans=BeanFactoryUtils.beansOfTypeIncludingAncestors(context,ViewResolver.class,true,false);if(!matchingBeans.isEmpty()){this.viewResolvers=newArrayList<>(matchingBeans.values());//WekeepViewResolversinsortedorder.AnnotationAwareOrderComparator.sort(this.viewResolvers);}}else{try{ViewResolvervr=context.getBean(VIEW_RESOLVER_BEAN_NAME,ViewResolver.class);this.viewResolvers=Collections.singletonList(vr);}catch(NoSuchBeanDefinitionExceptionex){//Ignore,we'lladdadefaultViewResolverlater.}}//EnsurewehaveatleastoneViewResolver,byregistering//adefaultViewResolverifnootherresolversarefound.if(this.viewResolvers==null){this.viewResolvers=getDefaultStrategies(context,ViewResolver.class);if(logger.isDebugEnabled()){logger.debug("NoViewResolversfoundinservlet'"+getServletName()+"':usingdefault");}}}



doDispatch

processDispatchResult

render:

Viewview;if(mv.isReference()){//Weneedtoresolvetheviewname.view=resolveViewName(mv.getViewName(),mv.getModelInternal(),locale,request);if(view==null){thrownewServletException("Couldnotresolveviewwithname'"+mv.getViewName()+"'inservletwithname'"+getServletName()+"'");}}else{//Noneedtolookup:theModelAndViewobjectcontainstheactualViewobject.view=mv.getView();if(view==null){thrownewServletException("ModelAndView["+mv+"]neithercontainsaviewnamenora"+"Viewobjectinservletwithname'"+getServletName()+"'");}}

resolveViewName:

protectedViewresolveViewName(StringviewName,Map<String,Object>model,Localelocale,HttpServletRequestrequest)throwsException{for(ViewResolverviewResolver:this.viewResolvers){Viewview=viewResolver.resolveViewName(viewName,locale);if(view!=null){returnview;}}returnnull;}