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