Подтвердить что ты не робот

Передача списка объектов в Freemarker, а затем цикл

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

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

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

Является ли "работа" действительно коллекцией? Отправьте фрагмент кода, в котором вы создаете и обрабатываете свой шаблон.

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

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

Ответ 2

Как последующий вопрос, так и возможный ответ вне темы.

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

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

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