2009-09-01 89 views
40

是否可以調用一個從Freemarker模板獲取參數的方法?如何從FreeMarker模板調用對象的java方法?

我有一個對象模型,我試圖用Freemarker呈現到網頁中。其中一個對象都有一個方法來獲得它的內容的子列表 - 以用來過濾列表中的參數:

public List getunits(final String type);

我知道在JSP中你不能直接這樣做,但你可以編寫自定義函數,這將允許你實現你想要的結果。你如何在Freemarker中解決這個問題?編寫自定義函數是否一樣?或者有什麼方法可以實際調用這種功能?

回答

33

FreeMarker允許調用expressions內通過模型提供的方法。

假設你的對象已經暴露myBean可以調用方法如下:

<#list myBean.getunits("myType") as unit> 
    do stuff with ${unit} 
</#list> 

您不必使用<list>,當然,這只是有作爲一個例子,因爲你的方法返回一個名單。

+1

有問題時,我的豆正在伸出一個TreeMap。在這種情況下找不到方法。 – tbraun 2013-06-12 13:48:00

+2

@tbraun:在這種情況下,您需要'?api'。 'Map'-s的方法沒有公開(至少有'DefaultObjectWrapper'),因爲在FTL中,與Java不同,這些方法沒有自己的命名空間。所以他們會和map中的鍵混合,比如'myMap.someKey'和'myMap.get'(返回'Map.get'方法)都會返回一些東西,並且都會用'myMap?keys'列出來,這將是一個爛攤子。所以默認情況下,'myMap.something'只查找'something'' Map'鍵,而不是'something'方法。但是你可以像'myMap?api.get(...)'那樣工作。 – ddekany 2015-05-24 07:35:28

20

As ChssPly76表示,只要您在模型中公開該對象,就可以在Freemarker模板中執行方法調用。

但要記住,如果你的方法返回NULL(無論何種原因),你會得到一個令人困惑的

Expression myBean.getunits() is undefined on line .... 

爲了避免這種情況,你應該更好地利用myBean.getunits(...)!(注意感嘆號是非常重要的點)。

詳細瞭解了Freemarker如何處理在這裏空:http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_missing

+0

知道'!'很有幫助。另外,請注意,爲getunits方法的返回值添加一個默認值可能很有用:像這樣:<#list myBean.getunits(「myType」)![] as unit>'。在這種情況下,默認值是一個空序列。 – 2014-12-17 23:51:18

相關問題