Leerzeichen von der JSP-Ausgabe entfernen

110

Wie kann ich zusätzliche Leerzeichen aus der Ausgabe von JSP-Seiten entfernen? Gibt es einen Schalter, den ich auf meiner web.xml umlegen kann? Gibt es eine Tomcat-spezifische Einstellung?

Seth Weiner
quelle

Antworten:

172

Es gibt eine trimWhiteSpaces-Direktive, die dies erreichen soll.

In Ihrer JSP:

<%@ page trimDirectiveWhitespaces="true" %>

Oder im Abschnitt jsp-config Ihre web.xml (Beachten Sie, dass dies ab Servlet-Spezifikation 2.5 funktioniert.):

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

Wenn Sie einen erforderlichen Platz haben, muss dieser möglicherweise auch entfernt werden, sodass Sie an einigen Stellen möglicherweise einen nicht unterbrechenden Platz benötigen.

Rontologe
quelle
2
Gibt es einen Leistungsunterschied zwischen diesen beiden Optionen?
jlb
TrimDirectiveWhitespaces wird nur von Servlet-Containern unterstützt, die JSP 2.1 und höher unterstützen, oder im Fall von Tomcat Tomcat 6 (und einige Versionen, z. B. Tomcat 6.0.10, implementieren es nicht richtig - kennen die anderen nicht) Weitere Informationen zu trimDirectiveWhitespaces finden Sie hier: java.sun.com/developer/technicalArticles/J2EE/jsp_21 und hier raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree
3
Verwenden Sie in benutzerdefinierten JSP-Tag-Dateien <% @ 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
Ich verwende Tomcat 8 und dies scheint nicht zu funktionieren. Funktioniert es für jemanden?
Glez
27

Wenn Ihr Servletcontainer die JSP 2.1- trimDirectiveWhitespacesEigenschaft nicht unterstützt , müssen Sie in der JspServletDokumentation nach Initialisierungsparametern suchen. In beispielsweise Tomcat können Sie es auch konfigurieren, indem Sie trimSpacesinit-param in Tomcat auf truein for setzen :JspServlet/conf/web.xml

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

Eine ganz andere Alternative ist der JTidyFilter . Es schneidet nicht nur Leerzeichen ab, sondern formatiert auch HTML in einem korrekten Einzug.

BalusC
quelle
Ich habe konfiguriert, indem trimSpaces init-param in /conf/web.xml auf true gesetzt wurde, aber die Leerzeichen im generierten HTML werden nicht gekürzt. Ich benutze Tomcat 6.0. Irgendwelche Ideen?
Ria
7
@ria: Beachten Sie, dass Sie verstehen müssen, dass dadurch nur Leerzeichen von Taglibs wie JSTL und Scriptlets abgeschnitten werden. Wenn Sie ALLE Leerzeichen aus HTML entfernen möchten, wählen Sie eine andere Lösung. Ein Filterbeispiel finden Sie hier: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC
Ich habe gerade bemerkt, dass ein paar Fehler mit dem Code aus dem Artikel b / c auf meiner Website falsch angezeigt wurden. Ich habe die HTML-Quelle kopiert und in den w3-Validator eingefügt, um herauszufinden, dass der Whitespace-Filter gelegentlich Attribute verkettet. Zum Beispiel würde dies ... <div onclick = "korrekt ()" class = "korrekt"> zu diesem <div onclick = "falsch" class = "falsch"> werden. Oder diese <a class="correct"> in diese <aclass = "false">. Durch den Verlust des Leerzeichens wird das Close-Tag für das Element ungültig. Irgendwelche Tipps dazu?
gmustudent
3

Nicht direkt, wonach Sie fragen, aber was mir hilft, ist, HTML-Kommentar-Tags auf clevere Weise um meine JSP-Tags zu platzieren und Leerzeichen in ein Servlet-Tag einzufügen (<%%>):

${"<!--"}
<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>
duftend
quelle
3

Wenn Sie Tags verwenden, können Sie sich auch dort bewerben:

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

Und auf Ihrem jsp:

<%@ page trimDirectiveWhitespaces="true" %>
Andres
quelle
1

Sie können noch einen Schritt weiter gehen und zum Zeitpunkt der Erstellung auch Zeilenumbrüche (Zeilenumbrüche) zwischen den HTML-Tags entfernen.

ZB ändern:

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

in:

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

Tun Sie das, verwenden Sie das maven-replacer-pluginund richten Sie es ein 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>

Dadurch werden nur die JSPs im Build-Verzeichnis geändert und nicht die JSPs in Ihren Quellen.

Möglicherweise müssen Sie den Pfad ( <filesToInclude>) anpassen, in dem sich Ihre JSPs befinden.

yglodt
quelle
1

Bitte verwenden Sie beispielsweise die Trimmfunktion

fn:trim(string1)
Jorge Santos Neill
quelle
0

Nur ein bisschen von der eigentlichen Frage entfernt: Wenn Sie die leeren Zeilen entfernen möchten, die durch alles verursacht wurden, was Sie vor der Ausgabe getan haben, können Sie verwenden

out.clearBuffer();
Ghostff
quelle