2012-03-07 18 views
0

freemarkerテンプレートをいくつかのルールで前処理する方法があるのか​​どうか疑問に思っていました。実際には指示や方法ではない構文糖を追加したいと思います。インスタンスFoの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クラスに属しているとします。したがって、DefaultObjectWrapperまたはBeansWrapperを拡張してこれらのアイテムを特別にラップし、FreeMarkerを初期化する場所でConfiguration.setObjectWrapper(new YourObjectWrapper())を一度使用することができます。 (カスタマイズの例としてDefaultObjectWrapperのソースコードを参照してください; BeansWrapperをXMLノード、Jythonオブジェクトなどをラップするように拡張します)。したがって、テンプレートに${item.name}がある場合、Java側のYourHashModel.get("name")への呼び出しです。 YourHashModelfreemarker.template.TemplateHashModelになります)、getの方法ではreturn new SimpleScalar(item.getLocale(currentLocale).get("name"))などがあります。

+0

実際のケースでは、この '.l.'も同様に使用したいさまざまな種類のコレクションがアイテムに含まれている可能性があるため、これが解決策かどうかはわかりません。私はまだ初期化されていないかもしれないすべての内部オブジェクトをトラバースする必要があります。 'item.parent.parent.parent.parent.l.name'を考えてみましょう。私はテンプレートの前処理がより簡単な解決策かもしれないと思う。 –

+1

あなたの例の最後の 'parent'はまだ' getLocale'メソッドを持っていますね。私はあなたが特別にラップできるいくつかの 'Interface'または' Class'から来ていると思います。その前に何個の '親 'が存在しているのかは特別なことではありません。なぜなら、(通常は)あなたはすべて同じオブジェクトラッパーを使用するからです。あなたが 'HashMap'、' List's、配列などを通っているとは言いませんが、ルートオブジェクトのラッパーはまだ見ています。 – ddekany

関連する問題