2009-09-01 93 views
40

Freemarkerテンプレートからパラメータを取得するメソッドを呼び出すことはできますか?FreeMarkerテンプレートのオブジェクトに対してJavaメソッドを呼び出すにはどうすればよいですか?

FreemarkerでレンダリングしようとしているオブジェクトモデルがWebページにあります。私はあなたが直接これを行うことはできませんJSPに知っ

public List getunits(final String type);

が、次のことができます。リストをフィルタリングするために使用されるパラメータを取る - 目的の1つは、それの内容のサブリストを取得する方法を持っていますあなたが望む結果を得るためのカスタム関数を書くことができます。 Freemarkerでこれをどのように解決しますか?カスタム関数を書くのと同じですか?あるいは、実際にこの種の関数を呼び出す方法がありますか?

答えて

33

FreeMarkerでは、expressionsのモデルから入手可能な呼び出しメソッドを使用できます。

があなたのオブジェクトは次のようにメソッドを呼び出すことができmyBeanとして公開されていると仮定すると:

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

あなたはもちろん、<list>を使用する必要はありません、あなたのメソッドが返すので、例としてだけでありますリスト。

+1

は問題を抱えていました。その場合、メソッドを見つけることができません。 – tbraun

+2

@tbraun:その場合は '?api'が必要です。 'Map'のメソッドは、FTLではJavaと異なり、独自の名前空間を持たないため、少なくとも(DefaultObjectWrapperでは)公開されていません。だから、 'myMap.someKey'や' myMap.get'( 'Map.get'メソッドを返す)のようにマップのキーと混在すると、何かが返され、両方とも' myMap?keys'でリストされます。それは混乱するでしょう。したがって、デフォルトでは 'myMap.something'は' something'メソッドではなく、 'something''' Map'キーだけを探します。しかし、あなたは 'myMap?api.get(...)'のようにそれを扱うことができます。 – ddekany

20

ChssPly76と言ったように、Freemarkerテンプレートの中からオブジェクトをモデルに公開している限り、メソッド呼び出しを行うことができます。

しかし、それはあなたのメソッドが返す場合、NULL(何らかの理由で)、あなたは混乱

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

これを避けるために、あなたがより良い感嘆符に気づく(myBean.getunits(...)!を使用する必要があり得ようとしていることを心に留めておくことが重要ですポイント)。

はFreemarkerのは、ここにnullをどのように処理するかについては、こちらをご覧ください:私のBeanはTreeMapのを延長したときhttp://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_missing

+0

'!'について非常に有益です。また、getunitsメソッドの返り値にデフォルト値を追加すると便利な場合もあることに注意してください: '<#list myBean.getunits(" myType ")![] as unit>'。この場合、デフォルトは空のシーケンスです。 –

関連する問題