Aufgrund der Bequemlichkeit der Projekte, an denen man teilnehmen konnte, gab es viele Verhaltensweisen, die nicht nur mit dem Standardstandard Direct realisiert werden konnten. Daher haben wir beschlossen, diese unabhängig zu implementieren. Erstens hatte Thymeleaf selbst als Neuling nicht viel Gelegenheit, sich mit dem Training zu beschäftigen, sondern ich war eher mit JSP vertraut, also begann ich von Anfang an zu studieren.
Es machte immer mehr Spaß, da ich es tatsächlich durch Ausprobieren implementieren und die beabsichtigte Operation reproduzieren konnte, so dass ich es als Memorandum belassen werde.
Die typischen, die grundsätzlich verwendet werden, werden wie folgt klassifiziert.
Name | Erläuterung |
---|---|
IProcessorDialect | Direkt, der Elemente und Attribute bereitstellt |
IExpressionObjectDialect | Direkt, das Objekte bereitstellt, die in EL-Ausdrücken in Tag-Attributwerten verwendet werden können |
IProcessorDialect registriert einen Prozessor und implementiert Tags und kann mit einer Beschreibungsmethode wie "th: text" verwendet werden. IExpressionObjectDialect kann Dienstprogramme hinzufügen, die in EL-Ausdrücken verwendet werden können, z. B. "# strings".
IProcessorDialect
Ein Dialekt, der als Element oder Attribut beschrieben werden kann. Da IProcessorDialect eine abstrakte Klasse namens AbstractProcessorDialect bereitstellt, erben und implementieren wir diese normalerweise. Erstellen Sie einen Prozessor, der die eigentliche Verarbeitung separat implementiert, und registrieren Sie ihn in der Implementierungsklasse von AbstractProcessorDialect, damit er funktioniert.
Wenn Sie beispielsweise ein Datum erstellen, um es als "JJJJ / MM / TT" zu formatieren, können Sie es wie folgt verwenden.
■ Beschreibung auf der Vorlage
<span thex:formatdate="${date}"></span>
■ Elemente, die tatsächlich ausgegeben werden
<span>2020/01/01</span>
Als ich den zuvor erstellten Dialekt inline in das Skript-Tag schrieb, war ich süchtig danach, weil er nicht erkannt wurde.
<script th:inline="javascript">
var test = [# thex:formatdate="${date}" /] ;
console.log(test);
</script>
Es scheint, dass es in der Vorlage nicht erkannt wird, es sei denn, die Beschreibung wird so festgelegt, dass sie bei der Implementierung von AbstractProcessorDialect inline erkannt wird. Daher muss der Vorlagenmodus entsprechend dem Fall festgelegt werden, in dem JavaScript oder CSS verwendet wird.
@Override
public Set<IProcessor> getProcessors(String dialectPrefix) {
Set<IProcessor> proccessors = new HashSet<>();
proccessors.add(new SampleProcesssor(TemplateMode.HTML, dialectPrefix));
proccessors.add(new SampleProcesssor(TemplateMode.JAVASCRIPT, dialectPrefix));
proccessors.add(new SampleProcesssor(TemplateMode.CSS, dialectPrefix));
return proccessors;
}
IExpressionObjectDialect
Als Test werden wir "IExpressionObjectDialect" implementieren und ein Dienstprogramm erstellen, das in EL-Ausdrücken als "# sample" verwendet werden kann. Achten Sie darauf, den Namen, den Sie als Dienstprogramm hinzufügen, nicht mit dem Standard zu duplizieren.
Zuerst implementieren wir Dialog, um das Ausdrucksobjekt zu registrieren. Hier generieren wir den Namen des Dienstprogramms, wenn es im EL-Ausdruck verwendet wird, und die Klasse, die die Verarbeitung tatsächlich ausführt.
public class SampleDialect extends AbstractDialect implements IExpressionObjectDialect {
//Namenskonstanten bei Verwendung in EL-Ausdrücken
private static final String SAMPLE_DIALECT_NAME = "sample";
private static final Set<String> EXPRESSION_OBJECT_NAMES = Collections.singleton(SAMPLE_DIALECT_NAME);
public SampleDialect() {
super(SAMPLE_DIALECT_NAME);
}
@Override
public IExpressionObjectFactory getExpressionObjectFactory() {
return new IExpressionObjectFactory() {
@Override
public Set<String> getAllExpressionObjectNames() {
return EXPRESSION_OBJECT_NAMES;
}
@Override
public Object buildObject(IExpressionContext context, String expressionObjectName) {
if (SAMPLE_DIALECT_NAME.equals(expressionObjectName)) {
//Generieren einer Klasse, die als Dienstprogramm verarbeitet wird
return new Sample();
}
return null;
}
@Override
public boolean isCacheable(String expressionObjectName) {
return true;
}
};
}
}
Als Nächstes erstellen wir eine Klasse, die die Verarbeitung tatsächlich von der Vorlagenseite überträgt. Dieses Mal implementieren wir es mit einem einfachen Vorgang, bei dem eine Zeichenfolge übergeben, formatiert und auf dem Bildschirm angezeigt wird.
public class Sample {
public String getSampleString(final String str) {
return "Beispielzeichenfolge "" + str + "」";
}
}
Sie können es tatsächlich im EL-Ausdruck wie folgt in HTML verwenden.
■ Beschreibung auf der Vorlage
<span th:text="${#sample.getSampleString('Stichprobe')}"
■ Elemente, die tatsächlich ausgegeben werden
<span>Beispielzeichenfolge "Beispiel"</span>
Legen Sie ViewResolver in der Einstellungsklasse fest, damit es auf MVC ausgeführt werden kann. (Informationen zum Implementieren von Java Config finden Sie hier](https://qiita.com/HiroyaEnd/items/17175e947911d84c1b3b#webmvcconfig)) Da Sie hier Ihren eigenen Dialekt registrieren können, können Sie ihn auch registrieren und für die Vorlage verwenden. (Die Einstellungsmethode ist für IProcessorDialect und IExpressionObjectDialect grundsätzlich gleich.)
//Konstanten, die zum Codieren von Einstellungen verwendet werden
public static final String CHARACTER_ENCODING = "UTF-8";
//Konstante des Basisverzeichnispfads, in dem sich die Vorlage befindet
private static final String VIEW_LOCATION = "/WEB-INF/views/";
//Bean Definition ThymeleafViewResolver
@Bean
public ThymeleafViewResolver viewResolver() {
final ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
thymeleafViewResolver.setTemplateEngine(templateEngine());
thymeleafViewResolver.setCharacterEncoding(CHARACTER_ENCODING); //Stellen Sie die Antwortcodierung ein
return thymeleafViewResolver;
}
//Definieren Sie SpringTemplateEngine Bean
@Bean
public SpringTemplateEngine templateEngine() {
final SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.addDialect(new SampleDialect()); //Registrieren Sie Ihren eigenen Dialekt
return templateEngine;
}
//Definieren Sie TemplateResolver als Bean
@Bean
public AbstractConfigurableTemplateResolver templateResolver() {
final ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setPrefix(VIEW_LOCATION); //Gibt das Basisverzeichnis an, in dem die Thymeleaf-Vorlage gespeichert ist
templateResolver.setSuffix(".html"); //Legen Sie die Thymeleaf-Vorlagenerweiterung fest
templateResolver.setTemplateMode(TemplateMode.HTML); //Stellen Sie den zu interpretierenden Vorlagenmodus ein(Der Standardwert ist der HTML-Modus, wird jedoch explizit festgelegt)
templateResolver.setCharacterEncoding(CHARACTER_ENCODING); //Legen Sie die Codierung der Vorlagendatei fest
return templateResolver;
}
Nachdem die Implementierung der Einstellungen abgeschlossen ist, können Sie sie bedienen, indem Sie eine Vorlagendatei erstellen und diese überführen. Die obigen Einstellungen sind nur Beispiele, daher denke ich, dass Sie sie entsprechend Ihrer Umgebung ändern müssen.
Als ich es tatsächlich benutzte, gab es viele Punkte, die ich für einfacher als JSP hielt. Da Sie Ihren eigenen Dialekt problemlos hinzufügen können, ist er in hohem Maße erweiterbar, und ich fand es attraktiv, ihn durch Kombination mit Standard Direct flexibel implementieren zu können. Persönlich war es einfacher zu erweitern als das ursprüngliche Tag von JSP.
Da Spring Thymeleaf empfiehlt, gibt es wahrscheinlich viele Möglichkeiten, in Zukunft damit in Kontakt zu treten. Daher möchte ich mein Wissen weiter erweitern. (Am liebsten Freemaker ...)
https://qiita.com/yoshikawaa/items/aba090f291f69185e6a5
https://macchinetta.github.io/server-guideline-thymeleaf/1.5.1.RELEASE/ja/ArchitectureInDetail/WebApplicationDetail/Thymeleaf.html#id21
Recommended Posts