[JAVA] Échantillon répété avec Apache Freemarker

Aujourd'hui, j'ai eu l'opportunité d'utiliser Apache Free Marker. À ce moment-là, je n'ai pas pu trouver un échantillon japonais qui produit une boucle à plusieurs reprises dans Map, donc j'écrirai un échantillon avec un mémo.

supposition

Apache FreeMarker:2.3.28

Résultat de sortie

Cette fois, le HTML est généré à l'aide de FreeMarker. Le résultat de sortie est comme indiqué dans la figure ci-dessous.

La balise Table et la valeur en bas de la table sont générées par FreeMarker. result.png

pom.xml

  <dependencies>
    <!-- FreeMarker -->
    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.28</version>
    </dependency>
  </dependencies>

template Enregistrez le modèle dans [src / main / resource / template.html]. Il s'agit d'un paramètre pour afficher la balise tr de la balise Table et la balise

sous la balise Table en répétant List ou Map.

<html>
  <span>[table from list]</span>
  <table style="border-collapse: collapse;" cellspacing="1" cellpadding="5">
    <tbody>
      <tr align="center">
        <td style="background-color:#edf5f9;border:1px solid #42B4ED;font-weight: bold;" width="25%">parameter</td>
        <td style="background-color:#edf5f9;border:1px solid #42B4ED;font-weight: bold;" width="18%">value</td>
        <td style="background-color:#edf5f9;border:1px solid #42B4ED;font-weight: bold;" width="57%">comment</td>
      </tr>
      
      <!-- Output rows from java.util.List -->
      <#list itemList as item>
      <tr>
        <td style="border: 1px solid #42B4ED;">${item.param}</td>
        <td style="border: 1px solid #42B4ED;">${item.value}</td>
        <td style="border: 1px solid #42B4ED;">${item.comment}</td>
      </tr>
      </#list>   
    </tbody>
  </table>
  
  <!-- Output a row from java.util.Map -->
  </br>
  <div>[value from map]</div>
  <#list mapValue as key, value>
  <div>
    <span>${key}:${value}</span>
  </div>
  </#list>
</html>

Java

Le code source sera décrit pour chaque partie (un bloc de traitement).

Parameter for Template

Le codage des paramètres (valeurs variables) transmis à FreeMarker est le suivant.


    //====== Build template parameter ======//
    Map<String, Object> paramMap = new HashMap<>();
      
    // build itemList
    List<Map<String, String>> itemList = new ArrayList<>();
    Map<String, String> itemMap1 = new HashMap<>();
    itemMap1.put("param", "param1");
    itemMap1.put("value", "99.1");
    itemMap1.put("comment", "hogehoge");
    itemList.add(itemMap1);
    Map<String, String> itemMap2 = new HashMap<>();
    itemMap2.put("param", "param2");
    itemMap2.put("value", "98.2");
    itemMap2.put("comment", "hogehoge2");
    itemList.add(itemMap2);
    paramMap.put("itemList", itemList);
    
    // build mapValue
    Map<String, String> mapValue = new HashMap<>();
    mapValue.put("param3", "97.3");
    mapValue.put("param4", "96.4");
    paramMap.put("mapValue", mapValue);

Puisqu'il est difficile de comprendre le contenu de Map si c'est la source, j'ajouterai également le résultat de toString de [paramMap].

paramMap


{
  itemList=[
    {param=param1, value=99.1, comment=hogehoge}, 
    {param=param2, value=98.2, comment=hogehoge2}
  ],
  mapValue={
    param3=97.3, 
    param4=96.4
  }
}

Output

L'initialisation du modèle FreeMarker et le traitement de la sortie sont les suivants. Le résultat de la sortie est envoyé vers la sortie standard et le fichier (result.html).

    //====== Initialize template ======//
    // New Config
    Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
    
    // Encoding
    cfg.setDefaultEncoding("UTF-8");

    // Set template path
    cfg.setClassLoaderForTemplateLoading(Thread.currentThread().getContextClassLoader(), "/");
  
    //====== Output ======//
    try {

      // Get template
      Template template = cfg.getTemplate("template.html");
      
      // Write to system out
      Writer out = new OutputStreamWriter(System.out);
      template.process(paramMap, out);
      out.flush();
      
      // Write to file
      try (Writer fw = new FileWriter(new File("result.html"))) {
        template.process(paramMap, fw);
        out.flush();
      }
      
    } catch(IOException | TemplateException ex) {
      ex.printStackTrace();
      System.exit(1);
    }

Git

Voir GitHub pour le code source complet

Recommended Posts

Échantillon répété avec Apache Freemarker
Mémorandum Apache FreeMarker
Exemple de code Apache beam
Démarrez Apache Solr avec Embedded.
Sortie CSV par Apache Commons CSV
Accédez à Apache Kafka avec Micronaut
Manipuler Excel avec Apache POI
Modèle de disjoncteur avec Apache Camel
Téléchargez des fichiers volumineux avec Apache JMeter
Exemple de mise à jour de fichier EXCEL avec JAVA
Redémarrez Apache avec l'image php-apache de Docker
FileUpload avec Rest sur Apache Wicket
[Linux] Démarrer le conteneur Apache avec Docker