מדריך לתבנית הבקר הקדמי בג'אווה

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

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

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

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

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

2. איך זה עובד?

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

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

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

3. התקנה

3.1. תלות Maven

ראשית, נקבע חדש Maven WAR פרויקט עם javax.servlet-api כלול:

 javax.servlet javax.servlet-api 4.0.0-b01 מסופק 

בנוסף ל תוסף jetty-maven:

 org.eclipse.jetty jetty-maven-plugin 9.4.0.M1 / בקר קדמי 

3.2. דֶגֶם

לאחר מכן נגדיר א דֶגֶם כיתה ומודל מאגר. נשתמש בדברים הבאים סֵפֶר הכיתה כמודל שלנו:

ספר בכיתה ציבורית {מחבר מחרוזת פרטי; כותרת מחרוזת פרטית; מחיר זוגי פרטי; // קונסטרוקציות סטנדרטיות, קבוצות וקובעות}

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

ממשק ציבורי מדף ספרים {ברירת מחדל void init () {הוסף (ספר חדש ("וילסון, רוברט אנטון ושי, רוברט", "אילומינטי", 9.99)); הוסף (ספר חדש ("Fowler, Martin", "Patterns of Enterprise Application Architecture", 27.88)); } מדף הספרים getInstance (); תוספת בוליאנית (ספר אלקטרוני); ספר findByTitle (כותרת מחרוזת); }

3.3. FrontControllerServlet

היישום של ה- Servlet עצמו פשוט למדי. אנו מחלצים את שם הפקודה מבקשה, יוצרים באופן דינמי מופע חדש של מחלקת פקודה ומבצעים אותה.

זה מאפשר לנו להוסיף פקודות חדשות מבלי לשנות בסיס קוד שלנו בקר קדמי.

אפשרות נוספת היא הטמעת ה- Servlet תוך שימוש בהיגיון סטטי ומותנה. זה יתרון של בדיקת שגיאות בזמן הידור:

מחלקה ציבורית FrontControllerServlet מרחיב את HttpServlet {@Override מוגן void doGet (HttpServletRequest בקשה, HttpServletResponse תגובה) {FrontCommand command = getCommand (בקשה); command.init (getServletContext (), בקשה, תגובה); command.process (); } פרטי FrontCommand getCommand (בקשת HttpServletRequest) {נסה {Class type = Class.forName (String.format ("com.baeldung.enterprise.patterns.front." + "controller.commands.% sCommand", request.getParameter ("command) "))); החזר (FrontCommand) סוג .asSubclass (FrontCommand.class) .newInstance (); } לתפוס (חריג e) {להחזיר פקודה חדשה לא ידועה (); }}}

3.4. פיקוד קדמי

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

לכיתה זו יש גישה ל- ServletContext והתנגדות הבקשה והתגובה שלה. יתר על כן, הוא יטפל ברזולוציית התצוגה:

מעמד מופשט ציבורי FrontCommand {מוגן ServletContext הקשר; בקשת HttpServletRequest מוגנת; תגובת HttpServletResponse מוגנת; init בטל ציבורי (ServletContext servletContext, HttpServletRequest servletRequest, HttpServletResponse servletResponse) {this.context = servletContext; this.request = servletRequest; this.response = servletResponse; } תהליך בטל מופשט ציבורי () זורק ServletException, IOException; חלל מוגן קדימה (יעד מחרוזת) זורק ServletException, IOException {target = String.format ("/ WEB-INF / jsp /% s.jsp", target); משגר RequestDispatcher = context.getRequestDispatcher (יעד); dispatcher.forward (בקשה, תגובה); }}

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

מחלקה ציבורית SearchCommand מרחיב את FrontCommand {@Override תהליך הריק הציבורי () זורק את ServletException, IOException {Book book = new BookshelfImpl (). getInstance () .findByTitle (request.getParameter ("title")); אם (book! = null) {request.setAttribute ("ספר", ספר); קדימה ("נמצא ספר"); } אחר {forward ("book-notfound"); }}}

אם היישום פועל, אנו יכולים להגיע לפקודה זו על ידי הפניית הדפדפן שלנו אל // localhost: 8080 / front-controller /? Command = חיפוש & כותרת = דפוסים.

ה פקודת חיפוש נפתרת לשתי תצוגות, ניתן לבדוק את התצוגה השנייה באמצעות הבקשה הבאה // localhost: 8080 / front-controller /? command = Search & title = any-title.

כדי לסכם את התרחיש שלנו נבצע פקודה שנייה, אשר מופעלת כ- fallback בכל המקרים, בקשת פקודה אינה ידועה ל- Servlet:

מחלקה ציבורית UnknownCommand מרחיב את FrontCommand {@Override תהליך הריק הציבורי () זורק את ServletException, IOException {קדימה ("לא ידוע"); }}

ניתן להגיע לתצוגה זו ב // localhost: 8080 / front-controller /? Command = Order & title = any-title או על ידי השארת לחלוטין את כתובת אתר פרמטרים.

4. פריסה

כי החלטנו ליצור a מִלחָמָה פרויקט קובץ, נצטרך מתאר פריסת רשת. עם זה web.xml אנו יכולים להריץ את יישום האינטרנט שלנו בכל מיכל של Servlet:

   בקר קדמי com.baeldung.enterprise.patterns.front.controller.FrontControllerServlet בקר קדמי / 

כצעד האחרון נפעיל 'Mvn install jetty: run' ולבדוק את דעותינו בדפדפן.

5. מסקנה

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

כרגיל, תוכלו למצוא את המקורות ב- GitHub.


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