[JAVA] Erstellen Sie mit Thymeleaf3 Ihren eigenen Code zum direkten Konvertieren von Zeilenvorschubcode in Zeilenvorschub-Tag

Abstrakt

Selbst wenn Thymeleaf eine Zeichenfolge mit einem Zeilenvorschubcode ausgibt, wird nur die HTML-Quelle und nicht die Anzeige unterbrochen. Erstellen Sie Ihr eigenes Direct mit der Funktion, den Zeilenvorschubcode in ein Zeilenvorschub-Tag zu konvertieren und eine Zeichenfolge auszugeben, und verwenden Sie es als alternatives Verzeichnis für "th: text". Obwohl die Implementierung zwischen Thymeleaf 2 und 3 unterschiedlich ist, befasst sich dieses Papier mit Thymeleaf3.

Umgebung

Überblick

Detaillierte Vorgehensweise

Implementieren Sie die Proccessor-Klasse (die Klasse, die die Operation tatsächlich beschreibt).

Klassendefinition

Wählen Sie aus den von Thymeleaf bereitgestellten abstrakten Klassen vom Typ Proccessor eine aus, die dem entspricht, was Sie tun möchten, und erstellen Sie eine Klasse, die sie erbt. Dieses Mal werden wir etwas Ähnliches wie den Standarddialekt "th: text" erstellen, also werden wir den "AbstractStandardExpressionAttributeTagProcessor" erben.

public class BreakLineProccessor extends AbstractStandardExpressionAttributeTagProcessor {
  ...
}

Konstrukteur

Stellen Sie sicher, dass Sie einen Konstruktor erstellen und definieren, wie der Proccessor verwendet wird.

  private static final String ATTR_NAME = "brtext";

  public BreakLineProccessor(String dialectPrefix, int precedence) {
    super(TemplateMode.HTML, dialectPrefix, ATTR_NAME, precedence, true);
  }

Die Argumente des Konstruktors der Vererbungsquellenklasse "AbstractStandardExpressionAttributeTagProcessor" lauten wie folgt.

Variablennamen Klasse Rolle
1 templateMode TemplateMode(enum) Vorlagentyp(HTML etc.)
2 dialectPrefix String Direktes Präfix(Linke Seite des Dickdarms)
3 attrName String Attributname des Dialekts(Rechte Seite des Dickdarms)
4 precedence int Ausführungspriorität der Prozessorverarbeitung(Je kleiner der Wert, desto höher die Priorität)
5 removeAttribute boolean Gibt an, ob das direkte Attribut nach der Prozessorverarbeitung entfernt werden soll(Wenn dies zutrifft, entfernen Sie es)

Dieses Mal wurden nur das Präfix und die Priorität von außen empfangen, und der Rest waren feste Werte.

Ausführungsmethode verarbeiten

