jsp出力から空白を取り除く


110

jspページの出力から余分な空白を削除するにはどうすればよいですか?web.xmlでフリップできるスイッチはありますか?Tomcat固有の設定はありますか?

回答:


172

これを実現するtrimWhiteSpacesディレクティブがあります。

JSPで:

<%@ page trimDirectiveWhitespaces="true" %>

または、jsp-configセクションでweb.xml(これはサーブレット仕様2.5以降で機能することに注意してください):

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

残念ながら、必要なスペースがある場合は、それも取り除く必要がある場合があるため、場所によっては改行しないスペースが必要になる場合があります。


2
これら2つのオプションのパフォーマンスの点で違いはありますか?
jlb

trimDirectiveWhitespacesは、JSP 2.1以降、または場合によってはTomcat、Tomcat 6をサポートするサーブレットコンテナーでのみサポートされています(Tomcat 6.0.10などの一部のバージョンでは、適切に実装されていません。他のバージョンについては不明です)。 trimDirectiveWhitespacesの詳細については 、こちらをご覧ください: java.sun.com/developer/technicalArticles/J2EE/jsp_21およびこちら raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree

3
また、JSPカスタム.tagファイルでは、<%@ tag body-content = "scriptless" trimDirectiveWhitespaces = "true"%>を使用します。
トーマスW

Tomcat 7 web.xml:<init-param> <param-name> trimSpaces </ param-name> <param-value> true </ param-value> </ init-param>
Ujjwal Singh

私はTomcat 8を実行していますが、これは動作しないようです。それは誰のために働いていますか?
glez

27

servletcontainerがJSP 2.1 trimDirectiveWhitespacesプロパティをサポートしていない場合は、そのJspServletドキュメントで初期化パラメータを調べる必要があります。たとえばTomcatでは、TomcatのtrimSpaces init-paramをtruein for JspServletに設定することによっても構成できます/conf/web.xml

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

完全に異なる代替はJTidyFilterです。空白を削除するだけでなく、HTMLを正しいインデントでフォーマットします。


/conf/web.xmlでtrimSpaces init-paramをtrueに設定して構成しましたが、生成されたhtmlのスペースはトリミングされません。Tomcat 6.0を使用しています。何か案は?
ria

7
@ria:これは、JSTLやスクリプトレットなどのtaglibによって残された空白のみを削除することを理解する必要があることに注意してください。HTMLからすべての空白を削除する場合は、別の解決策を検討してください。フィルターの例は、こちらにあります:balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC

私のサイトの記事b / cのコードにいくつか問題があり、正しく表示されなくなっていることに気づきました。htmlソースをコピーしてw3バリデーターに貼り付け、空白フィルターが時々属性を連結していることを確認しました。たとえば、この... <div onclick = "correct()" class = "correct">は、この<div onclick = "wrong" class = "wrong">になります。または、この<a class="correct">をこの<aclass = "wrong">に入れます。したがって、空白を失うことにより、要素の終了タグは無効になります。これに関するヒントはありますか?
gmustudent 2013年

4

trimDirectiveWhitespacesは、JSP 2.1以降、またはケースまたはTomcat、Tomcat 6をサポートするサーブレットコンテナーでのみサポートされます(Tomcat 6.0.10などの一部のバージョンでは、適切に実装されていません。他のバージョンについては不明です)。ここにtrimDirectiveWhitespacesの詳細があります。

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

そしてここ

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


3

直接あなたが求めているものではありませんが、私が役立つのは、HTMLコメントタグをjspタグの周りに巧妙な方法で配置し、サーブレットタグ(<%%>)内に空白を配置することです。

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

タグを使用している場合は、そこにも適用できます。

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

そしてあなたのjspで:

<%@ page trimDirectiveWhitespaces="true" %>

1

さらに一歩進んで、ビルド時にhtmlタグ間の改行(復帰)を削除することもできます。

例えば変更:

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

に:

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

それを行うには、を使用して次のようmaven-replacer-pluginに設定し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>

これにより、build-directoryのJSPのみが変更され、ソースのJSPは変更されません。

<filesToInclude>JSPが置かれているパス()を調整する必要がある場合があります。




0

実際の質問から少し離れて、出力前に何をしたかによって生じた空の行を取り除きたい場合は、

out.clearBuffer();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.