[JAVA] Exemple de code qui utilise le moteur de modèle Moustache avec Spring Boot

Aperçu

--Utilisez le moteur de modèle Moustache avec Spring Boot --Cet environnement de vérification de fonctionnement: Java 14 (AdoptOpenJDK 14.0.2 + 12) + Spring Boot 2.3.2 + Gradle 6.5.1 + macOS Catalina

Exemple de code

Liste des codes sources

├── build.gradle
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           ├── SampleController.java
        │           └── SampleData.java
        └── resources
            ├── application.properties
            └── templates
                ├── error
                │   ├── 4xx.html
                │   └── 5xx.html
                └── my_template.html

build.gradle

Présentez Spring Boot Starter Mustache.

plugins {
  id 'org.springframework.boot' version '2.3.2.RELEASE'
  id 'io.spring.dependency-management' version '1.0.9.RELEASE'
  id 'java'
}

group = 'com.example'
version = '0.0.1'
sourceCompatibility = '14'

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-mustache'
  implementation 'org.springframework.boot:spring-boot-starter-web'
}

[spring-boot-starter-moustache-2.3.2.RELEASE.pom](https://repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-mustache/2.3.2.RELEASE/ Si vous regardez le contenu de spring-boot-starter-moustache-2.3.2.RELEASE.pom), vous pouvez voir que Spring Boot Starter Mustache utilise JMustache 1.15 de la bibliothèque Moustache.

src/main/resources/application.properties

Définissez les paramètres liés à Moustache. Ici, définissez spring.mustache.suffix pour traiter les fichiers avec l'extension html comme des fichiers modèles.

#Activer la mise en cache des modèles(Valeur par défaut: false)
spring.mustache.cache=false

#Encodage de modèle(Valeur par défaut: UTF-8)
spring.mustache.charset=UTF-8

#Préfixe appliqué au nom du modèle(Valeur par défaut: classpath:/templates/)
spring.mustache.prefix=classpath:/templates/

#Suffixe appliqué au nom du modèle(Valeur par défaut: .mustache)
spring.mustache.suffix=.html

Il existe d'autres éléments de configuration, donc si nécessaire, [Spring Boot Application Property List \ -Document](https://spring.pleiades.io/spring-boot/docs/current/reference/html/appendix-application-properties] .html) etc. doivent être référencés.

src/main/java/com/example/SampleController.java

Classe de contrôleur.

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@SpringBootApplication
@Controller
public class SampleController {

  public static void main(String[] args) {
    SpringApplication.run(SampleController.class, args);
  }

  @GetMapping("/mypage")
  public ModelAndView mypage() {
    SampleData sampleData = new SampleData();
    ModelAndView mav = new ModelAndView();
    mav.setViewName("my_template"); //Nom du fichier de modèle
    mav.addObject("mydata", sampleData); //Définir l'objet de données
    return mav;
  }

  @GetMapping("/myerror")
  public ModelAndView myerror() {
    throw new RuntimeException("Signaler une erreur");
  }
}

src/main/java/com/example/SampleData.java

Un objet de données à intégrer dans un modèle Moustache.

package com.example;

import java.util.List;
import java.util.Map;

public class SampleData {

  public String foo = "foo";

  public String getBar() {
    return "bar";
  }

  public String[] strings = {"S1", "S2", "S3"};

  public List list = List.of("L1", "L2", "L3");

  public Map map = Map.of("key1", "value1", "key2", "value2", "key3", "value3");
}

src/main/resources/templates/my_template.html

Fichier de modèle de moustache pour afficher le contenu des objets de données.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{#mydata}}
foo: {{foo}}<br>
getBar(): {{bar}}<br>
{{/mydata}}
<br>
strings:<br>
{{#mydata.strings}}
value: {{.}}<br>
{{/mydata.strings}}
<br>
list:<br>
{{#mydata.list}}
value: {{.}}<br>
{{/mydata.list}}
<br>
map:<br>
{{#mydata.map}}
{{key1}}, {{key2}}, {{key3}}
{{/mydata.map}}
</body>
</html>

src/main/resources/templates/error/4xx.html

Fichier de modèle de moustache pour les erreurs de la série 4xx. Des données telles que des informations d'erreur peuvent être intégrées si nécessaire.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>4xx</title>
</head>
<body>
<h1>4xx</h1>
<div>timestamp: {{#timestamp}}{{.}}{{/timestamp}}</div>
<div>status: {{#status}}{{.}}{{/status}}</div>
<div>error: {{#error}}{{.}}{{/error}}</div>
<div>exception: {{#exception}}{{.}}{{/exception}}</div>
<div>message: {{#message}}{{.}}{{/message}}</div>
<div>errors: {{#errors}}{{.}}{{/errors}}</div>
<div>trace: {{#trace}}{{.}}{{/trace}}</div>
<div>path: {{#path}}{{.}}{{/path}}</div>
</body>
</html>

src/main/resources/templates/error/5xx.html

Fichier de modèle de moustache pour lorsqu'une erreur de la série 5xx se produit. Des données telles que des informations d'erreur peuvent être intégrées si nécessaire.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>5xx</title>
</head>
<body>
<h1>5xx</h1>
<div>timestamp: {{#timestamp}}{{.}}{{/timestamp}}</div>
<div>status: {{#status}}{{.}}{{/status}}</div>
<div>error: {{#error}}{{.}}{{/error}}</div>
<div>exception: {{#exception}}{{.}}{{/exception}}</div>
<div>message: {{#message}}{{.}}{{/message}}</div>
<div>errors: {{#errors}}{{.}}{{/errors}}</div>
<div>trace: {{#trace}}{{.}}{{/trace}}</div>
<div>path: {{#path}}{{.}}{{/path}}</div>
</body>
</html>

Exemple de résultat de sortie

Accédez avec curl et vérifiez le résultat de la réponse.

Quand la réponse est normale

L'objet de données est intégré dans le modèle et la sortie de Moustache.

$ curl http://localhost:8080/mypage
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
foo: foo<br>
getBar(): bar<br>
<br>
strings:<br>
value: S1<br>
value: S2<br>
value: S3<br>
<br>
list:<br>
value: L1<br>
value: L2<br>
value: L3<br>
<br>
map:<br>
value1, value2, value3
</body>
</html>

Quand 404 est introuvable

Les informations d'erreur sont incorporées et générées dans le fichier de modèle Moustache lorsqu'une erreur de la série 4xx se produit.

$ curl --include -H "accept: text/html" http://localhost:8080/
HTTP/1.1 404 
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: text/html;charset=UTF-8
Content-Language: ja-JP
Content-Length: 321
Date: Fri, 07 Aug 2020 07:55:53 GMT

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>4xx</title>
</head>
<body>
<h1>4xx</h1>
<div>timestamp: Fri Aug 07 16:55:53 JST 2020</div>
<div>status: 404</div>
<div>error: Not Found</div>
<div>exception: </div>
<div>message: </div>
<div>errors: </div>
<div>trace: </div>
<div>path: /</div>
</body>
</html>

Lorsqu'une erreur survient

Les informations d'erreur sont intégrées et sorties dans le fichier de modèle Moustache lorsqu'une erreur système 5xx se produit.

$ curl --include -H "accept: text/html" http://localhost:8080/myerror
HTTP/1.1 500 
Content-Type: text/html;charset=UTF-8
Content-Language: ja-JP
Content-Length: 340
Date: Fri, 07 Aug 2020 07:55:47 GMT
Connection: close

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>5xx</title>
</head>
<body>
<h1>5xx</h1>
<div>timestamp: Fri Aug 07 16:55:47 JST 2020</div>
<div>status: 500</div>
<div>error: Internal Server Error</div>
<div>exception: </div>
<div>message: </div>
<div>errors: </div>
<div>trace: </div>
<div>path: /myerror</div>
</body>
</html>

Matériel de référence

Guide «Comment utiliser» Spring Boot \ -Traduction japonaise du document officiel

Si vous utilisez Moustache, il existe également un MoustacheViewResolver nommé "moustacheViewResolver". Recherchez des ressources en insérant le nom de la vue entre des préfixes et des suffixes. Le préfixe est spring.mustache.prefix et le suffixe est spring.mustache.suffix. Les valeurs de préfixe et de suffixe par défaut sont respectivement "classpath: / templates /" et ".mustache". Vous pouvez remplacer MustacheViewResolver en fournissant un bean portant le même nom.

Recommended Posts

Exemple de code qui utilise le moteur de modèle Moustache avec Spring Boot
Exemple de code utilisant JMustache, le moteur de modèles Moustache en Java
Exemple d'application Web qui gère plusieurs bases de données avec Spring Boot 1.5
Écrire du code de test avec Spring Boot
Exécuter un projet Spring Boot avec VS Code
Afficher la tâche Gradle dans le projet Spring Boot
Exemple de code pour le contrôle de la base de données par transaction déclarative avec Spring Boot + Spring Data JPA
Obtenez plusieurs ressources qui correspondent au modèle au printemps
Spécifiez le codage des ressources statiques dans Spring Boot
Code qui affiche uniquement la caméra intégrée dans le traitement
Traitement de branche avec la valeur de retour de RestTemplate et le code d'état de ResponseEntity dans Spring Boot
Spring Boot 1.x atteindra EOL l'année prochaine.
Accélérez les tests des validateurs qui nécessitent DI dans Spring Boot
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Définir le paramètre contextuel dans Spring Boot
Multi-projets Spring Boot 2 avec Gradle
Changements majeurs dans Spring Boot 1.5
NoHttpResponseException dans Spring Boot + WireMock
Sachez que la valeur par défaut de la redirection Spring Boot est http
Obtenez une instance proxy du composant lui-même dans Spring Boot
[Spring Boot] Simulez le contenu câblé automatiquement en dehors de la portée [JUnit 5]
Voir le comportement de redirection relative avec le paramètre server.tomcat.use-relative-redirects dans Spring Boot
Utilisez un exemple de domaine pour le nom du package dans l'exemple de code
Ce que j'ai fait lors de la migration de la série Spring Boot 1.4 vers la série 2.0
Exemple de code pour le test unitaire d'un contrôleur Spring Boot avec MockMvc
Ce que j'ai fait lors de la migration de la série Spring Boot 1.5 vers la série 2.0
Exemple de code pour appeler l'API Yahoo! Local Search en Java
Écrivons un code de test pour la fonction de connexion avec Spring Boot
[Spring Boot] Jusqu'à ce que @Autowired soit exécuté dans la classe de test [JUnit5]
Formulaire qui reçoit la valeur de l'élément répétitif dans Spring MVC
[Spring Boot] Liste des règles de validation qui peuvent être utilisées dans le fichier de propriétés pour les messages d'erreur
Développement d'applications Spring Boot dans Eclipse
Points de révision du code de l'application Spring Boot
Spring Boot pour la première fois
Environnement Java Spring dans vs Code
Spring Boot: exemple de projet d'API Restful
Programmation Spring Boot avec VS Code
Implémenter l'API REST avec Spring Boot
Qu'est-ce que @Autowired dans Spring Boot?
Implémenter l'application Spring Boot dans Gradle
Un mémo qui a touché Spring Boot
Comment utiliser Thymeleaf avec Spring Boot
Une histoire sur un projet Spring Boot écrit en Java qui prend en charge Kotlin
Les champs auto-câblés dans une classe qui hérite de TextWebSocketHandler dans Spring Boot deviennent NULL
Étapes pour rendre Spring Boot capable de faire référence à la valeur dans le fichier de propriétés
J'ai utilisé Docker pour solidifier le modèle à développer avec Spring Boot.
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
Mon mémorandum que je veux faire ValidationMessages.properties UTF8 dans Spring Boot
[Java] Implémenter une fonction qui utilise une classe implémentée dans le modèle Builder