Même si Thymeleaf génère une chaîne de caractères comprenant un code de saut de ligne, il ne fait que se briser dans la source HTML et ne se brise pas à l'écran.
Créez votre propre direct avec la fonction de conversion du code de saut de ligne en une balise de saut de ligne et de sortie d'une chaîne de caractères, et utilisez-le comme répertoire alternatif pour th: text
.
Bien que l'implémentation soit différente entre Thymeleaf 2 et 3, cet article traite de Thymeleaf3.
Dans les classes abstraites de type Proccessor fournies par Thymeleaf, sélectionnez-en une qui est proche de ce que vous voulez faire et créez une classe qui en hérite.
Cette fois, nous allons créer quelque chose de similaire au dialecte standard th: text
, donc nous hériterons de ʻAbstractStandardExpressionAttributeTagProcessor`.
public class BreakLineProccessor extends AbstractStandardExpressionAttributeTagProcessor {
...
}
Assurez-vous de créer un constructeur et de définir comment le Proccessor sera utilisé.
private static final String ATTR_NAME = "brtext";
public BreakLineProccessor(String dialectPrefix, int precedence) {
super(TemplateMode.HTML, dialectPrefix, ATTR_NAME, precedence, true);
}
Les arguments du constructeur de la classe source d'héritage ʻAbstractStandardExpressionAttributeTagProcessor` sont les suivants.
Nom de variable | classe | rôle | |
---|---|---|---|
1 | templateMode | TemplateMode(enum) | Type de modèle(HTML, etc.) |
2 | dialectPrefix | String | Préfixe direct(Côté gauche du côlon) |
3 | attrName | String | Nom d'attribut du dialecte(Côté droit du côlon) |
4 | precedence | int | Priorité d'exécution du traitement du processeur(Plus la valeur est petite, plus la priorité est élevée) |
5 | removeAttribute | boolean | S'il faut supprimer l'attribut direct après le traitement du processeur(Si vrai, supprimez) |
Cette fois, seuls le préfixe et la priorité ont été reçus de l'extérieur, et le reste était des valeurs fixes.
Décrivez le processus en remplaçant la méthode abstraite «doProcess».
Dans le cas de doProcess
de ʻAbstractStandardExpressionAttributeTagProcessor, le résultat de l'interprétation de l'expression EL est stocké dans l'argument ʻexpressionResult
, donc il doit être divisé pour chaque code de saut de ligne et sortie tout en prenant en sandwich la balise de saut de ligne.
Les grandes lignes de l'ensemble du processus sont les suivantes.
à partir de l'argument
context`. à partir de l'instance ʻIModelFactory
obtenue. créée dans l'ordre. L'instance à ajouter est également créée à partir de l'instance ʻIModelFactory
. à l'argument
structureHandler`. @Override
protected void doProcess(ITemplateContext context, IProcessableElementTag tag, AttributeName attributeName,
String attributeValue, Object expressionResult, IElementTagStructureHandler structureHandler) {
//S'il est nul, rien n'est sorti et le processus se termine.
if (expressionResult == null) return;
IModelFactory factory = context.getModelFactory();
IModel model = factory.createModel();
ITemplateEvent brTag = factory.createOpenElementTag("br");
//Diviser par code de saut de ligne
String[] lines = expressionResult.toString().split("\r\n|\r|\n", -1);
for (String line : lines) {
// <br>+Ajouter une ligne de chaîne au modèle
model.add(brTag);
model.add(factory.createText(line));
}
//Au début<br>Enlever l'étiquette
model.remove(0);
structureHandler.setBody(model, false);
Créez une classe qui en hérite (implémente) en sélectionnant une qui correspond au traitement direct créé à partir de la classe abstraite de type Dialog et de l'interface fournie par Thymeleaf. Puisque ce processus a été implémenté par Proccessor cette fois, il hérite de la classe abstraite ʻAbstractProcessorDialect`.
public class KurukuruzDialect extends AbstractProcessorDialect {
...
}
Assurez-vous de créer un constructeur pour définir comment le dialecte sera utilisé.
private static final String NAME = "kurukuruz original dialect";
private static final String PREFIX = "krz";
public KurukuruzDialect() {
super(NAME, PREFIX, StandardDialect.PROCESSOR_PRECEDENCE);
}
Les arguments du constructeur de la classe source d'héritage ʻAbstractProcessorDialect` sont les suivants.
Nom de variable | classe | rôle | |
---|---|---|---|
1 | name | String | Le nom du dialecte(?),Je ne l'utilise pas en particulier |
2 | prefix | String | Préfixe direct,Cela devient un argument de la méthode d'enregistrement Proccessor décrite plus loin. |
3 | processorPrecedence | int | Numéro utilisé pour prioriser l'exécution du traitement du processeur |
ʻL'instance de chaque Procedureor enregistré dans le dialecte dans getProcessors
, qui est la méthode abstraite de AbstractProcessorDialect`, est collectée comme un ensemble et renvoyée.
@Override
public Set<IProcessor> getProcessors(String dialectPrefix) {
Set<IProcessor> proccessors = new HashSet<>();
proccessors.add(new BreakLineProccessor(dialectPrefix, getDialectProcessorPrecedence()));
return proccessors;
}
Créez une méthode de définition de Bean comme indiqué ci-dessous dans une classe appropriée avec l'annotation @ Bean
activée et enregistrez l'instance Dialog.
@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", "Aucun saut de ligne");
model.addAttribute("text2", "Saut de ligne CRLF\r\n Oui\r\n\r\n ↑ 2 sauts de ligne consécutifs");
model.addAttribute("text3", "Saut de ligne CR\avec r");
model.addAttribute("text4", "Saut de ligne LF\n Oui");
model.addAttribute("text5", null);
↓↓↓↓↓
<body>
<div>Aucun saut de ligne</div>
<div>Saut de ligne CRLF<br>Oui<br><br>↑ 2 sauts de ligne consécutifs</div>
<div>Saut de ligne CR<br>Oui</div>
<div>Saut de ligne LF<br>Oui</div>
<div></div>
</body>
Thymeleaf convertit le code de saut de ligne en une balise de saut de ligne html et le renvoie --Qiita Créez votre propre dialogue avec Thymeleaf3 --Qiita [Implémenter la boîte de dialogue avec thymeleaf3 --abcdefg .....](http: //pppurple.hatenablog.com/entry/2017/03/22/225114)