Передача списка объектов во Freemarker, а затем зацикливание - PullRequest
34 голосов
/ 12 мая 2011

Я познакомился с FreeMarker, движком шаблонов для Java.

Я дошел до того, что смог передать объект в движок шаблонов через Hash Map. Это работает хорошо. Но как только я пытаюсь передать любой набор множественных объектов во FreeMarker, он дает мне исключение freemarker.template.TemplateException и жалуется, что он "Ожидаемая коллекция или последовательность. Задания оцениваются вместо freemarker.template.SimpleHash".

Из того, что я понимаю, читая об этом в различных ресурсах, этого следовало ожидать.

Теперь, я проделал большую часть работы на ногах и нашел несколько людей, комментирующих, как это обойти. Но, откровенно говоря, (а) для многих примеров было неясно, как именно их рекомендации применимы в моем случае - хотя я уже давно знаком с основами Java, я довольно новичок в некоторых архитектурах относящиеся к веб-приложениям на Java и (b) я не понимаю, какой из подходов был наилучшим.

Все, что я хочу сделать, на самом упрощенном уровне, в основном это:

  1. У меня есть простой сервлет.

  2. У меня есть простой класс (для этого примера с именем Invoice) с несколькими методами и свойствами.

  3. Я хочу, чтобы мой сервлет (каким-то образом) представлял список / массив / последовательность / хэш-карту экземпляров этих объектов (или представлений этих объектов) с помощью метода процесса FreeMarker.

  4. Я хочу, чтобы мой шаблон .ftl делал цикл по списку / массиву / sequence / hashmap и отображал результаты метода, что-то вроде этого:

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

Теперь я не обязательно ищу быстрое и грязное решение для этого. Я новичок в FreeMarker, но я хочу сделать это надлежащим образом, это элегантный и хороший дизайн. Так что я готов полностью переосмыслить этот подход. Может ли кто-нибудь помочь мне понять, что мне нужно сделать, чтобы что-то подобное заработало?

Ответы [ 2 ]

39 голосов
/ 12 мая 2011

Действительно ли "работа" - это коллекция?Пожалуйста, отправьте фрагмент кода, где вы создаете и обрабатываете свой шаблон.

Я только что написал быстрый тест для проверки:

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
0 голосов
/ 12 мая 2011

И дополнительный вопрос, и, возможно, не по теме.

Вопрос: Как сделать свой список счетов доступным для шаблона freemarker? Не могли бы вы опубликовать фрагмент кода, где вы добавляете его в запрос / сеанс / что угодно?

Возможно не по теме ответ: Рассматривали ли вы использование Spring MVC? Имхо, это несколько облегчает работу с Freemarker в качестве механизма шаблонирования веб-страниц. Он предоставляет FreemarkerViewRenderer, и вы можете просто вернуть «ModelAndView» из методов вашего веб-контроллера ... вы можете захотеть взглянуть на него.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...