Beschreiben Sie den Prozess, indem Sie die abstrakte Methode "doProcess" überschreiben. Im Fall von "doProcess" von "AbstractStandardExpressionAttributeTagProcessor" wird das Ergebnis der Interpretation des EL-Ausdrucks im Argument "expressionResult" gespeichert, sodass dies für jeden Zeilenvorschubcode und jede Ausgabe geteilt werden kann, während das Zeilenvorschub-Tag eingeklemmt wird. Der Umriss des gesamten Prozesses ist wie folgt.

  1. Rufen Sie die IModelFactory-Instanz aus dem Argument "context" ab.
  2. Erstellen Sie eine IModel-Instanz aus der erworbenen IModelFactory-Instanz.
  3. Fügen Sie der erstellten IModel-Instanz der Reihe nach Elemente (Zeichenfolgen und Tags) hinzu, die in HTML wiedergegeben werden sollen. Die hinzuzufügende Instanz wird auch aus der IModelFactory-Instanz erstellt.
  4. Wenden Sie eine IModel-Instanz auf das Argument structHandler an.
  @Override
	protected void doProcess(ITemplateContext context, IProcessableElementTag tag, AttributeName attributeName,
			String attributeValue, Object expressionResult, IElementTagStructureHandler structureHandler) {
		//Wenn es null ist, wird nichts ausgegeben und der Prozess endet.
		if (expressionResult == null) return;

		IModelFactory factory = context.getModelFactory();
		IModel model = factory.createModel();

		ITemplateEvent brTag = factory.createOpenElementTag("br");

    //Aufteilen nach Zeilenvorschubcode
		String[] lines = expressionResult.toString().split("\r\n|\r|\n", -1);
		for (String line : lines) {
      // <br>+Fügen Sie dem Modell eine Zeichenfolge hinzu
			model.add(brTag);
			model.add(factory.createText(line));
		}
		//Am Anfang<br>Tag entfernen
		model.remove(0);

		structureHandler.setBody(model, false);

Implementieren Sie die Dialect-Klasse (eine Klasse, die den Proccessor gemeinsam als direkt definiert).

Klassendefinition

Erstellen Sie eine Klasse, die sie erbt (implementiert), indem Sie eine auswählen, die der direkten Verarbeitung entspricht, die aus der von Thymeleaf bereitgestellten abstrakten Klasse und Schnittstelle vom Typ Dialog erstellt wurde. Dieses Mal wird die abstrakte Klasse "AbstractProcessorDialect" vererbt, da dieser Prozess vom Prozessor implementiert wurde.

public class KurukuruzDialect extends AbstractProcessorDialect {
  ...
}

Konstrukteur

Stellen Sie sicher, dass Sie einen Konstruktor erstellen, um zu definieren, wie der Dialekt verwendet wird.

  private static final String NAME = "kurukuruz original dialect";
  private static final String PREFIX = "krz";

  public KurukuruzDialect() {
		  super(NAME, PREFIX, StandardDialect.PROCESSOR_PRECEDENCE);
	}

Die Argumente des Konstruktors der Vererbungsquellenklasse "AbstractProcessorDialect" lauten wie folgt.

Variablennamen Klasse Rolle
1 name String Der Name des Dialekts(?),Ich benutze es nicht besonders
2 prefix String Direktes Präfix,Es wird zu einem Argument der später beschriebenen Prozedur- oder Registrierungsmethode.
3 processorPrecedence int Nummer, mit der die Ausführung der Prozessorverarbeitung priorisiert wird

Prozessorregistrierung

In "getProcessors", einer abstrakten Methode von "AbstractProcessorDialect", werden die Instanzen jedes im Dialekt registrierten Prozedurs als Satz gesammelt und zurückgegeben.

  @Override
  public Set<IProcessor> getProcessors(String dialectPrefix) {
    Set<IProcessor> proccessors = new HashSet<>();

    proccessors.add(new BreakLineProccessor(dialectPrefix, getDialectProcessorPrecedence()));

    return proccessors;
  }

Set in Bean

Erstellen Sie eine Bean-Definitionsmethode wie unten gezeigt in einer geeigneten Klasse mit aktivierter Annotation "@ Bean" und registrieren Sie die Dialoginstanz.

 @Bean
 KurukuruzDialect kurukuruzDialect() {
   return new KurukuruzDialect();
 }

Ausführungsergebnis

<body>
<div krz:brtext="${text1}"></div>
<div krz:brtext="${text2}"></div>
<div krz:brtext="${text3}"></div>
<div krz:brtext="${text4}"></div>
<div krz:brtext="${text5}"></div>
</body>
model.addAttribute("text1", "Keine Zeilenumbrüche");
model.addAttribute("text2", "CRLF-Zeilenumbruch\r\n Ja\r\n\r\n ↑ 2 aufeinanderfolgende Zeilenumbrüche");
model.addAttribute("text3", "CR-Zeilenumbruch\mit r");
model.addAttribute("text4", "LF Zeilenumbruch\n Ja");
model.addAttribute("text5", null);

↓↓↓↓↓

<body>
<div>Keine Zeilenumbrüche</div>
<div>CRLF-Zeilenumbruch<br>Ja<br><br>↑ 2 aufeinanderfolgende Zeilenumbrüche</div>
<div>CR-Zeilenumbruch<br>Ja</div>
<div>LF Zeilenumbruch<br>Ja</div>
<div></div>
</body>

画面表示.png

Referenzseite

Thymeleaf konvertiert den Zeilenvorschubcode in ein HTML-Zeilenvorschub-Tag und gibt es aus - Qiita Machen Sie Ihren eigenen Dialog mit Thymeleaf3 - Qiita [Dialog mit thymeleaf3 implementieren --abcdefg .....](http: //pppurple.hatenablog.com/entry/2017/03/22/225114)

Recommended Posts

Erstellen Sie mit Thymeleaf3 Ihren eigenen Code zum direkten Konvertieren von Zeilenvorschubcode in Zeilenvorschub-Tag
Thymeleaf konvertiert den Zeilenvorschubcode in ein HTML-Zeilenvorschub-Tag und gibt ihn aus.
So legen Sie mit JAXB Zeichencode und Zeilenvorschubcode fest
So legen Sie den Zeichencode und den Zeilenvorschubcode in Eclipse fest
So erstellen Sie Ihre eigene Anmerkung in Java und erhalten den Wert
Erstellen Sie mit Xcode Ihre eigenen Verknüpfungen, um komplizierte Pod-Installationsarbeiten zu vermeiden
Erstellen Sie Ihr eigenes Dienstprogramm mit Thymeleaf mit Spring Boot
Beispielcode zum Konvertieren von List in List <String> in Java Stream
So lesen Sie Ihre eigene YAML-Datei (*****. Yml) in Java
[Forge] So registrieren Sie Ihre eigene Entität und Ihr Entity Render in 1.13.2
Siehe Aufzählung in Thymeleaf
Erstellen Sie Ihre eigenen Java-Anmerkungen
Erstellen Sie in Docker Ihre eigene Tastatur-QMK. Für Windows einzigartiges Volume
So erstellen Sie mit Spring Boot einen eigenen Controller, der / error entspricht