簡體   English   中英

Freemarker迭代hashmap鍵

[英]Freemarker iterating over hashmap keys

Freemarker有兩種集合數據類型,列表和hashmaps有沒有辦法迭代hashmap鍵,就像我們對列表一樣?

所以,如果我有一個帶數據的var,那就說:

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

我想用它們的值打印所有用戶的屬性。 這是無效的,但目標很明確:

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

編輯:不要在FreeMarker 2.3.25及更高版本中使用此解決方案,尤其不要使用.get(prop) 看到其他答案。

您使用內置功能,例如,這應該工作:

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

僅供參考,看起來檢索值的語法已根據以下內容進行了更改:

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>

從2.3.25開始,就像這樣:

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

請注意,這也適用於非字符串鍵(與map[key]不同, map[key]必須寫為map?api.get(key) )。

在2.3.25之前,標准解決方案是:

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

但是,一些非常古老的FreeMarker集成使用了一種奇怪的配置,其中公共Map方法(如getClass )顯示為鍵。 這是因為他們使用的是純的BeansWrapper (而不是DefaultObjectWrapper ),其simpleMapWrapper屬性為false 您應該避免這樣的設置,因為它將方法與實際的Map條目混合在一起。 但是如果遇到這種不幸的設置,那么逃避這種情況的方法是使用暴露的Java方法,例如user.entrySet()user.get(key)等,而不是使用像?keys這樣的模板語言結構?keysuser[key]

如果使用BeansWrapper與Expose.SAFE或Expose.ALL的曝光水平,然后重復所述條目組的標准的Java方法可以采用:

例如,以下內容適用於Freemarker(至少從版本2.3.19開始):

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

例如,在Struts2中, BeanWrapper的擴展使用默認的暴露級別以允許這種迭代方式。

迭代對象

如果您的地圖鍵是一個對象而不是一個字符串,您可以使用Freemarker進行迭代。

1)將地圖轉換為控制器中的列表:

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

2)在Freemarker模板中迭代地圖,訪問Key中的對象和Value中的Object:

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

您可以使用單引號訪問您在Java程序中設置的密鑰。

如果你像這樣在Java中設置Map

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);

然后你可以像這樣訪問Freemarker中'hash'的成員 -

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

輸出:

a
b

為了完整起見,值得一提的是,自最近以來,Freemarker中的空集合處理得體。

所以迭代地圖最方便的方法是:

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

不再有<#if ...>包裝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM