web-dev-qa-db-ja.com

オブジェクトのリストをFreemarkerに渡し、ループする

私は、JavaのテンプレートエンジンであるFreeMarkerに精通しています。

ハッシュマップを介してオブジェクトをテンプレートエンジンに渡すことができるようになりました。それは大丈夫です。ただし、複数のオブジェクトのセットをFreeMarkerに渡そうとすると、freemarker.template.TemplateExceptionが返され、「コレクションまたはシーケンスが予期されます。代わりにfreemarker.template.SimpleHashに評価されるジョブ」というメッセージが表示されます。

これをさまざまなリソースで読んで理解したことから、これは予想されることです。

今、私は脚の仕事の多くを行っており、これを回避する方法についてコメントしている多くの人々を見つけました。しかし、率直に言って、(a)多くの例では、Javaの基本をかなり知っていたにもかかわらず、私の場合に彼らのアドバイスがどのように正確に当てはまるかは不明でした。 Java Webアプリに関連するアーキテクチャの一部と(b)どのアプローチが最良のアプローチであるかについて私は混乱しています。

私がやりたいことは、最も単純化されたレベルで、基本的にこれです:

  1. シンプルなサーブレットがあります。

  2. いくつかのメソッドとプロパティを持つ単純なクラス(この例ではInvoiceという名前)があります。

  3. FreeMarkerのプロセスメソッドを使用して、これらのオブジェクト(またはそれらのオブジェクトのビュー)のインスタンスのリスト/配列/シーケンス/ハッシュマップを(何らかの方法で)サーブレットに提示させたいと思います。

  4. .ftlテンプレートにlist/array/sequence/hashmapをループさせ、メソッドの結果を次のように表示させます。

< # list invoices as invoice> 
Invoice note: ${invoice.getNote()}, Invoice Amount:${invoice.getAmount()} 
< / # list>

今、私は必ずしもこれに対する迅速で汚い解決策を探しているわけではありません。私はFreeMarkerを初めて使用しますが、エレガントで優れたデザインである適切な方法でこれを行いたいと思います。ですから、私はこのアプローチを完全に再考することを受け入れています。このようなものを機能させるために私がする必要があることを誰かが私を助けることができますか?

35
Mark Nenadov

「ジョブ」は本当にコレクションですか?テンプレートを作成および処理する場所にコードスニペットを投稿してください。

私はチェックする簡単なテストを書きました:

public void testFreeMarker() throws Exception {

    List<Invoice> invoices = Arrays.asList(
       new Invoice( "note1", "amount1" ), 
       new Invoice( "note2", "amount2" ) );
    Map<String, Object> root = new HashMap<String, Object>();
    root.put( "invoices", invoices );
    StringWriter out = new StringWriter();

    Configuration cfg = new Configuration();
    cfg.setClassForTemplateLoading( FreemarkerUtils.class, "/templates" );
    cfg.setObjectWrapper( new DefaultObjectWrapper() );
    Template temp = cfg.getTemplate( "listTest.ftl" );
    temp.process( root, out );

    System.out.println( out.getBuffer().toString() );
}

テンプレートは次のとおりです。

<#list invoices as invoice>
 Item: ${invoice.note} - ${invoice.amount}
</#list>

結果は期待どおりです。

Item: note1 - amount1
Item: note2 - amount2
40
st.never

フォローアップの質問と、おそらくトピック外の回答の両方。

質問:請求書リストをfreemarkerテンプレートでどのように利用できるようにしますか?リクエスト/セッション/その他に追加するコードスニペットを投稿できますか?

おそらくトピック外の答え:Spring MVCの使用を検討しましたか?私見では、FreemarkerをWebページテンプレートメカニズムとして多少簡単に使用できます。 FreemarkerViewRendererを提供し、Webコントローラーメソッドから "ModelAndView"を返すことができます...見てみたいかもしれません。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/view.html#view-velocity

0
lutzh