מבוא לשפם

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

במאמר זה נתמקד בתבניות שפם ונשתמש באחד מממשקי ה- API של Java להפקת תוכן HTML דינמי.

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

2. מבוא

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

תבניות השפם מורכבות משמות תגים המוקפים { { } } (הדומים לשפם - ומכאן השם) ומגובים באובייקט מודל המכיל את הנתונים עבור התבנית.

3. תלות של Maven

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

כדי להיות מסוגל לעבד את התבניות מג'אווה אנו משתמשים בספריית ג'אווה שלה שניתן להוסיף כתלות של Maven.

Java 8+:

 com.github.spullara.mustache.java מהדר 0.9.4 

Java 6/7:

 com.github.spullara.mustache.java מהדר 0.8.18 

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

4. שימוש

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

  1. כתוב תבנית פשוטה
  2. הידר את התבנית באמצעות Java API
  3. בצע אותו על ידי מסירת הנתונים הדרושים

4.1. תבנית שפם פשוטה

אנו ניצור תבנית פשוטה להצגת פרטי משימת מטלה:

{{כותרת}}

נוצר בתאריך {{createdOn}}

{{טֶקסט}}

בתבנית שלמעלה השדות בתוך הפלטה המתולתלת ({{}}) יכולים להיות:

  • שיטות ומאפיינים של מחלקת Java
  • מקשי א מַפָּה לְהִתְנַגֵד

4.2. קומפילציה של תבנית השפם

אנו יכולים לאסוף את התבנית כמוצג להלן:

MustacheFactory mf = חדש DefaultMustacheFactory (); שפם m = mf.compile ("todo.mustache"); 

שפם מפעל מחפש את התבנית הנתונה בכיתה. בדוגמה שלנו, אנו מציבים todo.mustache תַחַת src / main / resources.

4.3. ביצוע תבנית השפם

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

כיתה ציבורית Todo {כותרת מחרוזת פרטית; טקסט מחרוזת פרטי; פרטי בוליאני נעשה; תאריך פרטי createdOn; תאריך סיום פרטי On; // בונים, גטרים וקובעים}

ניתן לבצע את התבנית המהודרת כדי לקבל HTML כמוצג להלן:

טודו טודו = טודו חדש ("טודו 1", "תיאור"); סופר StringWriter = חדש StringWriter (); m.execute (כותב, todo) .flush (); מחרוזת html = writer.toString ();

5. מדורי שפם ואיטרציות

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

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

זה נראה בערך כמו:

{{#todo}} {{/ todo}}

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

להלן התרחישים שיכולים להתרחש בהתאם לערך המפתח:

5.1. קטע עם רשימה לא ריקה או ערך לא נכון

בואו ניצור תבנית סעיף טודו. שפם המשתמש בסעיף:

{{#לעשות}} 

{{כותרת}}

נוצר בתאריך {{createdOn}}

{{טֶקסט}}

{{/לעשות}}

בואו נסתכל על תבנית זו בפעולה:

@Test ציבורי בטל givenTodoObject_whenGetHtml_thenSuccess () זורק IOException {Todo todo = new Todo ("Todo 1", "תיאור Todo"); שפם m = MustacheUtil.getMustacheFactory () .compile ("todo.mustache"); הקשר מפה = HashMap חדש (); context.put ("todo", todo); מחרוזת צפויה = "

טודו 1

"; assertThat (executeTemplate (m, todo)). מכיל (צפוי);}

בואו ניצור תבנית נוספת todos.mustache לרישום התוספות:

{{#לעשות}} 

{{כותרת}}

{{/לעשות}}

וצור רישום של טודוס באמצעותו:

@Test הציבור בטל givenTodoList_whenGetHtml_thenSuccess () זורק IOException {שפם m = MustacheUtil.getMustacheFactory () .compile ("todos.mustache"); רשימה todos = Arrays.asList (Todo חדש ("Todo 1", "Todo תיאור"), Todo חדש ("Todo 2", "Todo תיאור אחר"), חדש Todo ("Todo 3", "Todo תיאור אחר") ); הקשר מפה = HashMap חדש (); context.put ("todos", todos); assertThat (executeTemplate (m, הקשר)) .contains ("

טודו 1

"). מכיל ("

טודו 2

"). מכיל ("

טודו 3

"); }

5.2. קטע עם ריק רשימה אוֹ שֶׁקֶר אוֹ ריק ערך

בואו נבדוק את סעיף טודו. שפם עם ריק ערך:

@ מבט חלל ציבורי שניתן NullTodoObject_whenGetHtml_thenEmptyHtml () זורק IOException {שפם m = שפם Util.getMustacheFactory () .compile ("todo-section.mustache"); הקשר מפה = HashMap חדש (); assertThat (executeTemplate (m, הקשר)). הוא ריק (); }

וכמו כן, לבדוק todos.mustache עם רשימה ריקה:

@ מבטל חלל ציבורי givenEmptyList_whenGetHtml_thenEmptyHtml () זורק IOException {שפם m = שפם Util.getMustacheFactory () .compile ("todos.mustache"); הקשר מפה = HashMap חדש (); assertThat (executeTemplate (m, הקשר)). הוא ריק () ;; }

6. סעיפים הפוכים

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

אלה מתחילים בקלף (^) ומסתיימים בקו נטייה (/) כמוצג להלן:

{{#לעשות}} 

{{כותרת}}

{{/ todos}} {{^ todos}}

אין טודוס!

{{/לעשות}}

התבנית שלעיל כאשר היא מסופקת עם רשימה ריקה:

@Test הציבור בטל givenEmptyList_whenGetHtmlUsingInvertedSection_thenHtml () זורק IOException {שפם m = MustacheUtil.getMustacheFactory () .compile ("todos-inverted-section.mustache"); הקשר מפה = HashMap חדש (); assertThat (executeTemplate (m, context) .trim ()) .isEqualTo ("

אין טודוס!

"); }

7. למבדות

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

בואו נסתכל על תבנית todos-lambda.mustache:

{{#לעשות}} 

{{title}} {{# handleDone}} {{doneSince}} {{/ handleDone}}

{{/לעשות}}

ה handleDone מפתח נפתר לביטוי Java 8 lambda כמוצג להלן:

function Function handDone () {return (obj) -> נעשה? String.format ("בוצע לפני% s דקות", obj): ""; }

ה- HTML שנוצר על ידי ביצוע התבנית לעיל הוא:

טודו 1

טודו 2

Todo 3Done לפני 5 דקות

8. מסקנה

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

יש כמה תכונות מתקדמות יותר של שפם שכדאי לחקור - כגון:

  • מתן קריאה כערך המביא להערכה במקביל
  • באמצעות DecoratedCollection כדי לקבל אלמנטים ראשונים, אחרונים ואינדקסים
  • לַהֲפוֹך API אשר נותן את הנתונים שקיבלו את הטקסט ואת התבנית

וכמו תמיד, קוד המקור השלם לכך זמין ב- Github.


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