ניתוב ביישומי הפעלה בג'אווה

1. סקירה כללית

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

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

במדריך זה נחקור את היבט הניתוב בפיתוח יישומי אינטרנט באמצעות Play Framework.

2. התקנה

ראשית, נצטרך ליצור יישום Java Play. הפרטים על אופן הגדרת Play Framework במכונה זמינים במאמר ההיכרות שלנו.

בסוף ההתקנה, אמורה להיות לנו אפליקציית Play עובדת אליה אנו יכולים לגשת מדפדפן.

3. ניתוב HTTP

אז איך Play יודע עם איזה בקר להתייעץ בכל פעם שאנחנו שולחים בקשת HTTP? התשובה לשאלה זו טמונה ב אפליקציה / conf / מסלולים קובץ תצורה.

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

כל אחד מהאירועים הללו מספק נתב עם שני פרמטרים: נתיב בקשה עם מחרוזת השאילתה שלו ושיטת ה- HTTP של הבקשה.

4. ניתוב בסיסי עם משחק

כדי שהנתב יבצע את עבודתו, ה- conf / מסלולים על הקובץ להגדיר מיפויים של שיטות HTTP ודפוסי URI לפעולות בקר מתאימות:

GET / controllers.HomeController.index GET / נכסים / * בקרי קבצים. Assets.versioned (path = "/ public", file: Asset)

כל קבצי המסלולים חייבים למפות גם את המשאבים הסטטיים ב- משחק ניתוב / ציבורי התיקיה הזמינה ללקוח ב- / נכסים נקודת סיום.

שימו לב לתחביר של הגדרת מסלולי HTTP ולשיטת HTTP מֶרחָב דפוס URI מֶרחָב פעולת בקר.

5. דפוסי URI

בחלק זה נפרט מעט על דפוסי URI.

5.1. דפוסי URI סטטיים

שלושת דפוסי ה- URI הראשונים לעיל הם סטטיים. המשמעות היא כי מיפוי כתובות ה- URL למשאבים מתרחש ללא כל עיבוד נוסף בפעולות הבקר.

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

5.2. דפוסי URI דינמיים

דפוס ה- URI האחרון לעיל הוא דינמי. המשמעות היא שפעולת הבקר המשרתת בקשה ב- URI אלה זקוקה למידע מהבקשה כדי לקבוע את התגובה. במקרה הנ"ל, הוא מצפה לשם קובץ.

רצף האירועים הרגיל הוא שהנתב מקבל אירוע, בוחר את הנתיב מכתובת ה- URL, מפענח את מקטעיו ומעביר אותם לבקר.

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

6. ניתוב מתקדם עם הפעלה

בחלק זה נדון בפירוט באפשרויות מתקדמות בניתוב באמצעות דפוסי URI דינמיים.

6.1. פרמטרים של נתיב פשוט

פרמטרים פשוטים של נתיב הם פרמטרים ללא שם בכתובת URL לבקשה המופיעים אחרי המארח והיציאה ומנותחים לפי סדר ההופעה.

בְּתוֹך play-routing / app / HomeController.javaבואו ניצור פעולה חדשה:

ברכת תוצאה ציבורית (שם מחרוזת) {להחזיר בסדר ("שלום" + שם); }

אנו רוצים להיות מסוגלים לבחור פרמטר נתיב מכתובת האתר של הבקשה ולמפות אותו לשם המשתנה.

הנתב יקבל את הערכים מתצורת המסלול.

אז בואו נפתח play-routing / conf / מסלולים וליצור מיפוי לפעולה חדשה זו:

GET / greet /: controllers name. HomeController.greet (שם: מחרוזת)

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

עכשיו, בואו נטען // locahost: 9000 / greet / john בדפדפן, ונקבל את פנינו בשם:

שלום ג'ון

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

בואו נתבל את שלנו /לברך נקודת קצה עם מידע על גיל.

בחזרה ל HomeControllerפעולה של ברכה, נשנה אותה ל:

ברכת תוצאה ציבורית (שם מחרוזת, גיל int)) {חזור בסדר ("שלום" + שם + ", אתה בן" + גיל + "שנים"); }

והמסלול ל:

GET / שלום /: שם /: בקרי גיל. HomeController.greet (שם: מחרוזת, גיל: מספר שלם)

שימו לב גם לתחביר Scala להכריז על משתנה, גיל: שלם. ב- Java היינו משתמשים ב- גיל שלם תחביר. מסגרת הפליי בנויה בסקאלה. כתוצאה מכך, יש הרבה תחביר סקאלה.

