1. Übersicht
Freemarker ist eine Template -Engine, ein allgemeines Werkzeug zum Erstellen von Textausgaben basierend auf Vorlagen. Es ist in reinem Java geschrieben. Freemarker wurde entwickelt, um HTML -Webseiten zu generieren, insbesondere Anwendungen, die auf dem MVC -Muster basieren. Obwohl Freemarker über einige Programmierfunktionen verfügt, erstellt er normalerweise die Daten, die von Java -Programmen angezeigt werden sollen, und generiert die Seiten nach Freemarker und zeigt die vorbereiteten Daten über die Vorlage an (wie unten gezeigt).
Freemarker ist kein Webanwendungs -Framework, sondern als Bestandteil des Webanwendungs -Frameworks geeignet. Freemarker ist nicht mit Behältern verbunden, da er nichts über HTTP oder Servlets weiß. Freemarker kann auch auf Nicht-Web-Anwendungsumgebungen angewendet werden, Freemarker ist besser als Ansichtskomponente von Model2-Frameworks (z. B. Streben) geeignet und Sie können auch die JSP-Tag-Bibliothek in Vorlagen verwenden. Auch Freemarker ist kostenlos.
2. Bedingungen für Freimaurer -Vorbereitung
Freemarker.2.3.16.jar, die Download -Adresse wird hier nicht veröffentlicht ... (Dieses JAR -Paket befindet sich tatsächlich in Struts2)
3. Das Prinzip des Freimaurers erzeugt statische Seiten
Freemarker generiert eine statische Seite. Zunächst müssen Sie die Vorlagenseite verwenden, die Sie selbst definieren. Diese Vorlagenseite kann die gewöhnlichste HTML sein oder ein verschachtelter Wertausdruck, ein Kennzeichnung oder ein benutzerdefiniertes Tag usw. im Freimaurer sein. Anschließend wird die Vorlagenseite im Hintergrund gelesen, die Tags darin analysiert, um die entsprechende Operation abzuschließen, und dann die Parameter im Schlüsselwertpaar übergeben, um den Wertausdruck in der Vorlage zu ersetzen. Danach kann eine neue HTML -Seite entsprechend dem konfigurierten Pfad generiert werden, um den Zweck des statischen Zugriffs zu erreichen.
4. Etiketten von Freemarker zur Verfügung gestellt
Freemarker bietet viele nützliche und häufig verwendete Tags. Freemarker -Tags werden als <# Tag -Name> so bezeichnet. $ {value} repräsentiert den Inhalt des Namens der Ausgabevariablen wie folgt:
1. Liste: Dieses Tag ist hauptsächlich eine Listensammlung, die durch iterativ von der Serverseite übergeben wurde, wie z. B.:
<#List Namelist als Namen> $ {Namen} </#List>Name ist eine Schleifenvariable, die bei der Listenschleife aufgenommen wurde. Wenn Freemarker das Listen -Tag analysiert, entspricht es:
für (Zeichenfolge Namen: Namelist) {System.out.println (Namen); }2. Wenn: Dieses Tag wird hauptsächlich für das Urteil verwendet, wie z. B.:
<#if (names == "Chen Jingchou")> Seine Waffen sind: fünfzehn ~~ </#if>
Dies ist ein bedingtes Beurteilungsetikett. Es ist zu beachten, dass die bedingte Gleichung in Klammern eingeschlossen sein muss, was entspricht:
if (names.equals ("chen jingchou") {System.out.println ("Seine Waffen sind: fünfzehn ~~"); }
3. Hören Sie: Dieses Tag wird zum Importieren von Dateien verwendet.
<#include "include.html"/>
Dieses Import -Tag ist sehr nützlich, insbesondere für die Wiederverwendung von Seiten.
Zusätzlich können Sie $ {} verwenden, um den Wert in einer statischen Datei zu erhalten. Die Wertmethode entspricht dem EL -Ausdruck, der sehr bequem ist.
Hier ist ein Beispiel (static.html):
<! DocType html public "-// w3c // dtd html 4.01 transitional // en <title>Insert title here</title> </head> <body> Description: ${description} <br/> Collection size: ${nameList?size} <br/> Iterative list collection: <br/> <#list nameList as names> This is the ${names_index+1} person, called: <label style="color:red">${names}</label> if judgment: <br/> <#if . WeaponMap? Schlüssel als Schlüssel> Schlüssel ---> $ {KEY} <br/> Wert ------> $ {WeaponMap [Key]! ("null")} <#-Fremarker unterstützt NULL nicht, kann verwendet werden! statt leerer Wert. Tatsächlich können Sie auch einen Standardwert angeben ----- $ {WeaponMap [Key]? Standard ("null")} Sie können auch feststellen, ob es sich vor der Ausgabe befindet <#IF WeaponMap [Schlüssel]?Tatsächlicher Code:
Paket com.chenghui.test; Import Java.io.file; importieren java.io.fileoutputStream; importieren java.io.ioException; importieren java.io.outputStreamwriter; Import Java.io.Writer; Import Java.util.ArrayList; import Java.util.hashMap; importieren java.util.list; import Java.util.map; Freemarker.template.Configuration importieren; Freemarker.Template.DefaultObjectWrapper importieren; freeMarker.template.template importieren; freemarker.template.templateException importieren; öffentliche Klasse createHtml {public static void main (String [] args) {try {// Erstellen Sie eine geeignete Konfiguration Objektkonfiguration configuration = new configuration (); configuration.setDirectoryFortemPlatEloading (neue Datei ("d: // project // webproject // webcontent // web-inf // template")); configuration.setObjectWrapper (new DefaultObjectWrapper ()); configuration.setDefaultCoding ("utf-8"); // Dies muss festgelegt werden, sonst wird es auf der generierten Seite verstümmelt // eine Vorlage abrufen oder erstellen. Template template = configuration.getTemplate ("static.html"); Karte <String, Objekt> parammap = new HashMap <String, Object> (); Parammap.put ("Beschreibung", "Ich lerne, Freemarker zu verwenden, um statische Dateien zu generieren!"); Liste <String> namelist = new ArrayList <string> (); Namelist.Add ("Chen Jingchou"); namelist.add ("yuer"); namelist.add ("yuwentuo"); Parammap.put ("Namelist", Namelist); Karte <string, Objekt> WeaponMap = new HashMap <String, Object> (); WeaponMap.put ("First", "Xuanyuan Sword"); WeaponMap.put ("Second", "Kongertong Seal"); WeaponMap.put ("dritter", "Nuwa Stone"); WeaponMap.put ("Vierter", "Shennong Ding"); WeaponMap.put ("Fifth", "Fuxi Qin"); WeaponMap.put ("Sechster", "Kunlun Mirror"); WeaponMap.put ("siebte", null); Parammap.put ("WeaponMap", WeaponMap); Writer writer = new outputStreamwriter (neuer FileOutputStream ("success.html"), "utf-8"); template.Process (Parammap, Schriftsteller); System.out.println ("Herzlichen Glückwunsch, die Generation war erfolgreich ~~"); } catch (ioException e) {e.printstacktrace (); } catch (templateException e) {e.printstacktrace (); }}}
Dies kann im Grunde genommen als einfache und einfache Generation angesehen werden, aber es ist noch weit davon entfernt, in der Praxis zu verwenden, da die von Freemarker angegebenen Tags unsere Bedürfnisse überhaupt nicht erfüllen können. Zu diesem Zeitpunkt werden benutzerdefinierte Tags benötigt, um unsere Anforderungen zu erfüllen. .
5. Freemarker benutzerdefinierte Tags
Freemarker Custom -Tags sollen die Tags selbst schreiben und sie dann selbst analysieren. Sie steuern den Eingang und die Ausgabe der Tags selbst vollständig, die den Programmierern viel Raum zum Spielen bieten.
Basierend auf Schritten:
In der Vergangenheit müssen Sie beim Schreiben von Tags # nach <nach <hinzufügen, um benutzerdefinierte Tags zu erkennen, müssen Sie später @ hinzufügen, und dann können Sie später einige Parameter definieren. Wenn das Programm Template.Process (Parammap, out) ausführt;, wird es alle Freemarker -Tags auf der gesamten Seite analysieren.
Das Anpassen des Tags erfordert das Anpassen einer Klasse, das Implementieren des Vorplattentreibermodells, das Umschreiben der Ausführungsmethode, das Abschluss des Erwerbs von Parametern, tun Sie etwas gemäß den Parametern usw.
Um benutzerdefinierte Tags an Parse -Klassen zu binden, müssen Sie eine Instanz der Parse -Klasse in Parammap einfügen, und der gespeicherte Schlüssel entspricht dem benutzerdefinierten Tag. .
HINWEIS: Im benutzerdefinierten Tag muss das Start -Tag und das End -Tag nicht die gleiche Zeile sein, andernfalls wird ein Fehler gemeldet.
freemarker.log.jdk14Loggerfactory $ JDK14Logger -Fehler
Ich wurde täuscht und das ist ein Fehler im Freimaurer.
Hier ist ein Beispiel für static.html:
<! DocType html public "-// w3c // dtd html 4.01 transitional // en <title> Title hier einfügen </title> </head> <body> <#-benutzerdefinierte Variablen-> <#Assign num = 'hehe' // $ {num} <br/> benutzerdefinierte Tags <@Content name = "chenghui" ay "120"> $ {output} {Append} </@content> </body> </body> </body> </body> </body> </body> </body> </body>
Hier ist die Parsing -Klasse der oben statischen.html -Vorlage:
Paket com.chenghui.test; static Freemarker importieren.objectwrapper.default_wrapper; importieren java.io.ioException; Import Java.io.Writer; import Java.util.map; import Freemarker.core.Environment; Freemarker.Template importieren. freemarker.template.templatedirectivemodel importieren; freemarker.template.templateException importieren; freeMarker.template.templatemodel importieren; freeMarker.template.templatemodElexception importieren; freeMarker.template.templatenumbermodel importieren; freeMarker.template.templatesCalarmodell importieren; / ** * Custom Tag -Auflösungsklasse * @Author Administrator * */ öffentliche Klasse ContentDirective Implements templatedirectivemodel {private statische endgültige Zeichenfolge param_name = "name"; private statische endgültige Zeichenfolge param_age = "älter"; @Override public void execute (Umwelt env, MAP -Params, templatemodel [] Loopvars, TemplatedirectiveBody Body) löst TemplateException aus, ioException {if (body == null) {neue templatemodelexception ("null body"); } else {String name = getString (param_name, params); INTEGER ALTER = GetInt (param_age, params); // Nach Empfang der Parameter können Sie bestimmte Vorgänge gemäß dem spezifischen Vorgang ausführen und dann die Daten auf der Seite anzeigen. if (name! } if (ay! } Writer out = env.getOut (); out.write ("Von hier aus können Sie den spezifischen Inhalt auf der Seite sehen, genau wie im Dokument.Writer Schreibvorgang. <br/>"); Body.Render (out); /* Wenn Sie vorsichtig sind, werden Sie feststellen, dass die Seite die Ausgabe von Out.Write () und dann den Ausgangsinhalt ausgeben. Es ist ersichtlich, dass der Körper, wenn er analysiert, zuerst die Parameter in die ENV einsetzt und die Seite nur dann den Wert erhält, wenn die Seite auf die entsprechende Form trifft. Wenn das Formular jedoch nicht vorhanden ist, wird ein Fehler gemeldet. Ich denke, der Freimaurer ist hier nicht gut gemacht, und der Fehler wird der Seite bei der Parsen ausgesetzt. Sie können $ {output! "Null"} auf diese Weise wieder gut machen, und Sie haben immer das Gefühl, dass es nicht so gut ist wie der EL -Ausdruck. */}}/ ** * den Wert des Parameters des Typs String abrufen if (model == null) {return null; } if (ModellinstanceOF templatesCalarmodel) {return ((templatesCalarmodel) modell) .getAssstring (); } else if (Modellinstanz von templatenumbermodel) {return ((templateNumbermodel) modell) .getaSnumber (). toString (); } else {werfen Sie eine neue templatemodElexception (ParamName); }} / ** * * Parameter des Typs int * @param paramname * @param parammap * @return * @throws templatemodElexception * / public static Integer getint (String -Paramname, map <String, Templatemodel> Parammap) TemplatemodelException {Templatemodel = paramp.GeNAnname); if (model == null) {return null; } if (ModellinstanceOF templatesCalarmodel) {String str = ((templateScalarmodel)) .GetAssstring (); try {return Integer.Valueof (str); } catch (numberFormatexception e) {werfen Sie eine neue templatemodelexception (ParamName); }} else if (Modellinstanz von templatenumbermodel) {return ((templatenumbermodel)) .getAsNumber (). intValue (); } else {werfen Sie eine neue templatemodElexception (ParamName); }}}Dann fügen Sie hinzu:
// benutzerdefinierte Tag Parsing Parammap.put ("Inhalt", neuer contentDirective ());Auf diese Weise kann es im Grunde genommen verwendet werden. Freemarker vervollständigt benutzerdefinierte Tags, um das Problem des Schreibens einfacher Geschäftslogik zu lösen. Es ist jedoch unmöglich, dies in tatsächlichen Projekten zu tun, da es noch nicht in den Frühling integriert wurde und Sie die Parsing -Instanz der Parsing -Klasse in die Parsingzeit einsetzen müssen. .