Supprimer les espaces de la sortie jsp


110

Comment puis-je supprimer les espaces supplémentaires de la sortie des pages jsp? Y a-t-il un commutateur que je peux activer sur mon web.xml? Existe-t-il un paramètre spécifique à Tomcat?

Réponses:


172

Il existe une directive trimWhiteSpaces qui devrait accomplir cela,

Dans votre JSP:

<%@ page trimDirectiveWhitespaces="true" %>

Ou dans la section jsp-config votre web.xml (notez que cela fonctionne à partir de la spécification de 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>

Malheureusement, si vous avez un espace requis, il peut également avoir besoin de la bande, vous pouvez donc avoir besoin d'un espace insécable à certains endroits.


2
Y a-t-il une différence en termes de performances entre ces deux options?
jlb

Le trimDirectiveWhitespaces n'est pris en charge que par les conteneurs de servlet qui prennent en charge JSP 2.1 et après, ou dans le cas de Tomcat, Tomcat 6 (et certaines versions, par exemple Tomcat 6.0.10, ne l'implémentent pas correctement - je ne sais pas pour les autres), il y a plus d'informations sur trimDirectiveWhitespaces ici: java.sun.com/developer/technicalArticles/J2EE/jsp_21 et ici raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree

3
Et dans les fichiers .tag personnalisés JSP, utilisez <% @ 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

J'utilise Tomcat 8 et cela ne semble pas fonctionner. Cela fonctionne-t-il pour quelqu'un?
glez

27

Si votre servletcontainer ne prend pas en charge la trimDirectiveWhitespacespropriété JSP 2.1 , vous devez consulter sa JspServletdocumentation pour tous les paramètres d'initialisation. Dans Tomcat , par exemple , vous pouvez également le configurer en définissant trimSpacesinit-param sur truein for JspServletdans Tomcat's /conf/web.xml:

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

Une alternative complètement différente est le JTidyFilter . Il supprime non seulement les espaces, mais il met également en forme le HTML dans une indentation correcte.


J'ai configuré en définissant trimSpaces init-param sur true dans /conf/web.xml mais les espaces dans le html généré ne sont pas coupés. J'utilise Tomcat 6.0. Des idées?
ria

7
@ria: Notez que vous devez comprendre que cela ne supprime que les espaces laissés par les taglibs comme JSTL et les scriptlets. Si vous souhaitez supprimer TOUS les espaces à partir du HTML, optez pour une solution différente. Vous pouvez trouver un exemple de filtre ici: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC

Je viens de remarquer quelques accrocs avec le code de l'article, car des choses sur mon site ont commencé à apparaître incorrectement. J'ai copié la source html et l'ai collée dans le validateur w3 pour découvrir que le filtre d'espaces concaténait parfois des attributs. Par exemple ceci ... <div onclick = "correct ()" class = "correct"> se transformerait en ce <div onclick = "false" class = "false">. Ou ce <a class="correct"> dans ce <aclass = "faux">. Ainsi, en perdant l'espace blanc, la balise de fermeture de l'élément devient invalide. Des conseils à ce sujet?
gmustudent

4

Le trimDirectiveWhitespaces n'est pris en charge que par les conteneurs de servlet qui prennent en charge JSP 2.1 et ultérieur, ou dans le cas de Tomcat, Tomcat 6 (et certaines versions, par exemple Tomcat 6.0.10, ne l'implémentent pas correctement - je ne connais pas les autres). Il y a plus d'informations sur trimDirectiveWhitespaces ici:

http://www.oracle.com/technetwork/articles/javaee/jsp-21-136414.html

et ici

http://raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1


3

Pas directement ce que vous demandez, mais ce qui m'aide, c'est de mettre intelligemment les balises de commentaire HTML autour de mes balises jsp, et également de mettre des espaces dans une balise 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 vous utilisez des tags, vous pouvez également y postuler:

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

Et sur votre jsp:

<%@ page trimDirectiveWhitespaces="true" %>

1

Vous pouvez aller plus loin et supprimer les nouvelles lignes (retours chariot) entre les balises html au moment de la construction.

Par exemple, changer:

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

dans:

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

Faites cela, utilisez le maven-replacer-pluginet configurez-le dans 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>

Cela ne modifiera que les JSP du répertoire de construction et ne touchera pas les JSP de vos sources.

Vous devrez peut-être adapter le chemin ( <filesToInclude>) où se trouvent vos JSP.




0

Juste un peu en dehors de la question réelle, si vous voulez vous débarrasser des lignes vides causées par tout ce que vous avez fait avant la sortie, vous pouvez utiliser

out.clearBuffer();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.