Elimina gli spazi vuoti dall'output jsp


110

Come posso eliminare gli spazi bianchi extra dall'output delle pagine jsp? C'è un interruttore che posso attivare sul mio web.xml? Esiste un'impostazione specifica per Tomcat?

Risposte:


172

Esiste una direttiva trimWhiteSpaces che dovrebbe eseguire questa operazione,

Nel tuo JSP:

<%@ page trimDirectiveWhitespaces="true" %>

O nella sezione jsp-config il tuo web.xml (nota che funziona a partire dalla specifica del servlet 2.5.):

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

Sfortunatamente, se hai uno spazio richiesto, potrebbe anche essere necessario rimuoverlo, quindi potresti aver bisogno di uno spazio unificatore in alcune posizioni.


2
C'è una differenza in termini di prestazioni tra queste due opzioni?
jlb

TrimDirectiveWhitespaces è supportato solo dai contenitori servlet che supportano JSP 2.1 e successivi, o nel caso o Tomcat, Tomcat 6 (e alcune versioni ad esempio Tomcat 6.0.10 non lo implementano correttamente - non so degli altri), c'è maggiori informazioni su trimDirectiveWhitespaces qui: java.sun.com/developer/technicalArticles/J2EE/jsp_21 e qui raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree

3
E nei file .tag personalizzati JSP, utilizza <% @ 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

Sto eseguendo Tomcat 8 e questo non sembra funzionare. Funziona per chiunque?
glez

27

Se il tuo servletcontainer non supporta la trimDirectiveWhitespacesproprietà JSP 2.1 , devi consultare la sua JspServletdocumentazione per eventuali parametri di inizializzazione. In Tomcat , ad esempio , puoi configurarlo anche impostando trimSpacesinit-param su truein for JspServletin Tomcat /conf/web.xml:

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

Un'alternativa completamente diversa è JTidyFilter . Non solo taglia gli spazi bianchi, ma formatta anche l' HTML con un rientro corretto.


Ho configurato impostando trimSpaces init-param su true in /conf/web.xml ma gli spazi nell'html generato non vengono tagliati. Sto usando Tomcat 6.0. Qualche idea?
ria

7
@ria: Nota che devi capire che questo taglia solo gli spazi bianchi lasciati da taglib come JSTL e scriptlet. Se vuoi tagliare TUTTI gli spazi bianchi dall'HTML, scegli una soluzione diversa. Puoi trovare un esempio di filtro qui: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC

Ho appena notato un paio di intoppi con il codice dell'articolo b / c le cose sul mio sito hanno iniziato a essere visualizzate in modo sbagliato. Ho copiato il sorgente html e l'ho incollato nel validatore w3 per scoprire che il filtro dello spazio bianco concatena occasionalmente attributi. Ad esempio, questo ... <div onclick = "correct ()" class = "correct"> si trasformerebbe in questo <div onclick = "wrong" class = "wrong">. O questo <a class="correct"> in questo <aclass = "wrong">. Quindi perdendo lo spazio bianco il tag di chiusura per l'elemento diventa non valido. Qualche consiglio su questo?
gmustudent


3

Non direttamente quello che stai chiedendo, ma ciò che mi aiuta è inserire tag di commento HTML in modo intelligente attorno ai miei tag jsp e anche inserire spazi bianchi all'interno di un tag 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

Se stai utilizzando i tag, puoi applicarli anche lì:

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

E sul tuo jsp:

<%@ page trimDirectiveWhitespaces="true" %>

1

Puoi fare un ulteriore passo avanti e anche rimuovere le nuove righe (ritorni a capo) tra i tag html in fase di compilazione.

Ad esempio, modifica:

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

in:

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

Fallo, usa il maven-replacer-plugine configuralo in 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>

Questo modificherà solo i JSP nella directory build e non toccherà i JSP nei sorgenti.

Potrebbe essere necessario adattare il percorso ( <filesToInclude>) in cui si trovano i JSP.




0

Solo un po 'fuori dalla domanda reale, se vuoi sbarazzarti delle righe vuote causate da qualsiasi cosa tu abbia fatto prima dell'output, puoi usare

out.clearBuffer();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.