variable tutorial length ftl espaƱol java servlets freemarker

java - tutorial - Pasar una Lista de Objetos a Freemarker y luego Looping



freemarker variable (2)

Me he estado familiarizando con FreeMarker, un motor de plantillas para Java.

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 al leer sobre esto en los diversos recursos, esto es de esperar.

Ahora, he trabajado mucho y he encontrado varias personas que comentan cómo solucionar 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 simplificado, es básicamente esto:

  1. Tengo un Servlet simple.

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

  3. Quiero que 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 que mi plantilla .ftl recorra la lista / array / sequence / hashmap y muestre los resultados del método, algo como esto:

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

Ahora, no necesariamente estoy buscando la solución rápida y sucia para 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?


¿Los "trabajos" realmente son una colección? Publique un fragmento de código donde está creando y procesando su plantilla.

Acabo de escribir una prueba rápida para verificar:

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 justa:

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

El resultado es el esperado:

Item: note1 - amount1 Item: note2 - amount2


Tanto una pregunta de seguimiento como una posible respuesta fuera del tema ...

La pregunta: ¿cómo hace que su lista de facturas esté disponible para la plantilla de freemarker? ¿Podría publicar el fragmento de código donde lo agrega a la solicitud / sesión / lo que sea?

La posible respuesta fuera del tema: ¿Ha considerado usar 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