[JAVA] Étendre Thymeleaf (UtilityObject)

Il existe plusieurs façons d'ajouter vos propres fonctionnalités à Thymeleaf, mais cette fois, nous résumerons comment ajouter un UtilityObject. Je me réfère aux documents suivants. http://www.thymeleaf.org/doc/tutorials/3.0/extendingthymeleaf.html

environnement

Qu'est-ce que l'objet utilitaire?

Quelque chose comme \ # dates ou \ #lists. http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#expression-utility-objects

Comment faire

Créer le corps

Créez une classe et une méthode qui effectuent réellement le traitement. Vous pouvez créer ceci sans penser à rien. Cette fois, je vais créer une méthode qui formate JapaneseDate et renvoie une chaîne de caractères.

public class SampleObject {

    DateTimeFormatter jpFormatter = DateTimeFormatter.ofPattern("Gyy année MM mois jj jour",
            Locale.JAPAN);

    public String format(JapaneseDate date) {
        if (date == null) {
            return null;
        }

        return jpFormatter.format(date);
    }
}

Créer une classe pour gérer l'extension

Pour créer votre propre extension, vous devez créer une classe Dialog pour la gérer. La classe à implémenter changera en fonction de la méthode d'extension, mais cette fois nous allons créer une classe qui implémente IExpressionObjectDialect. À la suite de la classe StantdardDialect, nous héritons également de la classe AbstractDialect.

Cependant, avant d'étendre UtilityObject, il est nécessaire de créer une classe Factory qui implémente IExpressionObjectFactory. Dans cette classe Factory, instanciez la classe SampleObject du corps principal.

Créer une classe Factory

public class SampleExpressionObjectFactory implements IExpressionObjectFactory {

    private static final String sampleExcepressionObjectName = "sample";

    @Override
    public Set<String> getAllExpressionObjectNames() {
        Set<String> nameSet = new HashSet<>();
        nameSet.add(sampleExcepressionObjectName);
        return nameSet;
    }

    @Override
    public Object buildObject(IExpressionContext context, String expressionObjectName) {
        if (Objects.equals(sampleExcepressionObjectName, expressionObjectName)) {
            return new SampleObject();
        }
        return null;
    }

    @Override
    public boolean isCacheable(String expressionObjectName) {
        return true;
    }
}

Dans la méthode getAllExpressionObjectNames, la chaîne de caractères pour appeler le UtitlityObject à ajouter est renvoyée sous forme de Set. Cette fois, j'essaye de permettre d'appeler le processus au format #sample.

Dans la méthode buildObject, associez la chaîne de caractères pour appeler UtilityObject avec le UtilityObject réel. Pour l'exemple de chaîne de caractères, l'instance SampleObject est renvoyée.

La méthode isCacheable décide s'il faut mettre en cache l'objet. Cette fois, je l'ai mis à vrai pour le moment. Il peut être spécifié pour chaque objet.

Créer une classe de dialecte

public class SampleDialect extends AbstractDialect implements IExpressionObjectDialect {

    public SampleDialect() {
        super("sample");
    }

    @Override
    public IExpressionObjectFactory getExpressionObjectFactory() {
        return new SampleExpressionObjectFactory();
    }
}

Choisissez un nom pour ce dialecte dans le constructeur. Je ne sais pas à quoi ça sert. .. J'ai vérifié la hiérarchie des appels, mais comme elle n'est appelée qu'à partir de la méthode appelée printConfiguration, est-ce pour la sortie du journal?

Dans la méthode getExpressionObjectFactory, retournez la classe Factory créée précédemment.

Enregistrer le dialecte

Ajoutez la classe Dialog créée cette fois au moteur de modèle de Thymeleaf. Cette fois, les paramètres de Thymeleaf sont définis dans spring-mvc.xml, ajoutez-les donc à additionalDialects comme suit.

<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
  <property name="templateResolver" ref="templateResolver" />
  <property name="additionalDialects">
    <set>
      <bean class="sample.SampleDialect" />
    </set>
  </property>
</bean>

Essayez de bouger

J'ai créé le contrôleur et le code HTML suivants et confirmé l'opération.

@Controller
public class HelloController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Model model) {

        model.addAttribute("date", JapaneseDate.now());

        return "home";
    }

}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Home</title>
</head>
<body>
  <h1>Hello world!</h1>
  <p th:text="${#sample.format(date)}">hogehoge</p>
</body>
</html>

Si "Heisei aa MM mois jj jour" (date actuelle) est affiché sous Hello World, il est terminé.

Recommended Posts

Étendre Thymeleaf (UtilityObject)
Étendez Thymeleaf pour implémenter des balises uniques (partie 1)
démarrage de thymeleaf
mémorandum thymeleaf