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
Quelque chose comme \ # dates ou \ #lists. http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#expression-utility-objects
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);
}
}
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.
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.
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.
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>
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é.