Es gibt verschiedene Möglichkeiten, Thymeleaf Ihre eigene Funktionalität hinzuzufügen. Dieses Mal fassen wir jedoch zusammen, wie Sie ein UtilityObject hinzufügen. Ich verweise auf die folgenden Dokumente. http://www.thymeleaf.org/doc/tutorials/3.0/extendingthymeleaf.html
So etwas wie \ # Daten oder \ #Listen. http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#expression-utility-objects
Erstellen Sie eine Klasse und Methode, die die Verarbeitung tatsächlich ausführt. Sie können dies erstellen, ohne an irgendetwas zu denken. Dieses Mal werde ich eine Methode erstellen, die JapaneseDate formatiert und eine Zeichenfolge zurückgibt.
public class SampleObject {
DateTimeFormatter jpFormatter = DateTimeFormatter.ofPattern("Gyy Jahr MM Monat dd Tag",
Locale.JAPAN);
public String format(JapaneseDate date) {
if (date == null) {
return null;
}
return jpFormatter.format(date);
}
}
Um Ihre eigene Erweiterung zu erstellen, müssen Sie eine Dialogklasse erstellen, um sie zu verwalten. Die zu implementierende Klasse ändert sich abhängig von der Erweiterungsmethode. Dieses Mal erstellen wir jedoch eine Klasse, die IExpressionObjectDialect implementiert. Nach der StantdardDialect-Klasse erben wir auch die AbstractDialect-Klasse.
Vor dem Erweitern von UtilityObject muss jedoch eine Factory-Klasse erstellt werden, die IExpressionObjectFactory implementiert. Instanziieren Sie in dieser Factory-Klasse die SampleObject-Hauptkörperklasse.
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;
}
}
In der Methode getAllExpressionObjectNames wird die Zeichenfolge zum Aufrufen des hinzuzufügenden UtitlityObject als Set zurückgegeben. Dieses Mal versuche ich, den Prozess im Format #sample aufzurufen.
Ordnen Sie in der buildObject-Methode die Zeichenfolge zum Aufrufen von UtilityObject dem tatsächlichen UtilityObject zu. Für das Zeichenfolgenbeispiel wird die SampleObject-Instanz zurückgegeben.
Die Methode isCacheable entscheidet, ob das Objekt zwischengespeichert werden soll. Dieses Mal habe ich es vorerst auf true gesetzt. Sie kann für jedes Objekt angegeben werden.
public class SampleDialect extends AbstractDialect implements IExpressionObjectDialect {
public SampleDialect() {
super("sample");
}
@Override
public IExpressionObjectFactory getExpressionObjectFactory() {
return new SampleExpressionObjectFactory();
}
}
Legen Sie im Konstruktor einen Namen für diesen Dialekt fest. Ich bin mir nicht sicher, wofür es verwendet wird. .. Ich habe die Aufrufhierarchie überprüft, aber da sie nur von der Methode printConfiguration aufgerufen wird, dient sie zur Protokollausgabe?
Geben Sie in der Methode getExpressionObjectFactory die zuvor erstellte Factory-Klasse zurück.
Fügen Sie die diesmal erstellte Dialogklasse zur Template Engine von Thymeleaf hinzu. Dieses Mal werden die Einstellungen von Thymeleaf in spring-mvc.xml definiert. Fügen Sie sie daher wie folgt zu zusätzlichen Dialekten hinzu.
<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver" />
<property name="additionalDialects">
<set>
<bean class="sample.SampleDialect" />
</set>
</property>
</bean>
Ich habe den folgenden Controller und HTML erstellt und den Vorgang bestätigt.
@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>
Wenn unter Hallo Welt "Heisei yy MM Monat dd Tag" (aktuelles Datum) angezeigt wird, ist der Vorgang abgeschlossen.