@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2014 the original author or authors .
* Copyright 2002 - 2015 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -42,7 +42,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
@@ -42,7 +42,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext ;
import org.springframework.context.ConfigurableApplicationContext ;
import org.springframework.context.i18n.LocaleContext ;
import org.springframework.core.OrderComparator ;
import org.springframework.core.annotation.AnnotationAware OrderComparator ;
import org.springframework.core.io.ClassPathResource ;
import org.springframework.core.io.support.PropertiesLoaderUtils ;
import org.springframework.http.server.ServletServerHttpRequest ;
@ -60,73 +60,89 @@ import org.springframework.web.util.NestedServletException;
@@ -60,73 +60,89 @@ import org.springframework.web.util.NestedServletException;
import org.springframework.web.util.WebUtils ;
/ * *
* Central dispatcher for HTTP request handlers / controllers , e . g . for web UI controllers or HTTP - based remote service
* exporters . Dispatches to registered handlers for processing a web request , providing convenient mapping and exception
* handling facilities .
* Central dispatcher for HTTP request handlers / controllers , e . g . for web UI controllers
* or HTTP - based remote service exporters . Dispatches to registered handlers for processing
* a web request , providing convenient mapping and exception handling facilities .
*
* < p > This servlet is very flexible : It can be used with just about any workflow , with the installation of the
* appropriate adapter classes . It offers the following functionality that distinguishes it from other request - driven
* web MVC frameworks :
* < p > This servlet is very flexible : It can be used with just about any workflow , with the
* installation of the appropriate adapter classes . It offers the following functionality
* that distinguishes it from other request - driven web MVC frameworks :
*
* < ul > < li > It is based around a JavaBeans configuration mechanism .
* < ul >
* < li > It is based around a JavaBeans configuration mechanism .
*
* < li > It can use any { @link HandlerMapping } implementation - pre - built or provided as part of an application - to
* control the routing of requests to handler objects . Default is { @link org . springframework . web . servlet . handler . BeanNameUrlHandlerMapping }
* and { @link org . springframework . web . servlet . mvc . annotation . DefaultAnnotationHandlerMapping } . HandlerMapping objects
* can be defined as beans in the servlet ' s application context , implementing the HandlerMapping interface , overriding
* the default HandlerMapping if present . HandlerMappings can be given any bean name ( they are tested by type ) .
* < li > It can use any { @link HandlerMapping } implementation - pre - built or provided as part
* of an application - to control the routing of requests to handler objects . Default is
* { @link org . springframework . web . servlet . handler . BeanNameUrlHandlerMapping } and
* { @link org . springframework . web . servlet . mvc . annotation . DefaultAnnotationHandlerMapping } .
* HandlerMapping objects can be defined as beans in the servlet ' s application context ,
* implementing the HandlerMapping interface , overriding the default HandlerMapping if
* present . HandlerMappings can be given any bean name ( they are tested by type ) .
*
* < li > It can use any { @link HandlerAdapter } ; this allows for using any handler interface . Default adapters are { @link
* org . springframework . web . servlet . mvc . HttpRequestHandlerAdapter } , { @link org . springframework . web . servlet . mvc . SimpleControllerHandlerAdapter } ,
* for Spring ' s { @link org . springframework . web . HttpRequestHandler } and { @link org . springframework . web . servlet . mvc . Controller }
* interfaces , respectively . A default { @link org . springframework . web . servlet . mvc . annotation . AnnotationMethodHandlerAdapter }
* will be registered as well . HandlerAdapter objects can be added as beans in the application context , overriding the
* default HandlerAdapters . Like HandlerMappings , HandlerAdapters can be given any bean name ( they are tested by type ) .
* < li > It can use any { @link HandlerAdapter } ; this allows for using any handler interface .
* Default adapters are { @link org . springframework . web . servlet . mvc . HttpRequestHandlerAdapter } ,
* { @link org . springframework . web . servlet . mvc . SimpleControllerHandlerAdapter } , for Spring ' s
* { @link org . springframework . web . HttpRequestHandler } and
* { @link org . springframework . web . servlet . mvc . Controller } interfaces , respectively . A default
* { @link org . springframework . web . servlet . mvc . annotation . AnnotationMethodHandlerAdapter }
* will be registered as well . HandlerAdapter objects can be added as beans in the
* application context , overriding the default HandlerAdapters . Like HandlerMappings ,
* HandlerAdapters can be given any bean name ( they are tested by type ) .
*
* < li > The dispatcher ' s exception resolution strategy can be specified via a { @link HandlerExceptionResolver } , for
* example mapping certain exceptions to error pages . Default are
* < li > The dispatcher ' s exception resolution strategy can be specified via a
* { @link HandlerExceptionResolver } , for example mapping certain exceptions to error pages .
* Default are
* { @link org . springframework . web . servlet . mvc . annotation . AnnotationMethodHandlerExceptionResolver } ,
* { @link org . springframework . web . servlet . mvc . annotation . ResponseStatusExceptionResolver } , and
* { @link org . springframework . web . servlet . mvc . support . DefaultHandlerExceptionResolver } . These HandlerExceptionResolvers can be overridden
* through the application context . HandlerExceptionResolver can be given any bean name ( they are tested by type ) .
* { @link org . springframework . web . servlet . mvc . support . DefaultHandlerExceptionResolver } .
* These HandlerExceptionResolvers can be overridden through the application context .
* HandlerExceptionResolver can be given any bean name ( they are tested by type ) .
*
* < li > Its view resolution strategy can be specified via a { @link ViewResolver } implementation , resolving symbolic view
* names into View objects . Default is { @link org . springframework . web . servlet . view . InternalResourceViewResolver } .
* ViewResolver objects can be added as beans in the application context , overriding the default ViewResolver .
* ViewResolvers can be given any bean name ( they are tested by type ) .
* < li > Its view resolution strategy can be specified via a { @link ViewResolver }
* implementation , resolving symbolic view names into View objects . Default is
* { @link org . springframework . web . servlet . view . InternalResourceViewResolver } .
* ViewResolver objects can be added as beans in the application context , overriding the
* default ViewResolver . ViewResolvers can be given any bean name ( they are tested by type ) .
*
* < li > If a { @link View } or view name is not supplied by the user , then the configured { @link
* RequestToViewNameTranslator } will translate the current request into a view name . The corresponding bean name is
* "viewNameTranslator" ; the default is { @link org . springframework . web . servlet . view . DefaultRequestToViewNameTranslator } .
* < li > If a { @link View } or view name is not supplied by the user , then the configured
* { @link RequestToViewNameTranslator } will translate the current request into a view name .
* The corresponding bean name is "viewNameTranslator" ; the default is
* { @link org . springframework . web . servlet . view . DefaultRequestToViewNameTranslator } .
*
* < li > The dispatcher ' s strategy for resolving multipart requests is determined by a { @link
* org . springframework . web . multipart . MultipartResolver } implementation . Implementations for Jakarta Commons FileUpload
* and Jason Hunter ' s COS are included ; the typical choise is { @link org . springframework . web . multipart . commons . CommonsMultipartResolver } .
* < li > The dispatcher ' s strategy for resolving multipart requests is determined by a
* { @link org . springframework . web . multipart . MultipartResolver } implementation .
* Implementations for Apache Commons FileUpload and Servlet 3 are included ; the typical
* choice is { @link org . springframework . web . multipart . commons . CommonsMultipartResolver } .
* The MultipartResolver bean name is "multipartResolver" ; default is none .
*
* < li > Its locale resolution strategy is determined by a { @link LocaleResolver } . Out - of - the - box implementations work via
* HTTP accept header , cookie , or session . The LocaleResolver bean name is "localeResolver" ; default is { @link
* org . springframework . web . servlet . i18n . AcceptHeaderLocaleResolver } .
* < li > Its locale resolution strategy is determined by a { @link LocaleResolver } .
* Out - of - the - box implementations work via HTTP accept header , cookie , or session .
* The LocaleResolver bean name is "localeResolver" ; default is
* { @link org . springframework . web . servlet . i18n . AcceptHeaderLocaleResolver } .
*
* < li > Its theme resolution strategy is determined by a { @link ThemeResolver } . Implementations for a fixed theme and for
* cookie and session storage are included . The ThemeResolver bean name is "themeResolver" ; default is { @link
* org . springframework . web . servlet . theme . FixedThemeResolver } . < / ul >
* < li > Its theme resolution strategy is determined by a { @link ThemeResolver } .
* Implementations for a fixed theme and for cookie and session storage are included .
* The ThemeResolver bean name is "themeResolver" ; default is
* { @link org . springframework . web . servlet . theme . FixedThemeResolver } .
* < / ul >
*
* < p > < b > NOTE : The { @code @RequestMapping } annotation will only be processed if a corresponding
* { @code HandlerMapping } ( for type level annotations ) and / or { @code HandlerAdapter } ( for method level
* annotations ) is present in the dispatcher . < / b > This is the case by default . However , if you are defining custom
* { @code HandlerMappings } or { @code HandlerAdapters } , then you need to make sure that a corresponding custom
* { @code DefaultAnnotationHandlerMapping } and / or { @code AnnotationMethodHandlerAdapter } is defined as well -
* provided that you intend to use { @code @RequestMapping } .
* < p > < b > NOTE : The { @code @RequestMapping } annotation will only be processed if a
* corresponding { @code HandlerMapping } ( for type - level annotations ) and / or
* { @code HandlerAdapter } ( for method - level annotations ) is present in the dispatcher . < / b >
* This is the case by default . However , if you are defining custom { @code HandlerMappings }
* or { @code HandlerAdapters } , then you need to make sure that a corresponding custom
* { @code DefaultAnnotationHandlerMapping } and / or { @code AnnotationMethodHandlerAdapter }
* is defined as well - provided that you intend to use { @code @RequestMapping } .
*
* < p > < b > A web application can define any number of DispatcherServlets . < / b > Each servlet will operate in its own
* namespace , loading its own application context with mappings , handlers , etc . Only the root application context as
* loaded by { @link org . springframework . web . context . ContextLoaderListener } , if any , will be shared .
* < p > < b > A web application can define any number of DispatcherServlets . < / b >
* Each servlet will operate in its own namespace , loading its own application context
* with mappings , handlers , etc . Only the root application context as loaded by
* { @link org . springframework . web . context . ContextLoaderListener } , if any , will be shared .
*
* < p > As of Spring 3 . 1 , { @code DispatcherServlet } may now be injected with a web
* application context , rather than creating its own internally . This is useful in Servlet
* 3 . 0 + environments , which support programmatic registration of servlet instances . See
* { @link # DispatcherServlet ( WebApplicationContext ) } J avadoc for details .
* 3 . 0 + environments , which support programmatic registration of servlet instances .
* See the { @link # DispatcherServlet ( WebApplicationContext ) } j avadoc for details .
*
* @author Rod Johnson
* @author Juergen Hoeller
@ -553,7 +569,7 @@ public class DispatcherServlet extends FrameworkServlet {
@@ -553,7 +569,7 @@ public class DispatcherServlet extends FrameworkServlet {
if ( ! matchingBeans . isEmpty ( ) ) {
this . handlerMappings = new ArrayList < HandlerMapping > ( matchingBeans . values ( ) ) ;
// We keep HandlerMappings in sorted order.
OrderComparator . sort ( this . handlerMappings ) ;
AnnotationAware OrderComparator. sort ( this . handlerMappings ) ;
}
}
else {
@ -591,7 +607,7 @@ public class DispatcherServlet extends FrameworkServlet {
@@ -591,7 +607,7 @@ public class DispatcherServlet extends FrameworkServlet {
if ( ! matchingBeans . isEmpty ( ) ) {
this . handlerAdapters = new ArrayList < HandlerAdapter > ( matchingBeans . values ( ) ) ;
// We keep HandlerAdapters in sorted order.
OrderComparator . sort ( this . handlerAdapters ) ;
AnnotationAware OrderComparator. sort ( this . handlerAdapters ) ;
}
}
else {
@ -629,7 +645,7 @@ public class DispatcherServlet extends FrameworkServlet {
@@ -629,7 +645,7 @@ public class DispatcherServlet extends FrameworkServlet {
if ( ! matchingBeans . isEmpty ( ) ) {
this . handlerExceptionResolvers = new ArrayList < HandlerExceptionResolver > ( matchingBeans . values ( ) ) ;
// We keep HandlerExceptionResolvers in sorted order.
OrderComparator . sort ( this . handlerExceptionResolvers ) ;
AnnotationAware OrderComparator. sort ( this . handlerExceptionResolvers ) ;
}
}
else {
@ -691,7 +707,7 @@ public class DispatcherServlet extends FrameworkServlet {
@@ -691,7 +707,7 @@ public class DispatcherServlet extends FrameworkServlet {
if ( ! matchingBeans . isEmpty ( ) ) {
this . viewResolvers = new ArrayList < ViewResolver > ( matchingBeans . values ( ) ) ;
// We keep ViewResolvers in sorted order.
OrderComparator . sort ( this . viewResolvers ) ;
AnnotationAware OrderComparator. sort ( this . viewResolvers ) ;
}
}
else {