Freemarker verfügt über zwei Sammlungsdatentypen, Listen und Hashmaps. Gibt es eine Möglichkeit, über Hashmap-Schlüssel zu iterieren, genau wie bei Listen?
Wenn ich also eine Variable mit Daten habe, sagen wir:
user : {
name : "user"
email : "[email protected]"
homepage : "http://nosuchpage.org"
}
Ich möchte alle Eigenschaften des Benutzers mit ihrem Wert drucken. Dies ist ungültig, aber das Ziel ist klar:
<#list user.props() as prop>
${prop} = ${user.get(prop)}
</#list>
java
freemarker
tzador
quelle
quelle
${user[prop]}
als Kurzschrift verwendenuser[prop]
Konfigurationsstandardwerken soweitprop
eineString
(sonst müssen Sieuser?api.get(prop)
zur Zeit), aber Vorsicht, einige Frameworks (wie Struts, glaube ich) verwenden , um einen jetzt veralteten Setup wo Methodennamen werden gemischt mitMap
Tasten, und so , wenn der Wert vonprops
geschieht Wenn Sie einen Methodennamen imuser
Java-Objekt haben, erhalten Sie die Methode anstelle der von Ihnen gemeinten. Das ist auch der Grund, warum sie in diesen Legacy-Setups immer verwendet werdenuser.get(prop)
.Zu Ihrer Information, es sieht so aus, als ob sich die Syntax zum Abrufen der Werte geändert hat gemäß:
http://freemarker.sourceforge.net/docs/ref_builtins_hash.html
quelle
[key]
und.get(key)
existiert seit der Antike..get(key)
ist nichts Besonderes für FTL, es ruft nur diese öffentliche Java-Methode auf. Sie können es jedoch nur verwenden, wenn FreeMarker so konfiguriert wurde, dassMap
Methoden verfügbar gemacht werden.Machen Sie es seit 2.3.25 folgendermaßen:
Beachten Sie, dass dies auch mit Schlüsseln ohne Zeichenfolge funktioniert (im Gegensatz zu den Schlüsseln
map[key]
, die wiemap?api.get(key)
damals geschrieben werden mussten ).Vor 2.3.25 war die Standardlösung:
Einige wirklich alte FreeMarker-Integrationen verwenden jedoch eine seltsame Konfiguration, bei der die öffentlichen
Map
Methoden (wiegetClass
) als Schlüssel angezeigt werden. Dies geschieht, wenn sie ein reinesBeansWrapper
(anstelle vonDefaultObjectWrapper
) verwenden, dessensimpleMapWrapper
Eigentum belassen wurdefalse
. Sie sollten ein solches Setup vermeiden, da es die Methoden mit echtenMap
Einträgen mischt . Aber wenn Sie in einem solche unglücklichen Setup ausführen, die Möglichkeit , die Situation zu entkommen , wird mit den freiliegenden Java - Methoden, wie zum Beispieluser.entrySet()
,user.get(key)
usw. und nicht die Konstrukte Template - Sprache wie?keys
oderuser[key]
.quelle
${x?nosuchthing}
und den Mauszeiger darüber halten, zeigt die angezeigte Fehlermeldung an, welche FreeMarker-Version verwendet wird. Es sollte sein2.3.25-incubating
.Wenn Sie einen BeansWrapper mit einer Belichtungsstufe von Expose.SAFE oder Expose.ALL verwenden, kann der Standard-Java-Ansatz zum Iterieren des Eintragssatzes verwendet werden:
In Freemarker funktioniert beispielsweise Folgendes (seit mindestens Version 2.3.19):
In Struts2 wird beispielsweise eine Erweiterung des BeanWrapper verwendet, wobei die Belichtungsstufe standardmäßig festgelegt ist, um diese Art der Iteration zu ermöglichen.
quelle
InvalidReferenceException
als ich es versuchte, während ichmap?keys
arbeitete.freemarker.ext.beans.BeansWrapper
als Objekt-Wrapper. Andernfalls wirdMap
s automatisch in einSimpleHash
Objekt eingeschlossen, das nicht unterstützt wird#entrySet()
. (siehe freemarker.sourceforge.net/docs/api/freemarker/template/… )BeansWrapper
, zumindest nicht mit seinen Standardeinstellungen, wosimpleMapWrapper
istfalse
. Es wird sehr verwirrend, da Schlüssel mit Methodennamen gemischt werden. Wenn Sie aufrufen müssenentrySet()
, verwenden Sie einfach weiterhin einen "sauberen" Objekt-Wrapper wie den Standard-Wrapper und schreibenmap?api.entrySet()
Sie , wenn Sie anstelle der Schlüssel auf die Java-API zugreifen müssen.Objekte iterieren
Wenn Ihre Kartenschlüssel ein Objekt und keine Zeichenfolge sind, können Sie sie mit Freemarker iterieren.
1) Konvertieren Sie die Karte in eine Liste in der Steuerung:
2) Iterieren Sie die Karte in der Freemarker-Vorlage und greifen Sie auf das Objekt im Schlüssel und das Objekt im Wert zu:
quelle
Der Vollständigkeit halber ist zu erwähnen, dass es in Freemarker seit kurzem einen anständigen Umgang mit leeren Sammlungen gibt.
Der bequemste Weg, eine Karte zu iterieren, ist:
Keine
<#if ...>
Wrapper mehr .quelle
Sie können ein einfaches Anführungszeichen verwenden, um auf den Schlüssel zuzugreifen, den Sie in Ihrem Java-Programm festgelegt haben.
Wenn Sie eine Karte in Java wie folgt einstellen
Dann können Sie wie folgt auf die Mitglieder von 'Hash' in Freemarker zugreifen -
Ausgabe :
quelle