Abstractandlermapping mengimplementasikan getHandler yang ditentukan oleh antarmuka handlermapping
1. Menyediakan metode template getHandlerinternal untuk implementasi subkelas
2. Jika pawang tidak diperoleh, default defaulthandler digunakan.
3. Jika pawang adalah tipe string, dapatkan contoh dari konteks
4. Encapsulate pawang melalui getHandleRexecutionChain dan tambahkan pencegat
// AbstractHandlerMapping/*** Look up a handler for the given request, falling back to the default* handler if no specific one is found.* @param request current HTTP request* @return the corresponding handler instance, or the default handler* @see #getHandlerInternal*/public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {Object handler = getHandlerInternal(request);if (handler == null) {handler = getDefaultHandler();}if (handler == null) {return null;}// Bean name or resolved handler?if (handler instance of String) {String handlerName = (String) handler;handler = getApplicationContext().getBean(handlerName);}return getHandlerExecutionChain(handler, request);} // AbstractHandlerMapping/*** Build a HandlerExecutionChain for the given handler, including applicable interceptors.* <p>The default implementation simply builds a standard HandlerExecutionChain with* the given handler, the handler mapping's common interceptors, and any {@link MappedInterceptor}s* matching to the current request Url. Subkelas dapat* mengganti ini untuk memperluas/mengatur ulang daftar pencegat.* <p> <b> Catatan: </b> Objek pawang lulus mungkin merupakan penangan mentah atau handlerexecutionchain yang sudah dibangun. Metode ini harus menangani kedua kasus tersebut secara eksplisit,* baik membangun handleRexecutionChain baru atau memperluas rantai yang ada.* <p> Untuk hanya menambahkan interseptor, pertimbangkan memanggil {@code super.getHandLerExecutionChain}* dan nevoking {@link handlerexecutionChain#addIndInderceptor} pada rantai {@link handlerexecutionChain#addIndInderceptor} {never rantai {@link handlerexecutionChain#addIndEnceptor} {never rantai {@link handlerExecutionChain#addIndEnceptor} {never rantai {@link handlerexecutionChain# null})* @param Permintaan saat ini Permintaan http* @Keturn the handleRexecutionChain (never {@code null})* @see #getAdaptedInterceptors ()*/handleRexecution rantai handleRexecutionchain (handlexecution (handlerxecution (handlerxecution (handlerxecution (handlerxecution (handlerxecution (handlerxecution (handlexecution Handler: New HandLerExecutionChain (Handler); rantai.AddInterceptors (getAdaPtedInterceptors ()); string lookuppath = urlpathhelper.getLookuppathForRequest (request); for (dipetakan mapapedcenteptor: mappedInterceptors) {if (mappedIntercepTor.matchePor (lookuppath, pathmatcher) {craincorpore.addintepor (lookuppath, pathmatcher) {craincorpore.addintepor. rantai;} Selanjutnya, lihatlah GetHandlerinternal yang diimplementasikan oleh AbstracTurlandlermapping
// AbstractUrlHandlerMapping/*** Look up a handler for the URL path of the given request.* @param request current HTTP request* @return the handler instance, or {@code null} if none found*/@Overrideprotected Object getHandlerInternal(HttpServletRequest request) throws Exception {// Get urlString lookupPath = getUrlPathHelper (). getLookuppathForRequest (request); // temukan handlerObject handler = lookuphandler (lookuppath, request); if (handler == null) {// Jika tidak ada yang cocok untuk handler, Anda perlu menemukan yang default, Anda perlu menangani path_within_handler_attribute secara langsung, Anda perlu menangani path_within_handler_thandlone untuk perlu disimpan untuk disimpan untuk disimpan untuk cache_within_handler_mappapping for handlibute to cache for handler for wearplibute to cace for { untuk // mengekspos path_within_handler_mapping_attribute untuk itu juga. Handler? if (instance rawhandler dari string) {string handlerName = (string) rawhandler; rawhandler = getApplicationContext (). getBean (handlerName);} // Metode Template Handler yang Dicerminkan (Rawhandler, Permintaan); lookuppath, lookuppath, null);}} if (handler! = null && logger.isdebugeNabled ()) {logger.debug ("pemetaan [" + lookuppath + "] ke" + looking);} lain jika (handler == null && logger.istraceen () {handler == null && logger.istraceen () {handler == null && logger.istraceen () {handler == null && logger.istraceen () {handler == null && logger.istraceen () {handler == null && logger.istraceen () {handler. "]");} return handler;} // abstracturlhandlermapping/*** Cari contoh pawang untuk jalur URL yang diberikan.* <p> Mendukung kecocokan langsung, misalnya terdaftar "/tes" kecocokan "/tes",* dan berbagai kecocokan pola antar, misalnya tim yang terdaftar "/t*" keduanya "/"/"/"/" Untuk detailnya, lihat kelas Antpathmatcher.* <p> Mencari pola yang paling tepat, di mana paling tepat didefinisikan sebagai* pola jalur terpanjang.* @Param urlpath url kacang dipetakan ke* @param permintaan http saat ini @sopping @sning @soe @se @se @so @so @setne @return #so #soPo @soPo @so @code @coP @code @code @code @coP @coP @code @coP @coP @ org.springframework.util.antpathmatcher*/lookuphandler objek yang dilindungi (String urlpath, permintaan httpservletRequest) melempar pengecualian {// kecocokan langsung? Langsung Search HandlerObject Handler = this.handlermap.get (urlpath); if (handler! = Null) {// name bean atau handler terselesaikan? If (handler instance dari string) {string handlerName = (string) handler; handler = getApplicationContext (). Getbean (handlername);} valider valider (get handlicycontext (). Getbean (handlername);} valider valider (get handlicate). Getbean (handlername);} valider valider (get handlicy (). Getbean (handlername);} valider valider (get getPlicingContext (). Getbean (handlername);} valider valider (handlinger (). Urlpath, urlpath, null);} // POLA Pencocokan? Pencocokan melalui ekspresi diimplementasikan melalui Antpathmatcher. Analisis spesifik diberikan di bawah ini daftar <string> pencocokanPatterns = ArrayList baru <String> (); untuk (String RegisteredPattern: this.handlermap.keyset ()) {if (getPathmatcher (). Match (terdaftar, urlpath)) {matchingpatterns.add (terdaftar);}} string BestPatternMatch = null; komparator <string> PatternCompetaor = getPathmatcher (). if (!matchingPatterns.isEmpty()) {Collections.sort(matchingPatterns, patternComparator);if (logger.isDebugEnabled()) {logger.debug("Matching patterns for request [" + urlPath + "] are " + matchingPatterns);}// The lowest order number has the highest priority bestPatternMatch = matchingpatterns.get ();} if (BestPatternMatch! = null) {handler = this.handlermap.get (BestPatternMatch); // name bean atau handler terselesaikan? if (handler instance dari string) {string handlername = (string) handler; handler = getApplicationContext (). pathWithinMapping = getPathMatcher().extractPathWithinPattern(bestPatternMatch, urlPath);// There might be multiple 'best patterns', let's make sure we have the correct URI template variables// for all of themMap<String, String> uriTemplateVariables = new LinkedHashMap<String, String>(); untuk (String MatchingPattern: MatchingPatterns) {if (PatternComparator.compare (BestPatternMatch, MatchingPattern) ==) {MAP <String, String> vars = getPathMatcher (). ExtractureMplateVars, getingpath, Urlpath); peta <string, string> decodedvars = getEpat (get); peta (string, string> decodedvars = getEpat (get); peta (string, string> decodedvars = getEpat (get); peta <string, string> decodedvars = getEpat (moClPath); peta <string, string> decodedvars = getPathy (get); peta <string, string> decodedvars = getEpler (getEpatpath). vars); uritemplatevariable.putAll (decodedvars);}} if (logger.isdebugeNabled ()) {logger.debug ("variabel template uri untuk permintaan [" + urlpath + "] adalah" + uritemplatevaribles);} return smpath, uRlpather ( + Uritemplatevaribles);} return smpathpath, " + uritemplatevaribles);} return smpathPath (Urlpath"] adalah " + uritemplatevaribles);} return smpathPath (URLPATHEXPATE ( + URItemplatEvaribles);} returnMPPATES," + URITEMPLATEVARIABLES);} return smpathpath (UrlpatHExling ( + URITEMPLATEVARABles); uritemplatevariable);} // tidak ada penangan yang ditemukan ... return null;} Dirancang untuk memverifikasi penangan, tidak ada yang dilakukan, termasuk subclass.
/*** Validasi pawang yang diberikan terhadap permintaan saat ini.* <p> Implementasi default kosong. Can be overridden in subclasses,* for example to enforce specific preconditions expressed in URL mappings.* @param handler the handler object to validate* @param request current HTTP request* @throws Exception if validation failed*/protected void validateHandler(Object handler, HttpServletRequest request) throws Exception {} Encapsulate Handler sebagai HandLerExecutionChain, dan tambahkan PathExpositingHandlerCeptor dan UritemplatevariableShandLerInterceptor Interceptor.
/*** Bangun objek pawang untuk pawang mentah yang diberikan, mengekspos pawang* aktual, {@link #path_within_handler_mapping_attribute}, serta* {@link #uri_template_variables_attribute {@link. that exposes the path attribute and uri template variables* @param rawHandler the raw handler to expose* @param pathWithinMapping the path to expose before executing the handler* @param uriTemplateVariables the URI template variables, can be {@code null} if no variables found* @return the final handler object*/protected Object buildPathExposedHandler(Object rawHandler, String BestMatchingPattern, string pathwithInmapping, peta <string, string> uritemplatevariable) {handleRexecutionchain rantai = handleRexecutionchain baru (Rawhandler); Chain.AddInterceptor (PathexposedHandlerInterceptor baru (BestMatchingPattern, PathWithInmapping)); if (! Collection.isempty (uritemplatevariable)) {rantai.addInterceptor (UrItemplateVaribleShandLerInderceptor (UritempleTevaribles);Konten di atas adalah pengetahuan yang relevan dari interpretasi kode sumber SpringMVC dari Handlermapping - AbstractURLHandlermapping Series Distribusi permintaan yang diperkenalkan kepada Anda. Saya harap ini akan membantu semua orang!