Inleiding tot snor

1. Overzicht

In dit artikel zullen we ons concentreren op Moustache-sjablonen en een van de Java-API's gebruiken voor het produceren van dynamische HTML-inhoud.

Snor is een logische sjabloon-engine voor het creëren van dynamische inhoud zoals HTML, configuratiebestanden onder andere.

2. Inleiding

Simpel gezegd, de motor is geclassificeerd als logisch omdat het geen constructies heeft die if-else-instructies en for-loops ondersteunen.

De Moustache-sjablonen bestaan ​​uit tagnamen omgeven door { { } } (die op snorren lijken - vandaar de naam) en worden ondersteund door een modelobject dat de gegevens voor de sjabloon bevat.

3. Maven Afhankelijkheid

Het compileren en uitvoeren van de sjablonen wordt ondersteund door meerdere talen - zowel aan de clientzijde als aan de serverzijde.

Om de sjablonen uit Java te kunnen verwerken, maken we gebruik van de Java-bibliotheek die als Maven-afhankelijkheid kan worden toegevoegd.

Java 8+:

 com.github.spullara.mustache.java-compiler 0.9.4 

Java 6/7:

 com.github.spullara.mustache.java compiler 0.8.18 

We kunnen de laatste versies van de bibliotheek bekijken in de Central Maven Repository.

4. Gebruik

Laten we eens kijken naar een eenvoudig scenario dat laat zien hoe:

  1. Schrijf een eenvoudig sjabloon
  2. Compileer de sjabloon met behulp van Java API
  3. Voer het uit door de nodige gegevens te verstrekken

4.1. Een eenvoudige snor-sjabloon

We gaan een eenvoudig sjabloon maken om de details van een taak weer te geven:

{{titel}}

Gemaakt op {{createdOn}}

{{tekst}}

In het bovenstaande sjabloon kunnen de velden tussen de accolades ({{}}) zijn:

  • methoden en eigenschappen van een Java-klasse
  • sleutels van een Kaart voorwerp

4.2. Het snor-sjabloon samenstellen

We kunnen het sjabloon samenstellen zoals hieronder weergegeven:

MoustacheFactory mf = nieuwe DefaultMustacheFactory (); Moustache m = mf.compile ("todo.mustache"); 

MoustacheFactory zoekt naar de opgegeven sjabloon in het klassenpad. In ons voorbeeld plaatsen we snor onder src / main / resources.

4.3. De snor-sjabloon uitvoeren

De gegevens die aan de sjabloon worden verstrekt, zijn een exemplaar van de Te doen klasse welke definitie is:

