[JAVA] Thymeleaf erweitern (UtilityObject)

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

Umgebung

Was ist ein Utility-Objekt?

So etwas wie \ # Daten oder \ #Listen. http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#expression-utility-objects

Wie man ... macht

Erstellen Sie den Körper

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);
    }
}

Erstellen Sie eine Klasse zum Verwalten der Erweiterung

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.

Erstellen Sie eine Factory-Klasse

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.

Erstellen Sie eine Dialektklasse

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.

Dialekt registrieren

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>

Versuche dich zu bewegen

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.

Recommended Posts

Thymeleaf erweitern (UtilityObject)
Erweitern Sie Thymeleaf, um eindeutige Tags zu implementieren (Teil 1).
Thymeleaf Start-up
Thymeleaf Memorandum