abstracthandlermapping ใช้ gethandler ที่ระบุโดยอินเตอร์เฟส handlermapping
1. ให้วิธีเทมเพลต gethandlerinternal เพื่อการใช้งาน subclass
2. หากไม่ได้รับตัวจัดการให้ใช้ defaulthandler เริ่มต้น
3. ถ้าตัวจัดการเป็นประเภทสตริงรับอินสแตนซ์จากบริบท
4. ห่อหุ้มตัวจัดการผ่าน gethandlerexecutionchain และเพิ่ม interceptor
// abstracthandlermapping/*** ค้นหาตัวจัดการสำหรับคำขอที่กำหนดให้กลับไปที่ค่าเริ่มต้น* ตัวจัดการหากไม่พบเฉพาะที่พบ* @param คำขอปัจจุบันคำขอ http ปัจจุบัน* @return อินสแตนซ์ของตัวจัดการที่สอดคล้องกัน gethandlerInternal (คำขอ); ถ้า (handler == null) {handler = getDefaulthandler ();} ถ้า (handler == null) {return null;} // ชื่อถั่ว gethandlerexecutionchain (ตัวจัดการ, คำขอ);} // abstracthandlermapping/*** สร้าง handlerexecutionchain สำหรับตัวจัดการที่กำหนดรวมถึง interceptors ที่ใช้งานได้* <p> การใช้งานเริ่มต้นเพียงแค่สร้าง@mapping currentsincefting url. subclasses อาจแทนที่สิ่งนี้เพื่อขยาย/จัดเรียงรายการของตัวดักใหม่* <p> <b> หมายเหตุ: </b> วัตถุที่ผ่านการส่งผ่านอาจเป็นตัวจัดการดิบหรือ handlerexecutionchain วิธีนี้ควรจัดการทั้งสองกรณีอย่างชัดเจน* ทั้งการสร้าง handlerexecutionchain ใหม่หรือขยายโซ่ที่มีอยู่* <p> สำหรับการเพิ่ม interceptor ให้พิจารณาเรียก {@code super.gethandlerexecutionchain}* และเรียกใช้ handleramler null})* @param คำขอปัจจุบันคำขอ http* @@return the handlerexecutionchain (ไม่เคย {@code null})* @See #GetAdaptedInterceptors ()*/HandlerexecutionChain GethandLerexecutionChain Handlerexecutionchain) ตัวจัดการ: Handlerexecutionchain ใหม่ (Handler); chain.addinterceptors (getAdaptedInterceptors ()); String lookuppath = urlPathHelper.getLookuppathForRequest (คำขอ); สำหรับ (mappedInterceptor mappedinterceptor: mapedinterceptors) {ถ้า (mapedinterceptor.matches {chain.addinterceptor (mappedInterceptor.getInterceptor ());}} return chain;} จากนั้นลองดูที่ gethandlerinternal ที่ดำเนินการโดย Abstracturlhandlermapping
// Abstracturlhandlermapping/*** ค้นหาตัวจัดการสำหรับเส้นทาง URL ของคำขอที่กำหนด* @param Request คำขอ http ปัจจุบัน* @return อินสแตนซ์ของตัวจัดการหรือ {@code null} หากไม่พบ*/ @overrideProtected Object GethandlerInternal geturlpathhelper (). getlookuppathforrequest (คำขอ); // ค้นหา handlerObject handler = lookuphandler (lookuppath, คำขอ); ถ้า (handler == null) {// หากไม่มีการจับคู่สำหรับ handler เพื่อหาค่าเริ่มต้น เปิดเผย path_within_handler_mapping_attribute สำหรับมันเช่นกัน rawhandler = null; ถ้า ("/".equals(lookuppath)) {rawhandler = getRoothandler ();} ถ้า (rawhandler == null) {rawhandler = getdefaulthandler () (อินสแตนซ์ rawhandler ของสตริง) {สตริง handlername = (สตริง) rawhandler; rawhandler = getApplicationContext (). getBean (handlername);} // วิธีการตรวจสอบการตรวจสอบที่สงวน null);}} if (handler! = null && logger.isdebugenabled ()) {logger.debug ("การแมป [" + lookuppath + "] ถึง" + handler);} อื่นถ้า (handler == null && logger.istraceenabled () Handler;} // Abstracturlhandlermapping/*** ค้นหาอินสแตนซ์ตัวจัดการสำหรับเส้นทาง URL ที่กำหนด* <p> รองรับการจับคู่โดยตรงเช่นการลงทะเบียน "/ทดสอบ" จับคู่ "/ทดสอบ",* และรูปแบบการจับคู่แบบมดแบบต่างๆเช่นการลงทะเบียน "/t*" จับคู่* สำหรับรายละเอียดให้ดูคลาส Antpathmatcher* <p> มองหารูปแบบที่แน่นอนที่สุดโดยที่แน่นอนที่สุดถูกกำหนดให้เป็น* รูปแบบเส้นทางที่ยาวที่สุด* @param urlpath url ถั่วถูกแมปไปที่* @param คำขอ http ปัจจุบัน (เพื่อแสดงเส้นทางภายใน @See org.springFramework.util.antPathMatcher*/วัตถุที่ได้รับการป้องกัน lookuphandler (string urlpath, คำขอ httpservletrequest) โยนข้อยกเว้น {// ตรงข้ามโดยตรง? ค้นหา handlerObject handler โดยตรง = this.handlermap.get (urlpath); ถ้า (handler! = null) {// ชื่อถั่วหรือตัวจัดการที่ได้รับการแก้ไขหรือไม่ถ้า (Handler Instance String) {String HandlerName = (String) Handler; handler = getApplicationContext () urlpath, null);} // การจับคู่รูปแบบ? การจับคู่ผ่านการแสดงออกจะถูกนำไปใช้ผ่าน Antpathmatcher การวิเคราะห์เฉพาะได้รับด้านล่างรายการ <string> matchingPatterns = new ArrayList <String> (); สำหรับ (String registeredPattern: this.handlermap.keyset ()) {ถ้า (getPathMatcher (). การจับคู่ (registeredPattern, urlPath)) {matchingPatterns.add (registeredPattern);}} สตริงที่ดีที่สุด if (! matchingpatterns.isempty ()) {collections.sort (matchingpatterns, patterncomparator); ถ้า (logger.isdebugenabled ()) {logger.debug ("รูปแบบการจับคู่สำหรับการร้องขอ [" urlpath + "] MatchingPatterns.get ();} ถ้า (bestpatternmatch! = null) {handler = this.handlermap.get (bestpatternmatch); // ชื่อถั่วหรือตัวจัดการที่ได้รับการแก้ไข? pathwithInmapping = getPathMatcher (). ExtractPathwithInpattern (BestPatternMatch, urlPath); // อาจมี 'รูปแบบที่ดีที่สุด' หลายรูปแบบขอให้แน่ใจว่าเรามีตัวแปรเทมเพลต URI ที่ถูกต้อง // สำหรับ (String MatchingPattern: MatchingPatterns) {ถ้า (patternComparator.Compare (BestPatternMatch, MatchingPattern) ==) {แผนที่ <สตริงสตริง> vars = getPathMatcher (). extracturiteMplateVariable geturlpathhelper (). decodepathvariables (คำขอ, vars); uritemplatevariables.putall (decodedvars);}} ถ้า (logger.isdebugenabled ()) {logger.debug ("ตัวแปรเทมเพลต Uri BuildPathexposedHandler (Handler, BestPatternMatch, PathWithInmapping, UritemplateVariables);} // ไม่พบตัวจัดการ ... กลับ null;} ออกแบบมาเพื่อตรวจสอบตัวจัดการไม่มีอะไรทำรวมถึงคลาสย่อย
/*** ตรวจสอบตัวจัดการที่กำหนดกับคำขอปัจจุบัน* <p> การใช้งานเริ่มต้นนั้นว่างเปล่า สามารถถูกแทนที่ในคลาสย่อย* ตัวอย่างเช่นการบังคับใช้เงื่อนไขเฉพาะที่แสดงในการแมป URL* @param Handler วัตถุ Handler เพื่อตรวจสอบความถูกต้อง
ห่อหุ้ม Handler เป็น handlerexecutionchain และเพิ่ม pathexpositinghandlerinterceptor และ uritemplatevariableshandlerinterceptor interceptor
/*** สร้างวัตถุตัวจัดการสำหรับตัวจัดการดิบที่กำหนดเผยให้เห็น* ตัวจัดการจริง, {@link #path_within_handler_mapping_attribute} เช่นเดียวกับ* {@link #uri_template_variables_attribute} เปิดเผยแอตทริบิวต์พา ธ และตัวแปรเทมเพลต URI* @param rawhandler ตัวจัดการดิบเพื่อเปิดเผย* @param pathwithinmapping เส้นทางที่จะเปิดเผยก่อนที่จะดำเนินการตัวจัดการ* @param uritemplateVariables ตัวแปร URI*/@code null} BestMatchingPattern, String PathWithInmapping, MAP <String, String> UriteMplateVariables) {HandlerexecutionChain Chain = HandlerexecutionChain (RawHandler); chain.addinterceptor (ใหม่ pathexposedhandlerInterceptor (bestmatchingpattern, pathwithinmapping)) ถ้า (! collectionutils.isempty (uritemplatevariables)) {chain.addinterceptorเนื้อหาข้างต้นเป็นความรู้ที่เกี่ยวข้องของการตีความซอร์สโค้ด SpringMVC ของการใช้งาน Handlermapping - Abstracturlhandlermapping Series Series Distribution แนะนำให้คุณรู้จัก ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน!