Hapus spasi dari keluaran jsp

110

Bagaimana cara menghapus spasi ekstra dari keluaran halaman jsp? Apakah ada tombol yang dapat saya aktifkan di web.xml saya? Apakah ada pengaturan khusus Tomcat?

Seth Weiner
sumber

Jawaban:

172

Ada direktif trimWhiteSpaces yang harus melakukannya,

Di JSP Anda:

<%@ page trimDirectiveWhitespaces="true" %>

Atau di bagian jsp-config web.xml Anda (Perhatikan bahwa ini berfungsi mulai dari spesifikasi 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>

Sayangnya jika Anda memiliki ruang yang diperlukan, mungkin juga perlu strip itu, jadi Anda mungkin memerlukan ruang non-breaking di beberapa lokasi.

Rontologis
sumber
2
Apakah ada perbedaan dalam hal kinerja antara kedua opsi ini?
jlb
TrimDirectiveWhitespaces hanya didukung oleh wadah servlet yang mendukung JSP 2.1 dan setelahnya, atau dalam case atau Tomcat, Tomcat 6 (dan beberapa versi misalnya Tomcat 6.0.10 tidak mengimplementasikannya dengan benar - tidak tahu tentang yang lain), ada informasi lebih lanjut tentang trimDirectiveWhitespaces di sini: java.sun.com/developer/technicalArticles/J2EE/jsp_21 dan di sini raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree
3
Dan di file .tag kustom JSP, gunakan <% @ 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
Saya menjalankan Tomcat 8 dan sepertinya ini tidak berhasil. Apakah ini berhasil untuk siapa saja?
glez
27

Jika servletcontainer Anda tidak mendukung trimDirectiveWhitespacesproperti JSP 2.1 , Anda perlu membaca JspServletdokumentasinya untuk parameter inisialisasi. Misalnya , Tomcat , Anda juga dapat mengkonfigurasinya dengan mengatur trimSpacesinit-param ke truedalam untuk JspServletdi Tomcat /conf/web.xml:

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

Alternatif yang sama sekali berbeda adalah JTidyFilter . Ini tidak hanya memangkas spasi, tetapi juga memformat HTML dalam lekukan yang benar.

BalusC
sumber
Saya telah mengkonfigurasi dengan menyetel trimSpaces init-param menjadi true di /conf/web.xml tetapi spasi di html yang dihasilkan tidak dipangkas. Saya menggunakan Tomcat 6.0. Ada ide?
ria
7
@ria: Perhatikan bahwa Anda perlu memahami bahwa ini hanya memangkas ruang kosong yang ditinggalkan oleh taglib seperti JSTL dan scriptlets. Jika Anda ingin memangkas SEMUA whitespace dari HTML, maka cari solusi yang berbeda. Anda dapat menemukan contoh filter di sini: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC
Saya baru saja melihat beberapa halangan dengan kode dari artikel b / c hal-hal di situs saya mulai salah. Saya menyalin sumber html dan menempelkannya ke validator w3 untuk mengetahui bahwa filter spasi terkadang merupakan atribut gabungan. Misalnya ini ... <div onclick = "correct ()" class = "correct"> akan berubah menjadi <div onclick = "salah" class = "salah">. Atau <a class="correct"> ini <aclass = "salah"> ini. Jadi dengan kehilangan spasi, tag penutup untuk elemen tersebut menjadi tidak valid. Ada tips tentang ini?
gmustudent
3

Bukan secara langsung apa yang Anda minta, tetapi yang membantu saya adalah meletakkan tag komentar HTML dengan cara yang cerdas di sekitar tag jsp saya, dan juga meletakkan spasi di dalam 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>
harum
sumber
3

Jika Anda menggunakan tag, Anda juga dapat menerapkannya di sana:

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

Dan di jsp Anda:

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

Anda dapat melangkah lebih jauh dan juga menghapus baris baru (carriage return) antara tag html pada waktu pembuatan.

Misalnya perubahan:

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

ke:

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

Lakukan itu, gunakan maven-replacer-plugindan setel di 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>

Ini hanya akan mengubah JSP di direktori build, dan tidak menyentuh JSP di sumber Anda.

Anda mungkin perlu menyesuaikan jalur ( <filesToInclude>) tempat JSP Anda berada.

yglodt
sumber
1

Silakan, gunakan fungsi trim, misalnya

fn:trim(string1)
Jorge Santos Neill
sumber
0

Sedikit keluar dari pertanyaan sebenarnya, Jika Anda ingin menyingkirkan baris kosong yang disebabkan oleh apa pun yang Anda lakukan sebelum mengeluarkan, Anda dapat menggunakan

out.clearBuffer();
Ghostff
sumber