מבוא ל- ActiveWeb

ג'אווה טופ

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

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

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

2. מושגי יסוד ועקרונות

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

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

לצורך ניהול תלות, היא משתמשת ב- Google Guice כמסגרת DI; למידע נוסף על Guice, עיין במדריך שלנו כאן.

3. הגדרת Maven

כדי להתחיל, בואו הוסף תחילה את התלות הדרושה:

 org.javalite activeweb 1.15 

הגרסה האחרונה תוכל למצוא כאן.

בנוסף, לצורך בדיקת היישום, נצטרך את ה- בדיקת אתרים פעילה תלות:

 org.javalite פעיל בדיקת אתרים 1.15 

בדוק את הגרסה האחרונה כאן.

4. מבנה היישום

כפי שדנו, מבנה היישום צריך לפעול על פי מוסכמה מסוימת; הנה איך זה נראה עבור יישום MVC טיפוסי:

כמו שאנו יכולים לראות, בקרים, שֵׁרוּת, config, ו דגמים צריך להיות ממוקם בחבילת המשנה שלהם ב אפליקציה חֲבִילָה.

הנופים צריכים להיות ממוקמים ב WEB-INF / תצוגות הספרייה, כל אחת מהן היא ספריית משנה משלה המבוססת על שם הבקר. לדוגמה app.controllers.ArticleController צריך שיהיה לו מאמר/ תיקיית משנה המכילה את כל קבצי התצוגה של אותו בקר.

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

... משגר org.javalite.activeweb.RequestDispatcher ... ...

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

... בית root_controller ...

5. בקרים

בקרים הם המרכיבים העיקריים של יישום ActiveWeb; וכפי שצוין קודם כל הבקרים צריכים להיות ממוקמים בתוך ה- app.controllers חֲבִילָה:

