2011-05-12 13 views
28

Me he estado familiarizando con FreeMarker, un motor de plantillas para Java.Pasando una lista de objetos a Freemarker y luego a Looping

Llegué al punto en el que puedo pasar un objeto al motor de plantillas a través de un Hash Map. Eso funciona bien Pero tan pronto como trato de pasar cualquier tipo de conjunto de objetos múltiples a FreeMarker, me da una freemarker.template.TemplateException y me quejo de que "trabajos esperados de colección o secuencia evaluados en su lugar freemarker.template.SimpleHash".

Por lo que entiendo por leer sobre esto en los diversos recursos, esto es de esperar.

Ahora, he trabajado mucho y he encontrado varias personas que comentan cómo evitar esto. Pero, francamente, (a) para muchos de los ejemplos no estaba claro cómo se aplica exactamente su consejo en mi caso, aunque conozco los principios básicos de Java desde hace bastante tiempo, soy bastante nuevo en algunos aspectos de la arquitectura. perteneciente a las aplicaciones web de Java y (b) estoy confundido en cuanto a cuál de los enfoques fue el mejor enfoque.

Todo lo que quiero hacer, en el nivel más simplificada, es básicamente el siguiente:

  1. que tienen un servlet simple.

  2. Tengo una clase simple (para este ejemplo llamada Factura) con algunos métodos y propiedades.

  3. Quiero tener mi servlet (de alguna manera) presente una lista/matriz/secuencia/hashmap de instancias de estos objetos (o vistas de esos objetos) a través del método de proceso de FreeMarker.

  4. Quiero tener mi plantilla .ftl hacer un bucle por la lista/conjunto/secuencia/HashMap y método de visualización resultados, algo como esto:

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

Ahora, no estoy necesariamente buscando la solución rápida & sucio a esto. Soy nuevo en FreeMarker, pero quiero hacer esto de la forma correcta, elegante y con buen diseño. Entonces estoy abierto a repensar por completo este enfoque. ¿Alguien puede ayudarme a ver qué debo hacer para que funcione algo como esto?

+0

por cierto: la etiqueta "freetype "se refiere a un motor de representación de fuentes. En su lugar, debe etiquetar esta pregunta como "freemarker". –

Respuesta

37

Es "puestos de trabajo" en realidad una colección? Publique un fragmento de código donde está creando y procesando su plantilla.

acabo escribió una prueba rápida para comprobar:

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

La plantilla es simplemente:

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

El resultado es el esperado:

Item: note1 - amount1 
Item: note2 - amount2 
+0

Pero si necesitamos usar una lista ?? ¿Cómo puedo manejar eso? Gracias –

+0

Funcionó para mí, pero también tuve que agregar métodos getter como se menciona aquí http://stackoverflow.com/questions/18329192/accessing-properties-of-objects-within-list –

0

Tanto una pregunta de seguimiento y una respuesta posiblemente fuera de tema ..

La pregunta: ¿Cómo hacer que su lista de facturas a disposición de la plantilla FreeMarker? ¿Podría publicar el fragmento de código donde lo agrega a la solicitud/sesión/lo que sea?

Posible respuesta fuera del tema: ¿Ha considerado utilizar Spring MVC? Imho hace que trabajar con Freemarker como mecanismo de plantillas de páginas web sea algo más fácil. Proporciona un FreemarkerViewRenderer y puede devolver un "ModeloAndView" desde sus métodos de controlador web ... es posible que desee echarle un vistazo.

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

Cuestiones relacionadas