Retirar os espaços em branco da saída jsp

110

Como posso remover espaços em branco extras da saída das páginas jsp? Existe uma opção que posso ativar no meu web.xml? Existe uma configuração específica do Tomcat?

Seth Weiner
fonte

Respostas:

172

Há uma diretiva trimWhiteSpaces que deve fazer isso,

Em seu JSP:

<%@ page trimDirectiveWhitespaces="true" %>

Ou na seção jsp-config seu web.xml (observe que isso funciona a partir da especificação 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>

Infelizmente, se você tiver um espaço necessário, também pode ser necessário removê-lo, portanto, pode ser necessário um espaço ininterrupto em alguns locais.

Rontologista
fonte
2
Existe uma diferença em termos de desempenho entre essas duas opções?
jlb de
O trimDirectiveWhitespaces é suportado apenas por contêineres de servlet que suportam JSP 2.1 e posterior, ou no caso de Tomcat, Tomcat 6 (e algumas versões, por exemplo, Tomcat 6.0.10 não implementam corretamente - não sei sobre os outros), há mais informações sobre trimDirectiveWhitespaces aqui: java.sun.com/developer/technicalArticles/J2EE/jsp_21 e aqui raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree
3
E em arquivos JSP .tag personalizados, 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
Estou executando o Tomcat 8 e isso não parece funcionar. Está funcionando para alguém?
glez
27

Se seu servletcontainer não suportar a trimDirectiveWhitespacespropriedade JSP 2.1 , você precisará consultar sua JspServletdocumentação para quaisquer parâmetros de inicialização. Por exemplo , no Tomcat , você também pode configurá-lo definindo trimSpacesinit-param como truein for JspServletno Tomcat /conf/web.xml:

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

Uma alternativa completamente diferente é o JTidyFilter . Ele não apenas corta os espaços em branco, mas também formata o HTML em um recuo correto.

BalusC
fonte
Eu configurei definindo trimSpaces init-param como true em /conf/web.xml, mas os espaços no html gerado não são cortados. Estou usando o Tomcat 6.0. Alguma ideia?
ria
7
@ria: Observe que você precisa entender que isso apenas corta os espaços em branco deixados por taglibs como JSTL e scriptlets. Se você quiser cortar TODOS os espaços em branco do HTML, vá para uma solução diferente. Você pode encontrar um exemplo de filtro aqui: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC
Acabei de notar alguns problemas com o código do artigo b / c coisas no meu site começaram a aparecer erradas. Copiei a fonte html e colei no validador w3 para descobrir que o filtro de espaço em branco está ocasionalmente concatenando atributos. Por exemplo, isso ... <div onclick = "correct ()" class = "correct"> se transformaria em <div onclick = "wrong" class = "wrong">. Ou este <a class="correct"> neste <aclass = "wrong">. Portanto, ao perder o espaço em branco, a tag de fechamento do elemento se torna inválida. Alguma dica sobre isso?
gmustudent
3

Não diretamente o que você está pedindo, mas o que me ajuda é colocar tags de comentário HTML de uma maneira inteligente em torno de minhas tags jsp e também colocar um espaço em branco dentro de uma tag 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>
cheiroso
fonte
3

Se estiver usando tags, você também pode aplicá-las:

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

E no seu jsp:

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

Você pode ir um passo adiante e também remover novas linhas (retornos de carro) entre as tags html no momento da construção.

Ex: mudança:

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

para dentro:

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

Faça isso, use o maven-replacer-plugine configure-o em 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>

Isso apenas modificará os JSPs no diretório de construção e não afetará os JSPs em suas fontes.

Pode ser necessário adaptar o caminho ( <filesToInclude>) onde seus JSPs estão localizados.

yglodt
fonte
1

Por favor, use a função trim, exemplo

fn:trim(string1)
Jorge Santos Neill
fonte
0

Um pouco fora da questão real, se você quiser se livrar das linhas vazias causadas por tudo o que você fez antes da saída, você pode usar

out.clearBuffer();
Ghostff
fonte