p> Grundlagen
Konfiguration ist ein Objekt, das öffentliche Konfigurationsinformationen auf Anwendungsebene und globale gemeinsam genutzte Variablen speichert, die von Vorlagen verwendet werden können. Gleichzeitig ist es auch für die Erstellung und Zwischenspeicherung von Vorlageninstanzen verantwortlich. Eine Konfiguration ist eigentlich eine Instanz des freemarker.template.Configuration-Objekts, die mit seinem Konstruktor erstellt wurde. Typischerweise verwenden Anwendungen ein gemeinsam genutztes Einzelinstanz-Konfigurationsobjekt.
Konfigurationsobjekte können von Methoden des Template-Objekts verwendet werden. Jede Template-Instanz ist einer Configuration-Instanz zugeordnet, die über den Template-Konstruktor verknüpft ist. Normalerweise verwenden Sie diese Methode, um das Configuration.getTemplate-Template-Objekt abzurufen.
Gemeinsam genutzte Variablen
Gemeinsam genutzte Variablen sind die Variablen, die für die Verwendung durch alle Vorlagen definiert sind. Sie können gemeinsam genutzte Variablen über die setSharedVariable-Methode des Konfigurationsobjekts hinzufügen.
Configuration cfg = new Configuration(); ... cfg.setSharedVariable("wrap", new WrapDirective()); cfg.setSharedVariable("company", "Foo Inc."); .DEFAULT_WRAPPER
Alle mit dem Konfigurationsobjekt verknüpften Vorlageninstanzen können die Zeichenfolge durch Abrufen des to_upper-Konverters und der Firma abrufen, sodass Sie diese Variablen nicht immer wieder zum Stamm hinzufügen müssen. Wenn Sie dem Stammverzeichnis eine Variable mit demselben Namen hinzufügen, überschreibt Ihre neu hinzugefügte Variable die vorherige gemeinsam genutzte Variable.
Achtung!
Wenn das Konfigurationsobjekt von mehreren Threads aufgerufen wird, verwenden Sie keine TemplateModel-Implementierungsklassen als gemeinsam genutzte Variablen, da diese nicht threadsicher sind, wie z. B. Servlet-basierte Websites.
Konfigurationsobjekt enthält bei der Initialisierung bereits einige gemeinsam genutzte Konvertervariablen:
Name Klasse
Name Klasse Capture_Output Freemarker.template.utility.CaptureOutput Compress Freemarker.template.utility.StandardCompress html_escape freemarker.template.utility.HtmlEscape normalize_newlines freemarker.template.utility.NormalizeNewlines xml_escape freemarker.template.utility.XmlEscape
Konfigurationsparameter
Konfigurationsparameter sind solche, die das Laufverhalten von FreeMarker beeinflussen können Parameter. Zum Beispiel Gebietsschema,Zahlenformat.
Konfigurationsparameter werden in der Konfigurationsinstanz gespeichert, die von der Vorlageninstanz (Template) geändert werden kann. Wenn Sie beispielsweise in der Konfiguration das Gebietsschema auf „en_US“ festlegen, verwenden alle Vorlagenobjekte „en_US“, es sei denn, Sie ändern die Standardkonfiguration mithilfe der setLocale-Methode in einer einzelnen Vorlageninstanz. Daher können die durch die Konfiguration festgelegten Parameter als Standardparameter betrachtet werden, die durch die auf der Vorlagenebene festgelegten Parameter überschrieben werden können, und die von ihnen festgelegten Parameterinformationen können durch die in der Umgebung festgelegten Parameter überschrieben werden (d. h. wird durch die Anweisungen der Vorlagendatei festgelegt) Wie folgt:
${1.2}<#setting locale="en_US">${1.2}
Sie können sich diese Aufrufmethode als drei Ebenen vorstellen (Konfigurationsobjektebene, Vorlagenebene, laufende Umgebungsebene) Die folgende Tabelle zeigt die Parametereinstellungen für jede Ebene:
Einstellung A Einstellung B Einstellung C Einstellung D Einstellung E Einstellung F Schicht 3: Umgebung 1 - - 1 - - Schicht 2: Vorlage 2 2 - - 2 - Schicht 1:Konfiguration 3 3 3 3 - -
Dann sind die Endergebnisse der Konfigurationsparameter: A = 1, B = 2, C = 3, D = 1, E = 2. Der F-Parameter ist wahrscheinlich null.
Wenn Sie die Liste der einstellbaren Parameter abfragen möchten, können Sie die folgenden zwei Teile der FreeMarker-API-Dokumentation konsultieren:
Konfiguration aller Ebenen
freemarker.core.Configurable.setSetting (String, String)
Configuration-Layer-Konfiguration
freemarker.template.Configuration.setSetting(String,String)
Vorlage laden
Vorlagenlader
Der Vorlagenlader ist das Objekt, das die Originaldaten basierend auf dem abstrakten Pfad („index.ftl“ oder „products/catalog.ftl“) und der Art der geladenen Ressourcen lädt ( Dateidaten im Verzeichnis oder Daten in der Datenbank) hängt von der jeweiligen Loader-Implementierung ab. Wenn Sie cfg.getTemplate aufrufen, fragt FreeMarker Sie nach dem Vorlagenlader, den Sie zuvor für das Konfigurationsobjekt konfiguriert haben. Der Vorlagenlader ist für das Laden der Datei verantwortlich.
Integrierter Vorlagenlader
Sie können die folgenden drei Methoden verwenden, um die drei Methoden zum Laden von Vorlagen festzulegen
void setDirectoryForTemplateLoading(File dir);
oder
void setClassForTemplateLoading(Class cl, String prefix);
oder
void setServletContextForTemplateLoading(Object servletContext, String path);
Der erste Weg oben zeigt die Anzeige an Ein Verzeichnis im Dateisystem zeichnet die Vorlage in diesem Verzeichnis auf. Selbstverständlich muss dieses Verzeichnis vorhanden sein, andernfalls wird eine Ausnahme ausgelöst.
Die zweite Methode verwendet eine Klasse als Eingabeparameter. Wenn Sie ClassLoader zum Laden der Vorlage verwenden möchten, können Sie diese Methode gleichzeitig aufrufen. Diese Methode zum Laden von Vorlagen ist stabiler als die vorherige, insbesondere in Produktionssystemen. Sie können Ressourcendateien, Symbole usw. ganz einfach in .jar-Dateien packen.
Die dritte Methode verwendet den Kontext der Webanwendung und den Basispfad (relativ zum übergeordneten Pfad von WEN-INF) als Parameter. Diese Art von Vorlagenlader lädt Vorlagen aus dem Webanwendungskontext.
Vorlagen von mehreren Standorten laden
Wenn Sie Vorlagen von mehreren Standorten laden möchten, können Sie einen einzelnen Vorlagenlader entsprechend den verschiedenen Standorten erstellen und diese dann in einen Namen einschließen. Rufen Sie den MultiTemplateLoader auf Template Loader und legen Sie es schließlich über die Methode setTemplateLoader(TemplateLoader Loader) auf das Konfigurationsobjekt fest. Hier ist ein Beispiel für das Laden von Vorlagen aus zwei verschiedenen Speicherorten:
import freemarker.cache.*; in diesem Paket ... FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates")); FileTemplateLoader(new File("/usr/data/templates")); getClass(), ""); TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2, ctl }; MultiTemplateLoader(loaders);
FreeMarker wird zuerst Suchen Sie nach der Vorlagendatei im Pfad /tmp/templates. Wenn sie nicht gefunden wird, kehrt sie zur Suche zum Pfad /usr/data/templates zurück. Wenn sie nicht gefunden wird, wird versucht, sie mit dem Klassenlader zu laden .
Vorlagendateien von anderen Ressourcen abrufen
Wenn keiner dieser integrierten Vorlagenlader Ihren Anforderungen entspricht, können Sie einen Vorlagenlader selbst anpassen. Implementieren Sie einfach Freemarker. Verwenden Sie einfach den .cache. TemplateLoader-Schnittstelle und übergeben Sie sie dann über die Methode setTemplateLoader(TemplateLoader-Loader) an das Konfigurationsobjekt.
Caching-Vorlagen
FreeMarker-Caching-Vorlagen bedeuten, dass FreeMarker nicht nur ein Template-Objekt zurückgibt, wenn Sie eine Vorlage über die getTemplate-Methode erhalten, sondern das Objekt auch zwischenspeichert, wenn Sie das nächste Mal eine Vorlage verwenden Wird mit demselben Pfad angefordert, wird das Vorlagenobjekt im Cache zurückgegeben. Wenn Sie die Vorlagendatei ändern, lädt FreeMarker die Vorlage automatisch neu und analysiert sie erneut, wenn Sie die Vorlage das nächste Mal erhalten. Auch wenn die direkte Feststellung, ob eine Datei geändert wurde, ein zeitaufwändiger Vorgang ist, stellt FreeMarker einen Konfigurationsparameter „Aktualisierungsverzögerung“ auf der Ebene des Konfigurationsobjekts bereit. Dieser Parameter gibt an, wie lange es dauert, bis FreeMarker die Version der Vorlage ermittelt. Die Standardeinstellung beträgt 5 Sekunden. Dies bedeutet, dass alle 5 Sekunden ermittelt wird, ob die Vorlage geändert wurde diesen Parameter auf 0 . Ein weiterer zu beachtender Punkt ist, dass nicht alle Lader diese Beurteilungsmethode unterstützen. Ein auf dem Klassenlader basierender Vorlagenlader erkennt beispielsweise nicht, dass Sie die Vorlagendatei geändert haben.
So löscht FreeMarker Vorlagen im Cache. Sie können die Konfigurationsobjektmethode „clearTemplateCache“ verwenden, um die Vorlagenobjekte im Cache manuell zu löschen. Tatsächlich kann der Cache-Teil als Komponente zu FreeMarker hinzugefügt werden (d. h. es können Caching-Lösungen von Drittanbietern verwendet werden). Dies ist durch Festlegen des Parameters „cache_storage“ möglich. Für die meisten Entwickler ist die mit FreeMarker gelieferte Implementierung freemarker.cache.MruCacheStorage ausreichend. Dieser Cache verwendet eine zweistufige Richtlinie „Zuletzt verwendet“. Auf der ersten Ebene werden alle Cache-Einträge stark referenziert (Einträge sind der JVM nicht bekannt, im Gegensatz zu Soft-Referenzen), bis die maximale Zeit erreicht ist, und die am längsten verwendeten Einträge werden in den Cache der zweiten Ebene migriert. Einträge auf dieser Ebene verwenden schwache Referenzen, bis sie ablaufen. Wenn die Größe der Referenz- und starken Referenzbereiche im Konstruktor festgelegt werden kann, wenn Sie beispielsweise den starken Referenzbereich auf 20 und den schwachen Referenzbereich auf 250 festlegen möchten, können Sie den folgenden Code verwenden:
cfg .setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250))
Da MruCacheStorage die Standard-Cache-Implementierung ist, können Sie es auch wie folgt festlegen:
cfg.setSetting (Configuration.CACHE_STORAGE_KEY, "strong:20, soft:250");
Wenn Sie eine neue Konfiguration erstellen, verwendet diese standardmäßig die MruCacheStorage-Cache-Implementierung und der Standardwert maxStrongSize ist gleich 0, maxSoftSize ist gleich Integer.MAX_VALUE (d. h. der theoretische Maximalwert). Bei Systemen mit hoher Auslastung empfehlen wir jedoch, maxStrongSize auf einen anderen Wert als 0 zu setzen, da sonst die Vorlagen häufig neu geladen und analysiert werden müssen.
Ausnahmebehandlung
Mögliche Ausnahmen
Von FreeMarker generierte Ausnahmen fallen im Allgemeinen in die folgenden Kategorien:
Ausnahmen, die während der Initialisierungsphase von FreeMarker generiert werden: Normalerweise während Ihre Anwendung muss FreeMarker nur einmal initialisieren. Die von der Klasse in diesem Zeitraum generierte Ausnahme wird als Initialisierungsausnahme bezeichnet.
Ausnahmen beim Laden und Parsen von Vorlagen: Wenn Sie die Vorlage über die Methode Configuration.getTemplate() abrufen (sofern die Vorlage zuvor nicht zwischengespeichert wurde), werden zwei Arten von Ausnahmen generiert:
IOException: Weil die Vorlage nicht gefunden wird oder beim Lesen der Vorlage andere E/A-Ausnahmen auftreten, z. B. weil Sie keine Berechtigung zum Lesen der Datei haben usw.; aufgrund einer falschen Syntax der Vorlagendatei ;
Ausnahmen während der Ausführung: Wenn Sie die Methode Template.process(...) aufrufen, werden zwei Arten von Ausnahmen geworfen:
IOException Fehler, die beim Schreiben von Daten in den Ausgang auftreten; freemarker.template.TemplatException Andere während der Laufzeit generierte Ausnahmen sind beispielsweise, dass die Vorlage auf eine Variable verweist, die nicht vorhanden ist Achtung auf die chinesische PHP-Website!