מדריך למיפוי מטפלים באביב

1. הקדמה

באביב MVC, DispatcherServlet משמש כבקר קדמי - מקבל את כל בקשות ה- HTTP הנכנסות ועיבודן.

במילים פשוטות, העיבוד מתרחש על ידי העברת הבקשות לרכיב הרלוונטי בעזרת מיפוי מטפלים.

HandlerMapping הוא ממשק המגדיר מיפוי בין בקשות לאובייקטים מטפלים. בעוד שמסגרת MVC של Spring מספקת כמה יישומים מוכנים, המפתחים יכולים להיות מיושמים על מנת לספק אסטרטגיית מיפוי מותאמת אישית.

מאמר זה דן בכמה מהיישומים שמספק Spring MVC כלומר מיפוי BeanNameUrlHandler, SimpleUrlHandlerMapping, ControllerClassNameHandlerMapping, תצורתם, וההבדלים ביניהם.

2. מיפוי BeanNameUrlHandler

מיפוי BeanNameUrlHandler הוא ברירת המחדל HandlerMapping יישום. BeanNameUrlHandlerMapping ממפה כתובות אתרים לבקשות לפולים עם אותו שם.

למיפוי מסוים זה יש תמיכה בהתאמת שמות ישירה וגם בהתאמת תבניות באמצעות התבנית "*".

לדוגמא, כתובת URL נכנסת "/ Foo" מפות לשעועית שנקראת "/ Foo". דוגמא למיפוי תבניות היא מיפוי בקשות ל "/ Foo *" לשעועית עם שמות שמתחילים ב "/ Foo" כמו “/ Foo2 /” אוֹ "/ FooOne /".

בואו להגדיר את הדוגמה הזו כאן ונרשום בקר שעועית שמטפל בבקשות “/ BeanNameUrl”:

@Configuration בכיתה ציבורית BeanNameUrlHandlerMappingConfig {@Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping () {החזר BeanNameUrlHandlerMapping חדש (); } @Bean ("/ beanNameUrl") WelcomeController ציבורי ברוך הבא () {להחזיר WelcomeController חדש (); }}

זהו המקבילה ל- XML ​​של התצורה הבאה מבוססת Java:

חשוב לציין כי בשתי התצורות הללו, הגדרת שעועית עבור BeanNameUrlHandlerMapping אינו נדרש כפי שהוא מסופק על ידי אביב MVC. הסרת הגדרת שעועית זו לא תגרום לבעיות ובקשות עדיין ימופו לפולי המטפל הרשומים שלהם.

עכשיו כל הבקשות ל “/ BeanNameUrl” יועבר על ידי DispatcherServlet ל "WelcomeController“. WelcomeController מחזיר שם תצוגה שנקרא "ברוך הבא“.

הקוד הבא בודק תצורה זו ומוודא כי שם התצוגה הנכונה מוחזר:

class class BeanNameMappingConfigTest {// ... @Test public void whenBeanNameMapping_thenMappedOK () {mockMvc.perform (get ("/ beanNameUrl")). andExpect (status (). isOk ()). and Expect (view (). name (" ברוך הבא")); }}

3. SimpleUrlHandlerMapping

לאחר מכן, SimpleUrlHandlerMapping הוא הכי גמיש HandlerMapping יישום. הוא מאפשר מיפוי ישיר והצהרתי בין מופעי שעועית לכתובות אתרים או בין שמות שעועית לכתובות אתרים.

בואו למפות בקשות “/ SimpleUrlWelcome” ו “/ * / SimpleUrlWelcome” אל ה "ברוך הבא" אפונה:

@Configuration public class SimpleUrlHandlerMappingConfig {@Bean public SimpleUrlHandlerMapping simpleUrlHandlerMapping () {SimpleUrlHandlerMapping simpleUrlHandlerMapping = new SimpleUrlHandlerMapping (); מפה urlMap = HashMap חדש (); urlMap.put ("/ simpleUrlWelcome", ברוך הבא ()); simpleUrlHandlerMapping.setUrlMap (urlMap); החזר simpleUrlHandlerMapping; } @Bean WelcomeController ציבורי ברוך הבא () {להחזיר WelcomeController חדש (); }}

לחלופין, הנה תצורת ה- XML ​​המקבילה:

