43 Stimmen

Übergabe einer Liste von Objekten an Freemarker und anschließende Schleifenbildung

Ich habe mich mit FreeMarker vertraut gemacht, einer Template-Engine für Java.

Ich habe den Punkt erreicht, an dem ich in der Lage bin, ein Objekt über eine Hash Map an die Template Engine zu übergeben. Das funktioniert ganz gut. Aber sobald ich versuche, eine beliebige Menge von mehreren Objekten an FreeMarker zu übergeben, bekomme ich eine freemarker.template.TemplateException und beschwere mich, dass es "Expected collection or sequence. jobs evaluated instead to freemarker.template.SimpleHash".

Nach dem, was ich in den verschiedenen Quellen gelesen habe, ist dies zu erwarten.

Ich habe einen Großteil der Arbeit erledigt und eine Reihe von Kommentaren gefunden, wie man das Problem umgehen kann. Aber, ehrlich gesagt, (a) für viele der Beispiele war es unklar, wie genau ihre Ratschläge in meinem Fall gilt - obwohl ich Java-Grundlagen für eine ganze Weile gekannt habe, bin ich ziemlich neu auf einige der Architektur in Bezug auf Java-Web-Anwendungen und (b) ich bin verwirrt, welche der Ansätze war der beste Ansatz.

Alles, was ich tun möchte, ist, vereinfacht gesagt, Folgendes:

  1. Ich habe ein einfaches Servlet.

  2. Ich habe eine einfache Klasse (für dieses Beispiel namens Invoice) mit ein paar Methoden und Eigenschaften.

  3. Ich möchte mein Servlet (in irgendeiner Weise) eine Liste/Array/Sequenz/Hashmap von Instanzen dieser Objekte (oder Ansichten dieser Objekte) über FreeMarker's Prozess-Methode zu präsentieren.

  4. Ich möchte meine .ftl-Vorlage eine Schleife durch die Liste/Array/Sequenz/Hashmap und Display-Methode-Ergebnisse, etwas wie diese haben:

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

Ich bin nicht unbedingt auf der Suche nach einer schnellen und schmutzigen Lösung für dieses Problem. Ich bin neu bei FreeMarker, aber ich möchte dies auf die richtige Art und Weise tun, die elegant und gut gestaltet ist. Ich bin also bereit, diesen Ansatz völlig neu zu überdenken. Kann mir jemand sagen, was ich tun muss, um so etwas zum Laufen zu bringen?

52voto

st.never Punkte 11733

Ist "jobs" wirklich eine Sammlung? Bitte posten Sie einen Codeausschnitt, in dem Sie Ihre Vorlage erstellen und verarbeiten.

Ich habe gerade einen kurzen Test geschrieben, um das zu überprüfen:

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() );
}

Die Vorlage ist einfach:

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

Das Ergebnis ist wie erwartet:

Item: note1 - amount1
Item: note2 - amount2

0voto

lutzh Punkte 4829

Sowohl eine Folgefrage als auch eine möglicherweise themenfremde Antwort

Die Frage: Wie machen Sie Ihre Rechnungsliste für die Freemarker-Vorlage verfügbar? Könnten Sie das Codeschnipsel posten, in dem Sie es zur Anfrage/Sitzung/was auch immer hinzufügen?

Die möglicherweise themenfremde Antwort: Haben Sie die Verwendung von Spring MVC in Betracht gezogen? Imho macht es die Arbeit mit Freemarker als Template-Mechanismus für Webseiten etwas einfacher. Es bietet einen FreemarkerViewRenderer und Sie können einfach ein "ModelAndView" von Ihren Web-Controller-Methoden zurückgeben... das sollten Sie sich vielleicht einmal ansehen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X