מחלקה ציבורית ArticleController מרחיבה את AppController {// ...}

שימו לב שהבקר מתרחב org.javalite.activeweb.AppController.

5.1. מיפוי כתובת URL של בקר

הבקרים ממופים לכתובת URL באופן אוטומטי על בסיס המוסכמה. לדוגמה, ArticleController ימופה ל:

// מארח: יציאה / contextroot / מאמר

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

מחלקה ציבורית ArticleController מרחיבה את AppController {// ... אינדקס חלל ציבורי () {render ("מאמרים"); } // ...}

לשיטות או פעולות אחרות, הוסף את שם השיטה לכתובת האתר:

מחלקה ציבורית ArticleController מרחיבה את AppController {// ... חיפוש בטל ציבורי () {render ("search"); }}

כתובת האתר:

// מארח: יציאה / contextroot / מאמר / חיפוש

אנו יכולים אפילו לבצע פעולות בקר המבוססות על שיטות HTTP. פשוט הוסף הערה לשיטה עם אחת מהן @ POST, @ PUT, @ DELETE, @ GET, @ HEAD. אם איננו מציינים פעולה, היא נחשבת כברירת מחדל ל- GET.

5.2. רזולוציה של כתובת URL של בקר

המסגרת משתמשת בשם הבקר ובשם חבילת המשנה כדי ליצור את כתובת ה- URL של הבקר. לדוגמה app.controllers.ArticleController.java כתובת האתר:

// מארח: יציאה / contextroot / מאמר

אם הבקר נמצא בתוך חבילת משנה, כתובת האתר פשוט הופכת להיות:

// מארח: פורט / contextroot / baeldung / מאמר

לשם בקר בעל יותר ממילה אחת (לדוגמא app.controllers.PublishedArticleController.java), כתובת האתר תופרד באמצעות קו תחתון:

// host: port / contextroot / published_article

5.3. אחזור פרמטרים של בקשה

בתוך בקר אנו מקבלים גישה לפרמטרי הבקשה באמצעות ה- param () אוֹ פאראמים () שיטות מה- מחלקת AppController. השיטה הראשונה לוקחת ארגומנט מחרוזת - שם הפרמטר לאחזור:

חיפוש חלל ציבורי () {String keyword = param ("מפתח"); תצוגה ("חיפוש", articleService.search (מילת מפתח)); }

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

חיפוש בטל ציבורי () {קריטריון מפה = פאראמס (); // ...}

6. צפיות

במינוח ActiveWeb, תצוגות מכונות לעיתים קרובות תבניות; זה בעיקר בגלל שהוא משתמש במנוע תבניות FreeMarker של Apache במקום ב- JSP. תוכלו לקרוא עוד על FreeMarker במדריך שלנו, כאן.

מקם את התבניות WEB-INF / תצוגות מַדרִיך. לכל בקר צריך להיות ספריה משנה בשם המכילה את כל התבניות הנדרשות על ידו.

6.1. מיפוי תצוגת בקר

כאשר בקר נפגע, פעולת ברירת המחדל אינדקס() מבוצע והמסגרת תבחר ב WEB-INF / צפיות / מאמר /index.ftl תבנית את ספריית ה- from views עבור אותו בקר. באופן דומה, עבור כל פעולה אחרת, התצוגה תבחר על פי שם הפעולה.

זה לא תמיד מה שהיינו רוצים. לפעמים אולי נרצה להחזיר כמה צפיות על סמך הגיון עסקי פנימי. בתרחיש הזה, אנחנו יכולים לשלוט בתהליך עם לְדַקלֵם() שיטה מההורה org.javalite.activeweb.AppController מעמד:

אינדקס חלל ציבורי () {render ("מאמרים"); }

שים לב שמיקום התצוגות המותאמות אישית צריך להיות גם באותה ספריית תצוגה עבור אותו בקר. אם זה לא המקרה, קידם את שם התבנית עם שם הספריה שבו התבנית שוכנת והעבירו אותה אל לְדַקלֵם() שיטה:

render ("/ common / error");

6.3. צפיות עם נתונים

כדי לשלוח נתונים לתצוגות, org.javalite.activeweb.AppController מספק את נוף() שיטה:

תצוגה ("מאמרים", articleService.getArticles ());

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

אנחנו יכולים גם להשתמש לְהַקְצוֹת() שיטה להעברת נתונים לתצוגות. אין שום הבדל בין השקפה () לבין לְהַקְצוֹת() שיטות - אנו יכולים לבחור בכל אחת מהן:

להקצות ("מאמר", articleService.search (מילת מפתח));

בואו למפות את הנתונים בתבנית:

מאמרים ... $ {article.title}$ {article.author}$ {article.words}$ {article.date}

7. ניהול תלות

על מנת לנהל אובייקטים ומופעים, ActiveWeb משתמש ב- Google Guice כמסגרת לניהול תלות.

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

בואו ניצור תחילה ממשק שירות:

ממשק ציבורי ArticleService {רשימה getArticles (); חיפוש מאמרים (מילת מפתח מחרוזת); }

והיישום:

מחלקה ציבורית ArticleServiceImpl מיישמת את ArticleService {רשימה ציבורית getArticles () {return fetchArticles (); } חיפוש מאמרים ציבורי (מילת מפתח מחרוזת) {Article ar = Article new (); ar.set ("כותרת", "מאמר עם" + מילת מפתח); ar.set ("מחבר", "באלדונג"); ar.set ("מילים", "1250"); ar.setDate ("תאריך", Instant.now ()); להחזיר ar; }}

עכשיו, בואו נקשר את השירות הזה כמודול Guice:

מחלקה ציבורית ArticleServiceModule מרחיבה את AbstractModule {@Override מוגן void configure () {bind (ArticleService.class) .to (ArticleServiceImpl.class) .asEagerSingleton (); }}

לבסוף, רשום זאת בהקשר היישום והזרק אותו לבקר, כנדרש:

מחלקה ציבורית AppBootstrap מרחיבה את Bootstrap {init void public (הקשר AppContext) {} getinjector public Injector () {return Guice.createInjector (ArticleServiceModule חדש ()); }}

שים לב כי שם מחלקת תצורה זו חייב להיות AppBootstrap וזה צריך להיות ממוקם ב app.config חֲבִילָה.

לבסוף, כך אנו מזריקים אותו לבקר:

@ הזריק ArticleService מאמר שירות;

8. בדיקות

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

נשתמש ב- org.javalite.activeweb.ControllerSpec בכיתה מ- JSpec לבדיקת הבקר שלנו, ושמנו את שיעורי הבדיקה בעקבות מוסכמה דומה:

class class ArticleControllerSpec מרחיב את ControllerSpec {// ...}

שימו לב, שהשם דומה לבקר שהוא בודק עם "מפרט" בסוף.

הנה מקרה הבדיקה:

@ מבחן פומבי בטל כאשר ReturretedArticlesThenCorrect () {בקשה (). Get ("אינדקס"); a (responseContent ()) .shouldContain ("מבוא לפרד"); }

שימו לב שה- בַּקָשָׁה() השיטה מדמה את השיחה לבקר ואת שיטת ה- HTTP המתאימה לקבל(), לוקח את שם הפעולה כטיעון.

אנו יכולים גם להעביר פרמטרים לבקר באמצעות ה- פאראמים () שיטה:

@Test ציבורי בטל givenKeywordWhenFoundArticleThenCorrect () {בקשה (). Param ("מפתח", "Java"). Get ("חיפוש"); a (responseContent ()) .shouldContain ("מאמר עם Java"); }

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

9. פריסת היישום

אפשר לפרוס את היישום בכל מיכל סרוולט כמו Tomcat, WildFly או Jetty. כמובן, הדרך הפשוטה ביותר לפרוס ולבדוק היא באמצעות תוסף Maven Jetty:

... org.eclipse.jetty jetty-maven-plugin 9.4.8.v20171121 ידני 10000 ...

הגרסה האחרונה של התוסף נמצאת כאן.

עכשיו, סוף סוף - אנחנו יכולים לפטר את זה:

מזח mvn: לרוץ

10. מסקנה

במאמר זה למדנו על מושגי היסוד והמוסכמות של מסגרת ActiveWeb. בנוסף לאלה, למסגרת יש יותר תכונות ויכולות ממה שדנו כאן.

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

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

תחתית Java

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

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