Интерфейс HandlerMapping используется для поиска обработчиков. В SpringMvc DispatcherServlet обрабатывает и распределяет множество запросов, и для обработки каждого запроса требуется обработчик Какой обработчик используется для обработки запроса после его получения? Это то, что делает Хендлер. Таким образом, роль HandlerMapping состоит в том, чтобы найти соответствующий обработчик и перехватчик в соответствии с запросом.
Ниже приводится описание интерфейса HandlerMapping в Spring:
This class can be implemented by application developers, although this is not necessary, as BeanNameUrlHandlerMapping and DefaultAnnotationHandlerMapping are included in the framework. The former is the default if no HandlerMapping bean is registered in the application context.
Этот класс может быть реализован разработчиком приложения, хотя это и не требуется, поскольку BeanNameUrlHandlerMapping и DefaultAnnotationHandlerMapping уже включены в структуру в качестве реализации HandlerMapping по умолчанию. BeanNameUrlHandlerMapping используется по умолчанию, если в контексте приложения не зарегистрирован компонент HandlerMapping.
HandlerMapping implementations can support mapped interceptors but do not have to. A handler will always be wrapped in a HandlerExecutionChain instance, optionally accompanied by some HandlerInterceptor instances.The DispatcherServlet will first call each HandlerInterceptor's preHandle method in the given order, finally invoking the handler itself if all preHandle methods have returned true
Реализации HandlerMapping могут поддерживать сопоставленные перехватчики, но не обязательно; обработчики всегда будут инкапсулированы в экземплярах HandlerExecutionChain и могут выполняться некоторыми экземплярами HandlerInterceptor. В данном порядке DispatcherServlet сначала вызовет метод preHandle каждого HandlerInterceptor, и если все методы preHandle вернут true, то вызовет сам обработчик в последнюю очередь.
The ability to parameterize this mapping is a powerful and unusual capability of this MVC framework. For example, it is possible to write a custom mapping based on session state, cookie state or many other variables. No other MVC framework seems to be equally flexible.
Возможность параметризации этого сопоставления — мощная и необычная возможность этой среды MVC. Например, пользовательские сопоставления могут быть написаны на основе состояния сеанса, состояния файла cookie или многих других переменных. Никакая другая структура MVC не кажется такой гибкой.
Note: Implementations can implement the Ordered interface to be able to specify a sorting order and thus a priority for getting applied by DispatcherServlet. Non-Ordered instances get treated as lowest priority.
ПРИМЕЧАНИЕ. Реализации МОГУТ реализовывать интерфейс Ordered, чтобы иметь возможность указывать порядок сортировки и, следовательно, приоритет, применяемый DispatcherServlet. Экземпляры, находящиеся вне очереди, имеют самый низкий приоритет.
1. Константы интерфейса
1.1. PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE
Имя атрибута HttpServletRequest, который содержит путь в сопоставлении обработчика, например, совпадение с шаблоном или полностью связанный URI (обычно в сопоставлении DispatcherServlet). Это свойство не требует поддержки всеми реализациями HandlerMapping. HandlerMappings на основе URL обычно поддерживают его, но обработчики не должны ожидать, что этот атрибут запроса будет присутствовать во всех сценариях.
/**
* Name of the {@link HttpServletRequest} attribute that contains the path
* within the handler mapping, in case of a pattern match, or the full
* relevant URI (typically within the DispatcherServlet's mapping) else.
* <p>Note: This attribute is not required to be supported by all
* HandlerMapping implementations. URL-based HandlerMappings will
* typically support it, but handlers should not necessarily expect
* this request attribute to be present in all scenarios.
*/
String PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE = HandlerMapping.class.getName() + ".pathWithinHandlerMapping";
1.2. ЛУЧШИЙ_СООТВЕТСТВУЮЩИЙ_ШАБЛОН_АТРИБУТ
Имя атрибута HttpServletRequest, включая наиболее подходящий шаблон в карте обработчика.
/**
* Name of the {@link HttpServletRequest} attribute that contains the
* best matching pattern within the handler mapping.
* <p>Note: This attribute is not required to be supported by all
* HandlerMapping implementations. URL-based HandlerMappings will
* typically support it, but handlers should not necessarily expect
* this request attribute to be present in all scenarios.
*/
String BEST_MATCHING_PATTERN_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingPattern";
1.3. INTROSPECT_TYPE_LEVEL_MAPPING
Имя атрибута HttpServletRequest, указывающее, следует ли проверять сопоставление на уровне типов.
/**
* Name of the boolean {@link HttpServletRequest} attribute that indicates
* whether type-level mappings should be inspected.
* <p>Note: This attribute is not required to be supported by all
* HandlerMapping implementations.
*/
String INTROSPECT_TYPE_LEVEL_MAPPING = HandlerMapping.class.getName() + ".introspectTypeLevelMapping";
1.4. URI_TEMPLATE_VARIABLES_ATTRIBUTE
Имя атрибута HttpServletRequest, содержащего сопоставление шаблона URI, сопоставление имен переменных со значениями.
/**
* Name of the {@link HttpServletRequest} attribute that contains the URI
* templates map, mapping variable names to values.
* <p>Note: This attribute is not required to be supported by all
* HandlerMapping implementations. URL-based HandlerMappings will
* typically support it, but handlers should not necessarily expect
* this request attribute to be present in all scenarios.
*/
String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";
1.5. MATRIX_VARIABLES_ATTRIBUTE
Имя атрибута HttpServletRequest, содержащего сопоставление с переменными матрицы URI. Это свойство не обязательно должно поддерживаться всеми реализациями HandlerMapping и может присутствовать или отсутствовать в зависимости от того, настроено ли свойство HandlerMapping для сохранения содержимого матричных переменных в URI запроса.
/**
* Name of the {@link HttpServletRequest} attribute that contains a map with
* URI matrix variables.
* <p>Note: This attribute is not required to be supported by all
* HandlerMapping implementations and may also not be present depending on
* whether the HandlerMapping is configured to keep matrix variable content
* in the request URI.
*/
String MATRIX_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".matrixVariables";
1.6. PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE
Имя атрибута HttpServletRequest, который содержит сборную коллекцию MediaTypes, которую можно использовать для сопоставления обработчиков.
/**
* Name of the {@link HttpServletRequest} attribute that contains the set of
* producible MediaTypes applicable to the mapped handler.
* <p>Note: This attribute is not required to be supported by all
* HandlerMapping implementations. Handlers should not necessarily expect
* this request attribute to be present in all scenarios.
*/
String PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE = HandlerMapping.class.getName() + ".producibleMediaTypes";
2. Основной метод
В интерфейсе HandlerMapping есть только один метод:
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
Как видно из определения метода, метод getHandler предназначен для получения HandlerExecutionChain через запрос, этот метод реализован в разных подклассах, и конкретная реализация будет подробно проанализирована при описании подклассов позже.
3. Подкласс HandlerMapping
图中黄色部分表示已经过时的类,时间开发中不建议再使用。
В системе HandlerMapping видно, что подклассы HandlerMapping можно разделить на две ветви;
- AbstractHandlerMethodMapping
- AbstractUrlHandlerMapping
Вышеуказанные два абстрактных класса являются подклассами AbstractHandlerMapping. Мы узнаем об AbstractHandlerMapping в следующей статье.
大家如果有什么意见或者建议可以在下方评论区留言,也可以给我们发邮件(glmapper_2018@163.com)!欢迎小伙伴与我们一起交流,一起成长。