openbare klasse Todo {private String-titel; private String-tekst; private boolean gedaan; privé Datum gemaakt op; privé Datum voltooidOn; // constructeurs, getters en setters}

De gecompileerde sjabloon kan worden uitgevoerd om HTML te krijgen, zoals hieronder wordt weergegeven:

Todo todo = new Todo ("Todo 1", "Beschrijving"); StringWriter-schrijver = nieuwe StringWriter (); m.execute (schrijver, todo) .flush (); String html = writer.toString ();

5. Snor secties en iteraties

Laten we nu eens kijken hoe we de taken kunnen opsommen. Voor het herhalen van een lijstgegevens maken we gebruik van Moustache-secties.

Een sectie is een codeblok dat een of meerdere keren wordt herhaald, afhankelijk van de waarde van de sleutel in de huidige context.

Het ziet er ongeveer zo uit:

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

Een sectie begint met een pond (#) en eindigt met een schuine streep (/), waarbij elk teken wordt gevolgd door de sleutel waarvan de waarde wordt gebruikt als basis voor het weergeven van de sectie.

Hieronder volgen de scenario's die kunnen optreden, afhankelijk van de waarde van de sleutel:

5.1. Sectie met niet-lege lijst of niet-valse waarde

Laten we een sjabloon maken todo-sectie. snor die een sectie gebruikt:

{{#Te doen}} 

{{titel}}

Gemaakt op {{createdOn}}

{{tekst}}

{{/Te doen}}

Laten we deze sjabloon in actie bekijken:

@Test openbare leegte gegevenTodoObject_whenGetHtml_thenSuccess () gooit IOException {Todo todo = new Todo ("Todo 1", "Todo description"); Moustache m = MoustacheUtil.getMustacheFactory () .compile ("todo.mustache"); Kaartcontext = nieuwe HashMap (); context.put ("todo", todo); String verwacht = "

Todo 1

"; assertThat (executeTemplate (m, todo)). bevat (verwacht);}

Laten we nog een sjabloon maken todos. snor voor het opsommen van de taken:

{{#todos}} 

{{titel}}

{{/ todos}}

En maak een lijst met todo's die het gebruiken:

@Test openbare leegte gegevenTodoList_whenGetHtml_thenSuccess () gooit IOException {Moustache m = MoustacheUtil.getMustacheFactory () .compile ("todos.mustache"); List todos = Arrays.asList (nieuwe Todo ("Todo 1", "Todo description"), nieuwe Todo ("Todo 2", "Todo description another"), nieuwe Todo ("Todo 3", "Todo description another") ); Kaartcontext = nieuwe HashMap (); context.put ("todos", todos); assertThat (executeTemplate (m, context)) .contains ("

Todo 1

"). bevat ("

Todo 2

"). bevat ("

Todo 3

"); }

5.2. Sectie Met Leeg Lijst of Vals of Nul Waarde

Laten we de todo-sectie. snor met een nul waarde:

@Test openbare leegte gegevenNullTodoObject_whenGetHtml_thenEmptyHtml () gooit IOException {Moustache m = MoustacheUtil.getMustacheFactory () .compile ("todo-section.mustache"); Kaartcontext = nieuwe HashMap (); assertThat (executeTemplate (m, context)). isEmpty (); }

En evenzo, test todos. snor met een lege lijst:

@Test openbare leegte gegevenEmptyList_whenGetHtml_thenEmptyHtml () gooit IOException {Moustache m = MoustacheUtil.getMustacheFactory () .compile ("todos.mustache"); Kaartcontext = nieuwe HashMap (); assertThat (executeTemplate (m, context)). isEmpty () ;; }

6. Omgekeerde secties

Omgekeerde secties zijn secties die slechts één keer worden weergegeven op basis van het niet-bestaan van de sleutel of false of nul waarde of een lege lijst. Met andere woorden, deze worden weergegeven als een sectie niet wordt weergegeven.

Deze beginnen met een caret (^) en eindigen met een schuine streep (/), zoals hieronder weergegeven:

{{#todos}} 

{{titel}}

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

Geen taken!

{{/ todos}}

Het bovenstaande sjabloon indien voorzien van een lege lijst:

@Test openbare leegte gegevenEmptyList_whenGetHtmlUsingInvertedSection_thenHtml () gooit IOException {Moustache m = MoustacheUtil.getMustacheFactory () .compile ("todos-inverted-section.mustache"); Kaartcontext = nieuwe HashMap (); assertThat (executeTemplate (m, context) .trim ()) .isEqualTo ("

Geen taken!

"); }

7. Lambda's

De waarden voor sleutels van een snor-sectie kunnen een functie of een lambda-uitdrukking zijn. In dat geval wordt de volledige lambda-expressie aangeroepen door de tekst binnen de sectie als parameter door te geven aan de lambda-expressie.

Laten we naar een sjabloon kijken todos-lambda. snor:

{{#todos}} 

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

{{/ todos}}

De handleDone sleutel wordt omgezet in een Java 8 lambda-expressie zoals hieronder weergegeven:

openbare functie handleDone () {return (obj) -> klaar? String.format ("% s minuten geleden gedaan", obj): ""; }

De HTML die wordt gegenereerd door het uitvoeren van de bovenstaande sjabloon is:

Todo 1

Todo 2

Todo 3D één 5 minuten geleden

8. Conclusie

In dit inleidende artikel hebben we gekeken naar het maken van snorsjablonen met secties, omgekeerde secties en lambda's. En we gebruikten de Java API om de sjablonen te compileren en uit te voeren door relevante gegevens te verstrekken.

Er zijn enkele meer geavanceerde functies van Moustache die het ontdekken waard zijn, zoals:

  • het verstrekken van een opvraagbare waarde als een waarde die resulteert in een gelijktijdige evaluatie
  • gebruik makend van IngerichtCollection om eerste, laatste en index van collectie-elementen te krijgen
  • omkeren API die de gegevens geeft op basis van de tekst en de sjabloon

En, zoals altijd, is de volledige broncode hiervoor beschikbaar op Github.