2012-03-07 58 views
0

我在想,是否有辦法用某些規則預處理freemarker模板 - 我想添加一些語法糖,這不是一個指令,也不是方法。Freemarker - 模板預處理

佛比如我有變數,這是我印像這樣:

${item.getLocale(currentLocale).name} 
${item.getLocale(currentLocale).text} 
${item.parent.getLocale(currentLocale).name} 
${item.parent.getLocale(currentLocale).text} 

顯然,getLocale結構使得整個表情相當難看。我想實現的是能夠寫出:

${item.l.name} 
${item.l.text} 
${item.parent.l.name} 
${item.parent.l.text} 

,使所有的.l.將彙編改寫爲.getLocale(currentLocale)期間。

有沒有一些很好的方法來做到這一點?謝謝!

回答

1

這幾乎是爲什麼FreeMarker中存在對象包裝;您可以以自定義的方式將數據呈現給模板。我認爲item屬於一個特定的Java類。因此,您可以擴展DefaultObjectWrapperBeansWrapper以專門包裝這些項目,然後在初始化FreeMarker時使用Configuration.setObjectWrapper(new YourObjectWrapper())。 (請參閱DefaultObjectWrapper的源代碼作爲自定義示例;它擴展BeansWrapper以特別包裝XML節點,Jython對象等)。因此,如果模板中有${item.name},則它是在Java端調用YourHashModel.get("name")(其中YourHashModel延伸freemarker.template.TemplateHashModel),並在該get方法,你可以有return new SimpleScalar(item.getLocale(currentLocale).get("name"))或類似。

+0

我不確定這是否是一種解決方案,因爲在實際情況下,該項目可能包含不同種類的集合,我也希望使用這個'.l.'。我將不得不遍歷所有可能尚未初始化的內部對象。考慮'item.parent.parent.parent.parent.l.name'。我認爲模板預處理可能是更簡單的解決方案。 – 2012-03-10 21:28:42

+1

但你的例子中的最後一個'parent'仍然有'getLocale'方法,對吧?我想這是來自一些可以專門包裝的'Interface'或'Class'。在這之前有多少''父''s不是特別的,因爲(通常)你將對所有東西都使用相同的對象包裝器。它並不需要你通過'HashMap'-s,'List'-s,數組或其他任何東西,根對象的包裝器將仍然在觀察。 – ddekany 2012-03-11 21:29:05