Freemarker memiliki dua tipe data koleksi, daftar dan hashmaps Apakah ada cara untuk mengulang kunci hashmap seperti yang kita lakukan dengan daftar?
Jadi jika saya memiliki var dengan data, katakanlah:
user : {
name : "user"
email : "[email protected]"
homepage : "http://nosuchpage.org"
}
Saya ingin mencetak semua properti pengguna dengan nilainya. Ini tidak valid, tetapi tujuannya jelas:
<#list user.props() as prop>
${prop} = ${user.get(prop)}
</#list>
java
freemarker
tzador.dll
sumber
sumber
${user[prop]}
sebagai singkatanuser[prop]
bekerja sejauhprop
yangString
(jika tidak Anda butuhkanuser?api.get(prop)
saat ini), tetapi berhati-hatilah, beberapa kerangka kerja (seperti Struts, saya percaya) menggunakan pengaturan yang sekarang sudah usang di mana nama metode dicampur denganMap
kunci, dan begitu juga jika nilaiprops
terjadi pada menjadi nama metode diuser
objek Java, Anda mendapatkan metode, bukan apa yang Anda maksud. Itu juga mengapa dalam penyiapan lama itu selalu mereka gunakanuser.get(prop)
.FYI, sepertinya sintaks untuk mengambil nilai telah berubah sesuai dengan:
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>
sumber
[key]
dan.get(key)
ada sejak zaman kuno..get(key)
tidak ada yang khusus untuk FTL, itu hanya memanggil metode Java publik itu. Tetapi Anda hanya dapat menggunakannya jika FreeMarker dikonfigurasi untuk mengeksposMap
metode.Sejak 2.3.25, lakukan seperti ini:
Perhatikan bahwa ini juga berfungsi dengan kunci non-string (tidak seperti
map[key]
, yang harus ditulis sepertimap?api.get(key)
itu).Sebelum 2.3.25 solusi standarnya adalah:
Namun, beberapa integrasi FreeMarker yang sangat lama menggunakan konfigurasi yang aneh, di mana
Map
metode publik (sepertigetClass
) muncul sebagai kunci. Itu terjadi karena mereka menggunakan murniBeansWrapper
(bukanDefaultObjectWrapper
) yangsimpleMapWrapper
propertinya tertinggalfalse
. Anda harus menghindari pengaturan seperti itu, karena ini mencampur metode denganMap
entri yang sebenarnya . Tetapi jika Anda mengalami pengaturan malang tersebut, cara untuk melarikan diri situasi ini menggunakan metode Java yang terkena, sepertiuser.entrySet()
,user.get(key)
, dll, dan tidak menggunakan konstruksi bahasa template seperti?keys
atauuser[key]
.sumber
${x?nosuchthing}
dan Anda mengarahkan kursor ke atasnya, pesan kesalahan yang ditampilkan akan memberi tahu versi FreeMarker mana yang digunakannya. Seharusnya begitu2.3.25-incubating
.Jika menggunakan BeansWrapper dengan tingkat eksposur Expose.SAFE atau Expose.ALL, maka pendekatan Java standar untuk mengiterasi set entri dapat digunakan:
Misalnya, berikut ini akan berfungsi di Freemarker (setidaknya sejak versi 2.3.19):
<#list map.entrySet() as entry> <input type="hidden" name="${entry.key}" value="${entry.value}" /> </#list>
Dalam Struts2, misalnya, ekstensi BeanWrapper digunakan dengan tingkat eksposur default untuk memungkinkan cara iterasi ini.
sumber
InvalidReferenceException
saat saya mencobanya, saatmap?keys
bekerja.freemarker.ext.beans.BeansWrapper
sebagai pembungkus objek. Jika tidak,Map
s secara otomatis akan dibungkus menjadiSimpleHash
objek yang tidak mendukung#entrySet()
. (lihat freemarker.sourceforge.net/docs/api/freemarker/template/… )BeansWrapper
, setidaknya tidak dengan default-nya, di manasimpleMapWrapper
adalahfalse
. Ini menjadi sangat membingungkan, karena mencampur kunci dengan nama metode. Jika Anda perlu meneleponentrySet()
, tetap gunakan pembungkus objek "bersih", seperti yang default, dan tulismap?api.entrySet()
jika Anda perlu mengakses Java API sebagai ganti kuncinya.Objek Iterasi
Jika kunci peta Anda adalah objek dan bukan string, Anda dapat mengulangnya menggunakan Freemarker.
1) Ubah peta menjadi daftar di pengontrol:
List<Map.Entry<myObjectKey, myObjectValue>> convertedMap = new ArrayList(originalMap.entrySet());
2) Iterasi peta di template Freemarker, akses ke objek di Key dan Objek di Value:
sumber
Untuk kelengkapan, perlu disebutkan ada penanganan koleksi kosong yang layak di Freemarker sejak baru-baru ini.
Jadi, cara paling mudah untuk mengulang peta adalah:
<#list tags> <ul class="posts"> <#items as tagName, tagCount> <li>{$tagName} (${tagCount})</li> </#items> </ul> <#else> <p>No tags found.</p> </#list>
Tidak ada lagi
<#if ...>
pembungkus.sumber
Anda dapat menggunakan satu kutipan untuk mengakses kunci yang Anda setel di program Java Anda.
Jika Anda mengatur Peta di Jawa seperti ini
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);
Kemudian Anda dapat mengakses anggota 'hash' di Freemarker seperti ini -
${hash['firstname']} ${hash['lastname']}
Keluaran:
sumber