בואו נטען // localhost: 9000 / greet / john / 26:

שלום ג'ון, אתה בן 26

6.2. תווים כלליים בפרמטרים של נתיב

בקובץ התצורה של המסלולים שלנו, המיפוי האחרון הוא:

GET / נכסים / * בקרי קבצים. Assets.versioned (path = "/ public", file: Asset)

אנו משתמשים בתו כללי בחלק הדינמי של השביל. מה שאנחנו אומרים לפליי הוא שכל הערך שיחליף *קוֹבֶץ בבקשה בפועל יש לנתח בכללותה ולא לפענח אותה כמו במקרים אחרים של פרמטרים נתיביים.

בדוגמה זו, הבקר הוא מובנה, נכסים, המאפשר ללקוח להוריד קבצים מה- משחק ניתוב / ציבורי תיקיה. כשאנחנו מעמיסים //localhost:9000/assets/images/favicon.png, עלינו לראות את התמונה של ה- Favicon Play בדפדפן מכיוון שהוא קיים ב- / ציבור / תמונות תיקיה.

בואו ניצור פעולת דוגמא משלנו ב HomeController.java:

תוצאה ציבורית introMe (נתוני מחרוזת) {מחרוזת [] clientData = data.split (","); החזר בסדר ("שמך הוא" + clientData [0] + ", אתה" + clientData [1] + "בן שנים"); }

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

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

בואו ניצור מסלול לפעולה זו:

בקרי נתונים GET / * .HomeController.introducMe (נתונים)

כעת טען את כתובת האתר // localhost: 9000 / john, 26. פעולה זו תדפיס:

קוראים לך ג'ון, אתה בן 26

6.3. Regex בפרמטרים של נתיב

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

התוצאה הציבורית squareMe (ארוך מספר) {להחזיר בסדר (מספר + "בריבוע הוא" + (מספר * מספר)); }

כעת נוסיף את מסלולו:

בקרי GET / ריבוע / $ num.HomeController.squareMe (מספר: ארוך)

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

עכשיו אם הצבנו את המסלול לפי ההוראות בפסקה הקודמת, ונטען // localhost: 9000 / ריבוע / 2, יש לברך אותנו עם אינדקס מערך מחוץ לתחום Exception:

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

במקום מחרוזת תוחמת פסיק, ה- תציג אותי השיטה נקראה עם המחרוזת "מרובע / 2". כתוצאה מכך, לאחר פיצולו, קיבלנו מערך בגודל אחד. מנסה להגיע לאינדקס 1 ואז זרק את החריג.

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

7. עדיפות ניתוב

אם יש התנגשות בין מסלולים כמו שיש ביניהם מרובע ו תציג אותי, לאחר מכן Play בוחר את המסלול הראשון בסדר ההצהרה.

