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.
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 {
...
}
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.
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.
@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);
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 {
...
}
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 |
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;
}
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();
}
<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>
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