   / simpleUrlWelcome = ברוך הבא / * / simpleUrlWelcome = ברוך הבא 

חשוב לציין שבתצורת XML, מיפוי בין “” התג חייב להיעשות בצורה המקובלת על java.util. נכסים בכיתה והיא צריכה לעקוב אחר התחביר: נתיב = Handler_Bean_Name.

בדרך כלל כתובת ה- URL צריכה להיות עם קו נטוי מוביל, אולם אם הנתיב לא מתחיל בכזה, Spring MVC מוסיף אותו באופן אוטומטי.

דרך אחרת להגדיר את הדוגמה לעיל ב- XML ​​היא להשתמש ב- "אביזרים" נכס במקום "ערך". אביזרים יש רשימה של "לִתְמוֹך" תג שם כל אחד מגדיר מיפוי היכן "מַפְתֵחַ" התייחס לכתובת האתר הממופה וערך התג הוא שם השעועית.

   ברוך הבא ברוך הבא 

מקרה הבדיקה הבא מוודא שבקשות ל "/simpleUrlWelcomeמטופל על ידי "WelcomeController ” שמחזיר שם תצוגה שנקרא "ברוך הבא" :

מחלקה ציבורית SimpleUrlMappingConfigTest {// ... @Test הציבור ריק כאשר SimpleUrlMapping_thenMappedOK () {mockMvc.perform (get ("/ simpleUrlWelcome")). andExpect (status (). isOk ()). andExpect (view (). name (" ברוך הבא")); }}

4. ControllerClassNameHandlerMapping (הוסר באביב 5)

ה ControllerClassNameHandlerMapping ממפה כתובת אתר לשעועית בקר רשומה (או לבקר שמסומן עם @בקר ביאור) שיש לו או מתחיל עם אותו שם.

זה יכול להיות נוח יותר בתרחישים רבים במיוחד עבור יישומי בקר פשוטים המטפלים בסוג בקשה יחיד. האמנה בה השתמש MVC באביב היא להשתמש בשם הכיתה ולהסיר את ה- "בקר" סיומת, ואז שנה את השם לאותיות קטנות והחזיר אותו כמיפוי עם מוביל “/”.

לדוגמה "WelcomeController" יחזור כמיפוי אל "/ברוך הבא*", כלומר לכל כתובת אתר שמתחילה ב- "ברוך הבא".

בואו להגדיר ControllerClassNameHandlerMapping:

@Configuration public class ControllerClassNameHandlerMappingConfig {@Bean Public ControllerClassNameHandlerMapping controllerClassNameHandlerMapping () {החזר ControllerClassNameHandlerMapping חדש (); } @Bean WelcomeController ציבורי ברוך הבא () {להחזיר WelcomeController חדש (); }}

ציין זאת ControllerClassNameHandlerMapping הוא הוצא משימוש באביב 4.3 לטובת שיטות מטפלות מונעות ביאורים.

הערה חשובה נוספת היא ששמות הבקר תמיד יוחזרו באותיות קטנות (פחות הסיומת "בקר"). אז אם יש לנו בקר שנקרא "WelcomeBaeldungController", זה יטפל רק בבקשות ל "/ Welcomebaeldung" ולא ל "/ WelcomeBaeldung".

הן בתצורת ה- Java והן בתצורת ה- XML ​​להלן, אנו מגדירים ControllerClassNameHandlerMapping שעועית ורישום שעועית עבור הבקרים שבהם נשתמש לטיפול בקשות. אנו רושמים גם שעועית מסוג "WelcomeController" והשעועית הזו תטפל בכל הבקשות שמתחילות בה "/ברוך הבא".

הנה תצורת ה- XML ​​המקבילה:

בעת שימוש בתצורה שלמעלה, בקשות ל “/ברוך הבא"יטופל על ידי"WelcomeController“.

הקוד הבא יוודא שהבקשות ל- “/ברוך הבא*" כמו "/בברכה"מטופל על ידי" WelcomeController "המחזיר שם תצוגה בשם"ברוך הבא“:

class class ControllerClassNameHandlerMappingTest {// ... @Test public void whenControllerClassNameMapping_thenMappedOK () {mockMvc.perform (get ("/ welcometest")). andExpect (status (). isOk ()). and Expect (view (). name (" ברוך הבא")); }}

5. קביעת תצורה של עדיפויות

מסגרת MVC של אביב מאפשרת יותר מיישום אחד של HandlerMapping ממשק בו זמנית.

הבה ניצור תצורה ונרשם שני בקרים, שניהם ממופים לכתובת URL "/ welcome", רק תוך שימוש במיפוי שונה ומחזירים שמות תצוגה שונים:

@Configuration public class HandlerMappingDefaultConfig {@Bean ("/ welcome") public BeanNameHandlerMappingController beanNameHandlerMapping () {להחזיר BeanNameHandlerMappingController חדש (); } @Bean WelcomeController ציבורי ברוך הבא () {להחזיר WelcomeController חדש (); }}

ללא רשום מיפוי מטפל מפורש, ברירת מחדל מיפוי שעועית יהיה בשימוש. הבה נקבע התנהגות זו במבחן:

@ מבחן ציבורי בטל כאשרConfiguringPriorities_thenMappedOK () {mockMvc.perform (get ("/ welcome")). AndExpect (status (). IsOk ()). AndExpect (view (). Name ("מיפוי-שם-מטפל-מיפוי") ); } 

אם נרשום במפורש מיפוי מטפל אחר, מיפוי ברירת המחדל יעקף. עם זאת, מעניין לראות מה קורה כששני ממפים רשומים במפורש:

@Configuration מחלקה ציבורית HandlerMappingPrioritiesConfig {@Bean BeanNameUrlHandlerMapping beanNameUrlHandlerMapping () {BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping (); החזר beanNameUrlHandlerMapping; } @Bean הציבור SimpleUrlHandlerMapping simpleUrlHandlerMapping () {SimpleUrlHandlerMapping simpleUrlHandlerMapping = חדש SimpleUrlHandlerMapping (); מפה urlMap = HashMap חדש (); urlMap.put ("/ welcome", simpleUrlMapping ()); simpleUrlHandlerMapping.setUrlMap (urlMap); החזר simpleUrlHandlerMapping; } @Bean SimpleUrlMappingController ציבורי simpleUrlMapping () {להחזיר SimpleUrlMappingController חדש (); } @Bean ("/ welcome") ציבורי BeanNameHandlerMappingController beanNameHandlerMapping () {להחזיר BeanNameHandlerMappingController חדש (); }}

כדי לקבל את השליטה באיזה מיפוי משתמשים, סדר העדיפויות נקבע באמצעות setOrder (סדר int) שיטה. שיטה זו אורכת אחת int פרמטר כאשר ערך נמוך יותר פירושו עדיפות גבוהה יותר.

בתצורת XML תוכלו להגדיר סדרי עדיפויות באמצעות מאפיין שנקרא "להזמין":

תן לנו להוסיף להזמין מאפיינים למיפוי שעועית למיפוי, באמצעות הבאים beanNameUrlHandlerMapping.setOrder (1) ו simpleUrlHandlerMapping.setOrder (0). הערך הנמוך יותר של להזמין רכוש משקף עדיפות גבוהה יותר. הבה נקבע התנהגות חדשה במבחן:

@ מבחן ציבורי בטל כאשרConfiguringPriorities_thenMappedOK () {mockMvc.perform (get ("/ Welcome")) .andExpect (status (). IsOk ()). AndExpect (view (). Name ("מיפוי מטפל פשוט-url") ); }

בעת בדיקת התצורה לעיל, אתה רואה את זה מבקש "/ברוך הבא" יטופל על ידי SimpleUrlHandlerMapping שעועית שקוראת לה SimpleUrlHandlerController וחוזר מיפוי פשוט- url-handler נוף. אנחנו יכולים להגדיר בקלות את מיפוי שעועית לקבל עדיפות על ידי התאמה בהתאם לערכים של להזמין תכונה.

6. מסקנה

במאמר זה דנו כיצד מטפלים במיפוי כתובות אתרים במסגרת Spring MVC על ידי בחינת היישומים השונים במסגרת.

את הקוד שמלווה מאמר זה ניתן למצוא באתר GitHub.