מדוע יש סכסוך? בגלל נתיב ההקשר של תווים כלליים /*נתונים תואם לכל כתובת אתר לבקשה מלבד נתיב הבסיס /. כך כל מסלול שתבנית ה- URI שלו משתמשת בכרטיסי בר צריך להופיע אחרון לפי הסדר.

עכשיו בואו נשנה את סדר ההצהרה של המסלולים כך שה- תציג אותי המסלול בא אחרי מרובע וטען מחדש:

2 בריבוע הוא 4

כדי לבדוק את כוחם של ביטויים רגולריים במסלול, נסה לטעון // locahost: 9000 / ריבוע / -1, נתב לא יצליח להתאים את ה- מרובע מַסלוּל. במקום זאת, זה יתאים תציג אותי, ונקבל את אינדקס מערך מחוץ לתחום Exception שוב.

זה בגלל ש -1 אינו תואם את הביטוי הרגולרי הניתן, ואין שום אופי אלפביתי.

8. פרמטרים

עד לנקודה זו כיסינו את התחביר להכרזת סוגי פרמטרים בקובץ routes.

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

8.1. פרמטרים עם ערכים קבועים

לפעמים נרצה להשתמש בערך קבוע לפרמטר. זו הדרך שלנו לומר ל- Play להשתמש בפרמטר הנתיב שסופק או אם הקשר הבקשה הוא הנתיב /ואז השתמש בערך קבוע מסוים.

דרך נוספת להסתכל עליו היא קיום שני נקודות קצה או נתיבי הקשר המובילים לאותה פעולת בקר - כאשר נקודת קצה אחת מחייבת פרמטר מכתובת האתר של הבקשה ומוגדרת כברירת מחדל לאחרת במקרה שהפרמטר האמור נעדר.

כדי להדגים זאת, בואו להוסיף א סוֹפֵר() פעולה ל HomeController:

כותב התוצאות הציבורי () {return ok ("ניתוב בהצגה מאת באלדונג"); }

בהנחה שלא תמיד נרצה שה- API שלנו יחזיר a חוּט:

ניתוב במשחק מאת באלדונג

אנו רוצים לשלוט בכך על ידי שליחת שמו של מחבר המאמר יחד עם הבקשה, תוך ברירת מחדל לערך הקבוע באלדונג רק אם אין את הבקשה מְחַבֵּר פָּרָמֶטֶר.

בואו ונשנה עוד יותר את סוֹפֵר פעולה על ידי הוספת פרמטר:

כותב תוצאה ציבורי (מחבר מחרוזות) {return ok ("REST API עם הפעלה מאת" + מחבר); }

בואו נראה גם כיצד להוסיף פרמטר לערך קבוע למסלול:

GET / סופרים בקרים. HomeController.writer (author = "Baeldung") GET / author /: author controllers.HomeController.writer (author: String)

שימו לב כיצד יש לנו כעת שני מסלולים נפרדים המובילים אל HomeController.index פעולה במקום אחת.

כאשר אנו מעמיסים כעת // localhost: 9000 / סופר מהדפדפן שאנו מקבלים:

ניתוב במשחק מאת באלדונג

וכשאנחנו מעמיסים // localhost: 9000 / סופר / ג'ון, אנחנו מקבלים:

ניתוב במשחק מאת ג'ון

8.2. פרמטרים עם ערכי ברירת מחדל

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

ההבדל בין השניים הוא בכך ערכים קבועים משמשים כ- fallback עבור פרמטרים של נתיב ואילו ערכי ברירת מחדל משמשים כ- fallback עבור פרמטרים של שאילתה.

פרמטרים של נתיב הם מהצורה // localhost: 9000 / param1 / param2 ופרמטרים של שאילתה הם מהטופס // localhost: 9000 /? param1 = value1¶m2 = value2.

ההבדל השני הוא בתחביר של הכרזת השניים במסלול. פרמטרים של ערך קבוע משתמשים במפעיל ההקצאה כמו:

מחבר = "באלדונג"

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

מחבר? = "באלדונג"

אנו משתמשים ב- ?= מפעיל אשר מקצה בתנאי באלדונג ל מְחַבֵּר במקרה מְחַבֵּר נמצא שאינו מכיל שום ערך.

כדי לקבל הדגמה מלאה, בואו ליצור את HomeController.writer פעולה. בוא נגיד, מלבד שם המחבר שהוא פרמטר נתיב, אנחנו רוצים גם לעבור מחבר תְעוּדַת זֶהוּת כפרמטר שאילתה שאמור להיות ברירת המחדל ל 1 אם לא הועבר בבקשה.

נשנה סוֹפֵר פעולה ל:

כותב תוצאה ציבורי (מחבר מחרוזת, מזהה int) {return ok ("ניתוב בהצגה מאת:" + author + "ID:" + id); }

וה סוֹפֵר מסלולים אל:

בקרי GET / סופרים. HomeController.writer (author = "Baeldung", id: Int? = 1) GET / writer /: controllers author. HomeController.writer (author: String, id: Int? = 1)

בטעינה // localhost: 9000 / סופר אנחנו מבינים:

ניתוב במשחק מאת: Baeldung תעודת זהות: 1

להכות // localhost: 9000 / כותב? id = 10 נותן לנו:

ניתוב במשחק מאת: Baeldung תעודת זהות: 10

מה לגבי // localhost: 9000 / סופר / ג'ון?

ניתוב במשחק מאת: john ID: 1

ולבסוף, // localhost: 9000 / סופר / ג'ון? id = 5 החזרות:

ניתוב במשחק מאת: john ID: 5

9. מסקנה

במאמר זה בחנו את הרעיון של ניתוב ביישומי פליי. יש לנו גם מאמר על בניית ממשק API RESTful עם Play Framework שבו מושגי הניתוב במדריך זה מיושמים בדוגמה מעשית.

כרגיל, קוד המקור של הדרכה זו זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found