Usuń białe znaki z wyjścia jsp

110

Jak mogę usunąć dodatkowe białe znaki z danych wyjściowych stron jsp? Czy istnieje przełącznik, który mogę włączyć w moim pliku web.xml? Czy istnieje specyficzne ustawienie Tomcat?

Seth Weiner
źródło

Odpowiedzi:

172

Istnieje dyrektywa trimWhiteSpaces, która powinna to zrobić,

W Twoim JSP:

<%@ page trimDirectiveWhitespaces="true" %>

Lub w sekcji jsp-config plik web.xml (zauważ, że działa to począwszy od specyfikacji serwletu 2.5.):

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

Niestety, jeśli masz wymaganą przestrzeń, może to również wymagać rozebrania, więc w niektórych lokalizacjach możesz potrzebować niezłamanej przestrzeni.

Rontolog
źródło
2
Czy istnieje różnica w wydajności między tymi dwiema opcjami?
jlb
TrimDirectiveWhitespaces jest obsługiwany tylko przez kontenery serwletów, które obsługują JSP 2.1 i późniejsze, lub w przypadku Tomcat, Tomcat 6 (i niektóre wersje, np. Tomcat 6.0.10, nie implementują go poprawnie - nie wiem o innych). więcej informacji o trimDirectiveWhitespaces tutaj: java.sun.com/developer/technicalArticles/J2EE/jsp_21 i tutaj raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree
3
W niestandardowych plikach .tag JSP użyj tagu <% @ 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
Używam Tomcat 8 i wygląda na to, że nie działa. Czy to działa dla kogoś?
glez
27

Jeśli twój servletcontainer nie obsługuje właściwości JSP 2.1 trimDirectiveWhitespaces, to musisz zapoznać się z jego JspServletdokumentacją, aby znaleźć parametry inicjalizacji. Na przykład Tomcat , możesz go również skonfigurować, ustawiając trimSpacesinit-param na truein for JspServletw Tomcat's /conf/web.xml:

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

Zupełnie inną alternatywą jest JTidyFilter . Nie tylko przycina białe znaki, ale także formatuje HTML w odpowiednim wcięciu.

BalusC
źródło
Skonfigurowałem, ustawiając trimSpaces init-param na true w /conf/web.xml, ale spacje w wygenerowanym html nie są przycinane. Używam Tomcat 6.0. Jakieś pomysły?
ria
7
@ria: Zauważ, że musisz zrozumieć, że to usuwa tylko białe znaki pozostawione przez taglibs, takie jak JSTL i skryptlety. Jeśli chcesz wyciąć WSZYSTKIE białe znaki z HTML, przejdź do innego rozwiązania. Przykład filtru można znaleźć tutaj: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC
Właśnie zauważyłem kilka problemów z kodem z artykułu b / c rzeczy na mojej stronie zaczęły pojawiać się nieprawidłowo. Skopiowałem źródło html i wkleiłem je do walidatora w3, aby dowiedzieć się, że filtr białych znaków czasami łączy atrybuty. Na przykład to ... <div onclick = "correct ()" class = "correct"> zamieniłoby się w to <div onclick = "evil" class = "evil">. Albo to <a class="correct"> do tego <aclass = "źle">. Tak więc utrata białych znaków powoduje, że znacznik zamykający elementu staje się nieprawidłowy. Jakieś wskazówki na ten temat?
gmustudent
3

Nie bezpośrednio to, o co prosisz, ale pomaga mi umieszczanie znaczników komentarzy HTML w sprytny sposób wokół moich tagów jsp, a także umieszczanie spacji wewnątrz tagu serwletu (<%%>):

${"<!--"}
<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>
wonny
źródło
3

Jeśli używasz tagów, możesz je tam zastosować:

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

A na twoim jsp:

<%@ page trimDirectiveWhitespaces="true" %>
Andres
źródło
1

Możesz pójść o krok dalej, a także usunąć znaki nowej linii (powrót karetki) między tagami HTML w czasie kompilacji.

Np. Zmiana:

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

w:

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

Zrób to, użyj maven-replacer-plugini skonfiguruj w 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>

Spowoduje to jedynie zmodyfikowanie stron JSP w katalogu kompilacji i nie wpłynie na strony JSP w źródłach.

Może być konieczne dostosowanie ścieżki ( <filesToInclude>), w której znajdują się strony JSP.

yglodt
źródło
1

Proszę skorzystać z funkcji przycinania, na przykład

fn:trim(string1)
Jorge Santos Neill
źródło
0

Trochę odbiegające od rzeczywistego pytania, jeśli chcesz pozbyć się pustych wierszy spowodowanych tym, co zrobiłeś przed wydrukowaniem, możesz użyć

out.clearBuffer();
Ghostff
źródło