AbstracThandLermapping реализует Gethandler, указанный интерфейсом ручной работы
1. Предоставьте метод Gethandlerinternal Template для реализации подкласса
2. Если обработчик не получен, используется невыполнение по умолчанию.
3. Если обработчик имеет тип строки, получите экземпляр из контекста
4. Инкапсулируйте обработчик через GethandlerexecutionChain и добавьте перехватчик
// AbstracThandLermApping/*** Посмотрите обработчик для данного запроса, возвращаясь к обработчику по умолчанию*, если не найдено конкретного.* @Param Запрос текущий http* @return Соответствующий экземпляр обработчика, или по умолчанию* @see #gethandlerternal*/public handlerexecutionchain gethandler (httpservervest) Gethandlerinternal (запрос); if (handler == null) {handler = getDefaulthandler ();} if (handler == null) {return null;} // Имя бока или разрешение? gethandlerexecutionchain (handler, request);} // AbstracthandLermapping/*** создать handleRexecutionchain для данного обработчика, включая применимые перехватчики.* <p> Реализация по умолчанию просто строит стандартный handlerexecutionchain с* заданным ручным, с точки зрения общего интерцептора и любых@@lincemancement rapplince URL Подклассы могут* переопределить это, чтобы расширить/переставить список перехватчиков.* <p> <b> Примечание: </b> Объект обработчика может быть необработанным обработчиком или предварительно построенным* handlerexecutionchain. Этот метод должен явно обращаться с этими двумя случаями,* либо создание новой HandleRexeCutionChation, либо расширяя существующую цепочку.* <p> За простое добавление перехвата, рассмотрите возможность вызовы {@code super.gethandlexecutionchain}* и вызов {@link handlerexecutionchain#addterceptor} на возвращаемом цепочке. null})* @param request current HTTP request* @return the HandlerExecutionChain (never {@code null})* @see #getAdaptedInterceptors()*/protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {HandlerExecutionChain chain =(handler instanceof HandleRexeCutionChain) обработчик: new HandleRexeCutionChain (Handler); chain.addinterceptors (getAdaptedInterceptors ()); string lookuppath = urlpathhelper.getlookuppathforrequest (запрос); для (mapedinterceptor mapedinterceptor: mapedinterceptors) {if (mapedinterceptor.matches (lookuppath, pathmatcher)) {chain.addinterceptor (mapedInterceptor.getInterceptor ());}} return heach;} Затем взгляните на Gethandlerinternal, реализованный Abstracturlhandlermapp
// AbstractUrlHandLermApping/*** Посмотрите обработчик для пути URL данного запроса.* @Param запрос текущий http -запрос* @return экземпляр обработчика, или {@code null}, если никто не найден*/ @overrideprotected obj geturlpathhelper (). getlookuppathforrequest (request); // find handlerobject handler = lookuphandler (lookuppath, request); if (handler == null) {// Если нет совпадения для обработчика, вам нужно найти по умолчанию, вам необходимо обработать, чтобы по умолчанию по умолчанию, чтобы по умолчанию, чтобы по умолчанию, чтобы по умолчанию, чтобы по умолчанию, по умолчанию, чтобы по умолчанию, чтобы по умолчанию, чтобы по умолчанию, по умолчанию. Нужно // выставить path_within_handler_mapping_attribute для него. обработчик? if (экземпляр Rawhandler string) {string handlername = (string) rawhandler; rawhandler = getApplicationContext (). getBean (handlername);} // Метод зарезервированного обработчика для проверки. Lookuppath, Lookuppath, null);}} if (handler! = null && logger.isdebugenabled ()) {logger.debug ("mapping [" + lookuppath + "] до" + Handler);} else if (handler == null && logger.istraceenabled ()) {logprace (no a handler antlappath "]");} return Handler;} // AbstractUrlHandLermapping/*** Посмотрите экземпляр обработчика для данного пути URL.* <p> поддерживает прямые совпадения, например, зарегистрированные "/тест" совпадения "/тест",* и различные совпадения с шаблоном стиля муравья, например, зарегистрированное "/t*" совпадает*/тест "и"/команда ". Для получения подробной информации см. Класс AntPathMatcher.* <p> Поиск наиболее точного шаблона, где наиболее точный определяется как* самый длинный шаблон пути.* @Param urlpath URL -адрес боб отображается с* @param -запросом. @see org.springframework.util.antpathmatcher*/Защищенный объект Lookuphandler (String urlpath, httpservletrequest) Throws Exception {// Direct Match? Обработка HandlerObject HandlerObject = this.Handlermap.get (urlPath); if (handler! = Null) {// имя боба или разрешенный обработчик? If (instanceOf handler) {String handlername = (String) Handler; Handler = getApplicationContext (). GetBean (handlerName);} vaillerHandler (handlerPATE); urlpath, urlpath, null);} // pattern match? Сопоставление через выражения реализуется через AntPathMatcher. Конкретный анализ приведен ниже списка <string> matchingpatterns = new ArrayList <string> (); для (строка rescientedpattern: this.handlermap.keyset ()) {if (getPathMatcher (). Match (recarededPattern, urlpath)) {matchingpatterns.add (registeredPattern);}} String bestPatternMatch = Null; Comparator <String> patternComparator = getPathmather (). getPathternCATH = comparator <string> patternComparator = getPathMatcher (). if (! matchingpatterns.isempty ()) {collections.sort (matchpathterns, pattercomparator); if (logger.isdebugenabled ()) {logger.debug («Сопоставление шаблонов для запроса [« + urlpath + »] -« + matchingpatterns);} // words ships umards shipttity bestttyT. matchingpatterns.get ();} if (bestpatternmatch! = null) {handler = this.handlermap.get (bestpatternmatch); // имя боба или разрешенный обработчик? if (handler incessionof string) {string handlername = (String) Handler; Handler = GetApplicationContext (). getBean (gainlername); pathwithinmapping = getPathMatcher (). ExtractPathWithinPattern (BestPatternMatch, UrlPath); // Там может быть несколько «лучших шаблонов», давайте убедитесь, что у нас есть правильные переменные шаблона URI // для всех themmap <String, String> uritemplatevariblables = new LinkeDhashmap <строка> (););); for (String MatchingPattern: MatchingPatterns) {if (patterncomparator.compare (bestPatternMatch, MatchingPattern) ==) {map <string, string> vars = getPathMatcher (). Extracturitemplatevariables (matchingpattern, urlpath); map <string> decodepr geturlpathhelper (). decodepathvaribles (request, vars); urtemplatevariables.putall (decodedvars);}} if (logger.isdebugenabled ()) {logger.debug ("uri -переменные для запроса [ + urlpath +"] BuildPathexposedHandler (обработчик, BestPatternMatch, PathWithInmapping, UritemplateVariables);} // Нет обработчика ... return null;} Разработанный для проверки обработчиков, ничего не сделано, включая подклассы.
/*** подтвердить заданный обработчик против текущего запроса.* <p> Реализация по умолчанию пуста. Может быть переопределен в подклассах,*, например, для обеспечения соблюдения конкретных предварительных условий, выраженных в сопоставлениях URL.* @Param обработчик обработанного объекта для проверки* @param Запрос текущий http -запрос* @Throws исключение, если проверка не удалось*/Защищенный void valideHandler (обработчик объекта, запрос httpservlect).
Инкапсулируйте обработчик как HandleRexeCutionChain и добавьте PathExpositingHandlerInterceptor и UrtemplateVariableShandlerinterEcter Interceptor.
/*** Создайте объект обработчика для данного необработанного обработчика, выявляя фактический* обработчик*, а также* {@link #uri_template_variables_attribute} перед выполнением. это обнаруживает переменные атрибута пути и шаблона URI* @param rawhandler, сырой обработчик, чтобы выставить* @param pathwithinmaping the Path для выставки перед выполнением обработчика* @param urtemplatevariables the template templat String bestmatchingpattern, String pathwithinmapping, map <string, string> urtemplatevariables) {handlerexecutionchain chain = new handlerexecutionchain (rawhandler); chain.addinterceptor (новый PathExposedHandlerInterceptor (BestMatchingPattern, PathWithinMapping)); if (! collectiontils.isempty (uritemplatevariables)) {chain.addinterceptor (new uritemplatevariableshandlerinterceptor (uritemplatevaribly);Вышеуказанный контент - это соответствующее знание интерпретации исходного кода SpringMVC - AbstractUrlUrlhArdLermapping Series Распределение запросов, введенное вам. Я надеюсь, что это будет полезно для всех!