Frage Freemarker, der über Hashmap-Schlüssel iteriert


Freemarker hat zwei Auflistungsdatentypen, Listen und Hashmaps Gibt es eine Möglichkeit, über Hashmap-Schlüssel zu iterieren, genau wie mit Listen?

Also, wenn ich eine Var mit Daten habe, sagen wir mal:

user : {
  name : "user"
  email : "looser@everything.com"
  homepage : "http://nosuchpage.org"
}

Ich möchte alle Eigenschaften des Benutzers mit ihrem Wert drucken. Das ist ungültig, aber das Ziel ist klar:

<#list user.props() as prop>
  ${prop} = ${user.get(prop)}
</#list>

76
2017-09-30 12:22


Ursprung


Antworten:


Bearbeiten: Verwenden Sie diese Lösung nicht mit FreeMarker 2.3.25 und höher, besonders nicht .get(prop). Siehe andere Antworten.

Sie verwenden das eingebaute Schlüssel Funktion, z.B. das sollte funktionieren:

<#list user?keys as prop>
    ${prop} = ${user.get(prop)}
</#list>  

94
2017-09-30 12:27



Zu Ihrer Information: Die Syntax zum Abrufen der Werte sieht folgendermaßen aus:

http://freemarker.sourceforge.net/docs/ref_builtins_hash.html

<#assign h = {"name":"mouse", "price":50}>
<#assign keys = h?keys>
<#list keys as key>${key} = ${h[key]}; </#list>

47
2018-03-30 17:24



Seit 2.3.25, mach es so:

<#list user as propName, propValue>
  ${propName} = ${propValue}
</#list>

Beachten Sie, dass dies auch mit Nicht-String-Schlüsseln funktioniert (im Gegensatz zu map[key], die als geschrieben werden musste map?api.get(key) dann).

Vor 2.3.25 war die Standardlösung:

<#list user?keys as prop>
  ${prop} = ${user[prop]}
</#list>

Jedoch verwenden einige wirklich alte FreeMarker-Integrationen eine seltsame Konfiguration, in der die Öffentlichkeit Map Methoden (wie getClass) erscheinen als Schlüssel. Das passiert, wenn sie ein reines verwenden BeansWrapper (Anstatt von DefaultObjectWrapper) deren simpleMapWrapper Eigentum wurde angelassen false. Sie sollten solch ein Setup vermeiden, da es die Methoden mit Real mischt Map Einträge. Aber wenn Sie in solch ein unglückliches Setup geraten, ist der Weg, die Situation zu entkommen, die offen gelegten Java-Methoden, wie z user.entrySet(), user.get(key)usw., und nicht die Vorlage Sprache Konstrukte wie verwenden ?keys oder user[key].


24
2017-07-08 17:25



Wenn Sie a BohnenWrapper Mit einem Exposure-Level von Expose.SAFE oder Expose.ALL kann der Java-Standardansatz des Iterierens des Entry-Sets verwendet werden:

Zum Beispiel funktioniert das Folgende in Freemarker (seit mindestens Version 2.3.19):

<#list map.entrySet() as entry>  
  <input type="hidden" name="${entry.key}" value="${entry.value}" />
</#list>

In Struts2 zum Beispiel eine Erweiterung des BeanWrapper wird verwendet, wenn die Belichtungsstufe standardmäßig so eingestellt ist, dass diese Art der Iteration möglich ist.


12
2018-05-07 14:48



Iterieren von Objekten

Wenn Ihre Map-Schlüssel ein Objekt und keine Zeichenfolge sind, können Sie sie mit Freemarker iterieren.

1) Konvertiere die Karte in eine Liste im Controller:

List<Map.Entry<myObjectKey, myObjectValue>> convertedMap  = new ArrayList(originalMap.entrySet());

2) Iteriere die Karte in der Freemarker-Vorlage, indem du auf das Objekt im Schlüssel und das Objekt im Wert zugreifst:

<#list convertedMap as item>
    <#assign myObjectKey = item.getKey()/>
    <#assign myObjectValue = item.getValue()/>
    [...]
</#list>

2
2018-06-20 08:42



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 Map in Java so einstellen

Map<String,Object> hash = new HashMap<String,Object>();
hash.put("firstname", "a");
hash.put("lastname", "b");

Map<String,Object> map = new HashMap<String,Object>();
map.put("hash", hash);

Dann kannst du die Mitglieder von 'hash' in Freemarker so erreichen -

${hash['firstname']}
${hash['lastname']}

Ausgabe :

a
b

1
2018-03-19 18:28



Der Vollständigkeit halber sei erwähnt, dass es in Freemarker seit kurzem einen ordentlichen Umgang mit leeren Sammlungen gibt.

Die einfachste Möglichkeit, eine Map zu iterieren, ist:

<#list tags>
<ul class="posts">
    <#items as tagName, tagCount>
        <li>{$tagName} (${tagCount})</li>
    </#items>
</ul>
<#else>
    <p>No tags found.</p>
</#list>

Nicht mehr <#if ...> Wrapper.


0
2017-07-23 16:09