Je me suis familiarisé avec FreeMarker, un moteur de modèle pour Java.
Je suis arrivé au point où je suis en mesure de passer un objet au moteur de modèle via une carte de hachage. Ça marche bien. Mais dès que j'essaye de passer n'importe quelle sorte d'ensemble de plusieurs objets à FreeMarker, cela me donne un freemarker.template.TemplateException et se plaint qu'il "Collection ou séquence attendue. Les travaux évalués à la place à freemarker.template.SimpleHash".
D'après ce que je comprends de la lecture à ce sujet dans les différentes ressources, c'est à prévoir.
Maintenant, j'ai fait une grande partie du travail sur les jambes et trouvé un certain nombre de personnes commentant comment contourner cela. Mais, très franchement, (a) pour de nombreux exemples, il était difficile de savoir exactement comment leurs conseils s'appliquent dans mon cas - même si je connais les bases de Java depuis un certain temps déjà) suis assez nouveau pour certaines des architectures relatives aux Java applications web et (b) je ne sais pas laquelle des approches était la meilleure approche.
Tout ce que je veux faire, au niveau le plus simplifié, c'est essentiellement ceci:
J'ai un simple servlet.
J'ai une classe simple (pour cet exemple nommé Facture) avec quelques méthodes et propriétés.
Je veux que ma servlet (d'une certaine manière) présente une liste/tableau/séquence/hashmap des instances de ces objets (ou des vues de ces objets) via la méthode de processus de FreeMarker.
Je veux que mon modèle .ftl fasse une boucle à travers la liste/tableau/séquence/hashmap et affiche les résultats de la méthode, quelque chose comme ceci:
< # list invoices as invoice>
Invoice note: ${invoice.getNote()}, Invoice Amount:${invoice.getAmount()}
< / # list>
Maintenant, je ne cherche pas nécessairement la solution rapide et sale à cela. Je suis nouveau sur FreeMarker, mais je veux le faire de la bonne manière, avec un design élégant et bon. Je suis donc prêt à repenser complètement cette approche. Quelqu'un peut-il m'aider à voir ce que je dois faire pour que quelque chose comme ça fonctionne?
Les "emplois" sont-ils vraiment une collection? Veuillez publier un extrait de code dans lequel vous créez et traitez votre modèle.
Je viens d'écrire un test rapide pour vérifier:
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() );
}
Le modèle est juste:
<#list invoices as invoice>
Item: ${invoice.note} - ${invoice.amount}
</#list>
Le résultat est comme prévu:
Item: note1 - amount1
Item: note2 - amount2
À la fois une question de suivi et une réponse éventuellement hors sujet.
La question: comment rendre votre liste de factures disponible pour le modèle de marque déposée? Pourriez-vous publier l'extrait de code où vous l'ajoutez à la demande/session/quoi que ce soit?
La réponse peut-être hors sujet: avez-vous envisagé d'utiliser Spring MVC? À mon humble avis, cela facilite le travail avec Freemarker en tant que mécanisme de création de modèles de pages Web. Il fournit un FreemarkerViewRenderer et vous pouvez simplement retourner un "ModelAndView" à partir de vos méthodes de contrôleur Web ... vous voudrez peut-être y jeter un œil.