Saltar al contenido

Thymeleaf + Spring: ¿Cómo mantener el salto de línea?

Ya no busques más por otras webs porque has llegado al espacio adecuado, contamos con la solución que buscas y sin complicarte.

Solución:

Dos de tus opciones:

  1. Use th: utext: opción de configuración fácil, pero más difícil de leer y recordar
  2. Cree un procesador y un dialecto personalizados: una configuración más complicada, pero un uso futuro más fácil y legible.

Opción 1:

Puede usar th: utext si escapa del texto usando el método de utilidad de expresión #strings.escapeXml( text ) para evitar la inyección de XSS y el formateo no deseado: http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#strings

Para que esta plataforma sea independiente, puede utilizar T(java.lang.System).getProperty('line.separator') para agarrar el separador de línea.

Usando las utilidades de expresión Thymeleaf existentes, esto funciona:

Opcion 2:

La API para esto ahora es diferente en 3 (escribí este tutorial para 2.1)
Con suerte, puede combinar la siguiente lógica con su tutorial oficial. Tal vez algún día tenga un minuto para actualizar esto por completo. Pero por ahora: aquí está el tutorial oficial de Thymeleaf para crear su propio dialecto.

Una vez que se completa la configuración, todo lo que necesita hacer para lograr la salida de línea de texto de escape con saltos de línea conservados:

La pieza principal que hace el trabajo es el procesador. El siguiente código hará el truco:

package com.foo.bar.thymeleaf.processors 

import java.util.Collections;
import java.util.List;

import org.thymeleaf.Arguments;
import org.thymeleaf.Configuration;
import org.thymeleaf.dom.Element;
import org.thymeleaf.dom.Node;
import org.thymeleaf.dom.Text;
import org.thymeleaf.processor.attr.AbstractChildrenModifierAttrProcessor;
import org.thymeleaf.standard.expression.IStandardExpression;
import org.thymeleaf.standard.expression.IStandardExpressionParser;
import org.thymeleaf.standard.expression.StandardExpressions;
import org.unbescape.html.HtmlEscape;

public class HtmlEscapedWithLineSeparatorsProcessor extends
        AbstractChildrenModifierAttrProcessor

    public HtmlEscapedWithLineSeparatorsProcessor()
        //only executes this processor for the attribute 'lstext'
        super("lstext");
    

    protected String getText( final Arguments arguments, final Element element,
            final String attributeName) 

        final Configuration configuration = arguments.getConfiguration();

        final IStandardExpressionParser parser =
            StandardExpressions.getExpressionParser(configuration);

        final String attributeValue = element.getAttributeValue(attributeName);

        final IStandardExpression expression =
            parser.parseExpression(configuration, arguments, attributeValue);

        final String value = (String) expression.execute(configuration, arguments);

        //return the escaped text with the line separator replaced with 
return HtmlEscape.escapeHtml4Xml( value ).replace( System.getProperty("line.separator"), "
" ); @Override protected final List getModifiedChildren( final Arguments arguments, final Element element, final String attributeName) final String text = getText(arguments, element, attributeName); //Create new text node signifying that content is already escaped. final Text newNode = new Text(text == null? "" : text, null, null, true); // Setting this allows avoiding text inliners processing already generated text, // which in turn avoids code injection. newNode.setProcessable( false ); return Collections.singletonList((Node)newNode); @Override public int getPrecedence() // A value of 10000 is higher than any attribute in the SpringStandard dialect. So this attribute will execute after all other attributes from that dialect, if in the same tag. return 11400;

Ahora que tiene el procesador, necesita un dialecto personalizado para agregar el procesador.

package com.foo.bar.thymeleaf.dialects;

import java.util.HashSet;
import java.util.Set;

import org.thymeleaf.dialect.AbstractDialect;
import org.thymeleaf.processor.IProcessor;

import com.foo.bar.thymeleaf.processors.HtmlEscapedWithLineSeparatorsProcessor;

public class FooDialect extends AbstractDialect

    public FooDialect()
        super();
    

    //This is what all the dialect's attributes/tags will start with. So like.. fd:lstext="Hi David!
This is so much easier..." public String getPrefix() return "fd"; //The processors. @Override public Set getProcessors() final Set processors = new HashSet(); processors.add( new HtmlEscapedWithLineSeparatorsProcessor() ); return processors;

Ahora debe agregarlo a su configuración xml o java:

Si está escribiendo una aplicación Spring MVC, solo tiene que establecerla en la propiedad additionalDialects del bean Template Engine, para que se agregue al dialecto SpringStandard predeterminado:

    
  
  
    
      
    
  
    

O si está usando Spring y prefiere usar JavaConfig, puede crear una clase anotada con @Configuration en su paquete base que contiene el dialecto como un bean administrado:

package com.foo.bar;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.foo.bar.thymeleaf.dialects.FooDialect;

@Configuration
public class TemplatingConfig 

    @Bean
    public FooDialect fooDialect()
        return new FooDialect();
    

Aquí hay algunas referencias adicionales sobre la creación de dialectos y procesadores personalizados: http://www.thymeleaf.org/doc/articles/sayhelloextendingthymeleaf5minutes.html, http://www.thymeleaf.org/doc/articles/sayhelloagainextendingthymeleafevenmore5minutes.html y http: //www.thymeleaf.org/doc/tutorials/2.1/extendingthymeleaf.html

Tal vez no sea lo que el OP tenía en mente, pero esto funciona y evita la inyección de código:

(Utilizando Thymeleaf al estilo HTML5).

En mi caso escapeJava() devuelve valores unicode para símbolos cirílicos, así que envuelvo todo en unescapeJava() El método ayuda a resolver mi problema.

Sección de Reseñas y Valoraciones

Al final de todo puedes encontrar las aclaraciones de otros gestores de proyectos, tú asimismo tienes el poder insertar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *