[JAVA] Ich habe mit Thymeleaf meinen eigenen Dialekt erstellt und eingestellt und versucht, ihn zu verwenden

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.

Was ist überhaupt Dialekt?

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".

So verwenden und erstellen Sie Ihren eigenen Dialekt

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>

Konfigurationsimplementierung auf Spring MVC

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.

Zusammenfassung

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 ...)

Referenz

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

Ich habe mit Thymeleaf meinen eigenen Dialekt erstellt und eingestellt und versucht, ihn zu verwenden
Ich habe versucht, mit OpenTrip Planner und GTFS eine eigene Übertragungsanleitung zu erstellen
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
[Android] Ich habe SQLite beendet und versucht, Realm zu verwenden
Ich habe auch Web Assembly mit Nim und C ausprobiert
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe versucht, YouTube-Video von DB mit haml aufzurufen und es eingebettet anzuzeigen
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Ich habe versucht, CSV mit Outsystems zu lesen und auszugeben
Ich habe MySQL 5.7 mit Docker-Compose gestartet und versucht, eine Verbindung herzustellen
Ich habe versucht, YOLO v4 unter Ubuntu und ROS zu verwenden
Ich habe versucht, Gson zu benutzen
Ich habe versucht, TestNG zu verwenden
Ich habe versucht, Galasa zu benutzen
Ich steckte in einer Falle fest, als ich meine eigenen Klassen equals und hashCode in Java mit IDE generierte
Ich habe einen Unit-Test der Rails-Anwendung mit RSpec und FactoryBot versucht
Ich habe meinen eigenen mit Ruby erstellten Blackjack für mein Portfolio aktualisiert
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Ich habe versucht, die Objektorientierung auf meine Weise zusammenzufassen.
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
[Spring Boot] Ich möchte meine eigene Eigenschaftendatei hinzufügen und den Wert mit env.getProperty () abrufen.
Als ich versuchte, meinen eigenen Dienst auszuführen, schlug dies fehl und ich schraubte ihn in den Taskplaner
Ich habe DI mit Ruby versucht
Ich habe versucht, Azure Cloud-Init zu verwenden
Ich habe versucht, Apache Wicket zu verwenden
Ich habe versucht, Java REPL zu verwenden
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe BIND mit Docker ausprobiert
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports 3/3 (Spring MVC-Steuerung) zu drucken.
Ich habe versucht, Docker und Maven / Netbean mit Jib gut zu integrieren
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
Ich habe versucht, mithilfe von Routing-Verschachtelung eine beliebige URL zu erstellen
Stellen Sie sich die Spring Boot-App mit dem Jib-Maven-Plugin vor und starten Sie sie mit Docker
Ich möchte eine Datei mit Ruby im Internet herunterladen und lokal speichern (mit Vorsicht).