Eliminar el espacio en blanco de la salida jsp


110

¿Cómo puedo eliminar los espacios en blanco adicionales de la salida de las páginas jsp? ¿Hay algún interruptor que pueda activar en mi web.xml? ¿Existe una configuración específica de Tomcat?

Respuestas:


172

Hay una directiva trimWhiteSpaces que debería lograr esto,

En su JSP:

<%@ page trimDirectiveWhitespaces="true" %>

O en la sección jsp-config su web.xml (tenga en cuenta que esto funciona a partir de la especificación 2.5 del servlet):

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <trim-directive-whitespaces>true</trim-directive-whitespaces>
  </jsp-property-group>
</jsp-config>

Desafortunadamente, si tiene un espacio requerido, es posible que también necesite quitarlo, por lo que es posible que necesite un espacio que no se rompa en algunos lugares.


2
¿Existe alguna diferencia en términos de rendimiento entre estas dos opciones?
jlb

TrimDirectiveWhitespaces solo es compatible con contenedores de servlets que admiten JSP 2.1 y posteriores, o en el caso de Tomcat, Tomcat 6 (y algunas versiones, por ejemplo, Tomcat 6.0.10 no lo implementan correctamente, no sé sobre los demás), hay más información sobre trimDirectiveWhitespaces aquí: java.sun.com/developer/technicalArticles/J2EE/jsp_21 y aquí raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree

3
Y en archivos JSP personalizados .tag, use <% @ tag body-content = "scriptless" trimDirectiveWhitespaces = "true"%>.
Thomas W

Tomcat 7 web.xml: <init-param> <param-name> trimSpaces </param-name> <param-value> true </param-value> </init-param>
Ujjwal Singh

Estoy ejecutando Tomcat 8 y esto no parece funcionar. ¿Funciona para alguien?
glez

27

Si su servletcontainer no admite la trimDirectiveWhitespacespropiedad JSP 2.1 , debe consultar su JspServletdocumentación para conocer los parámetros de inicialización. En, por ejemplo , Tomcat , también puede configurarlo estableciendo trimSpacesinit-param en truein for JspServleten Tomcat /conf/web.xml:

<init-param>
    <param-name>trimSpaces</param-name>
    <param-value>true</param-value>
</init-param>

Una alternativa completamente diferente es JTidyFilter . No solo recorta los espacios en blanco, sino que también formatea HTML con una sangría correcta.


Lo configuré estableciendo trimSpaces init-param en verdadero en /conf/web.xml pero los espacios en el html generado no se recortan. Estoy usando Tomcat 6.0. ¿Algunas ideas?
ria

7
@ria: tenga en cuenta que debe comprender que esto solo recorta el espacio en blanco dejado por taglibs como JSTL y scriptlets. Si desea recortar TODOS los espacios en blanco de HTML, busque una solución diferente. Puede encontrar un ejemplo de filtro aquí: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC

Acabo de notar un par de inconvenientes con el código del artículo porque las cosas en mi sitio comenzaron a aparecer mal. Copié la fuente html y la pegué en el validador de w3 para descubrir que el filtro de espacios en blanco ocasionalmente concatena atributos. Por ejemplo, esto ... <div onclick = "correct ()" class = "correct"> se convertiría en esta <div onclick = "wrong" class = "wrong">. O esta <a class="correct"> en esta <aclass = "wrong">. Entonces, al perder el espacio en blanco, la etiqueta de cierre del elemento se vuelve inválida. ¿Algún consejo sobre esto?
gmustudent


3

No es directamente lo que está pidiendo, pero lo que me ayuda es poner etiquetas de comentarios HTML de una manera inteligente alrededor de mis etiquetas jsp, y también poner espacios en blanco dentro de una etiqueta de servlet (<%%>):

${"<!--"}
<c:if test="${first}">
    <c:set var="extraClass" value="${extraClass} firstRadio"/>
</c:if>
<c:set var="first" value="${false}"/>
${"-->"}<%

%><input type="radio" id="input1" name="dayChooser" value="Tuesday"/><%
%><label for="input1" class="${extraClass}">Tuesday</label>

3

Si está utilizando etiquetas, también puede aplicar allí:

<%@ tag description="My Tag" trimDirectiveWhitespaces="true" %>

Y en tu jsp:

<%@ page trimDirectiveWhitespaces="true" %>

1

Puede ir un paso más allá y también eliminar nuevas líneas (retornos de carro) entre las etiquetas html en el momento de la compilación.

Por ejemplo, cambio:

<p>Hello</p>
<p>How are you?</p>

dentro:

<p>Hello</p><p>How are you?</p>

Haz eso, usa maven-replacer-pluginy configúralo en pom.xml:

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
        <execution>
            <id>stripNewlines</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>replace</goal>
            </goals>
            <configuration>
                <basedir>${project.build.directory}</basedir>
                <filesToInclude>projectname/WEB-INF/jsp/**/*.jsp</filesToInclude>
                <token>&gt;\s*&lt;</token>
                <value>&gt;&lt;</value>
                <regexFlags>
                    <regexFlag>MULTILINE</regexFlag>
                </regexFlags>
            </configuration>
        </execution>
    </executions>
</plugin>

Esto solo modificará las JSP en el directorio de compilación y no tocará las JSP en sus fuentes.

Es posible que deba adaptar la ruta ( <filesToInclude>) donde se encuentran sus JSP.




0

Solo un poco fuera de la pregunta real, si desea deshacerse de las líneas vacías causadas por lo que hizo antes de la salida, puede usar

out.clearBuffer();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.