[JAVA] Créez votre propre code de saut de ligne directement pour convertir en balise de saut de ligne avec Thymeleaf3

Abstrait

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.

environnement

Aperçu

Procédure détaillée

Implémentez la classe Proccessor (la classe qui décrit réellement l'opération)

Définition de classe

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 {
  ...
}

constructeur

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.

Méthode d'exécution du traitement

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.

  1. Récupérez l'instance ʻIModelFactory à partir de l'argument context`.
  2. Créez une instance ʻIModel à partir de l'instance ʻIModelFactory obtenue.
  3. Ajoutez les éléments (chaînes de caractères et balises) à refléter en HTML à l'instance ʻIModel créée dans l'ordre. L'instance à ajouter est également créée à partir de l'instance ʻIModelFactory.
  4. Appliquez l'instance ʻIModel à 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);

Implémenter la classe Dialect (une classe qui définit collectivement le Proccessor comme un direct)

Définition de classe

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 {
  ...
}

constructeur

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

Enregistrement 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;
  }

Set dans Bean

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

Résultat d'exécution

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

画面表示.png

Site de référence

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)

Recommended Posts

Créez votre propre code de saut de ligne directement pour convertir en balise de saut de ligne avec Thymeleaf3
Convertissez le code de saut de ligne en une balise de saut de ligne html avec Thymeleaf et sortie
Comment spécifier le code de caractère et le code de saut de ligne avec JAXB
Comment définir le code de caractère et le code de saut de ligne dans Eclipse
Comment créer votre propre annotation en Java et obtenir la valeur
Créez vos propres raccourcis avec Xcode pour éliminer les travaux d'installation compliqués des pods
Créez votre propre utilitaire avec Thymeleaf avec Spring Boot
Exemple de code pour convertir List en List <String> dans Java Stream
Comment lire votre propre fichier YAML (*****. Yml) en Java
[Forge] Comment enregistrer votre propre Entité et Entité Render dans 1.13.2
Reportez-vous à enum dans Thymeleaf
Créez vos propres annotations Java
Créez votre propre clavier QMK dans Docker. Volume unique à Windows
Comment créer votre propre contrôleur correspondant à / error avec Spring Boot