Видаліть пробіл з виводу 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
Чи є різниця в продуктивності між цими двома варіантами?
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
А у спеціальних .tag-файлах JSP використовуйте <% @ 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

Я запускаю Tomcat 8, і це, здається, не працює. Це працює для когось?
glez

27

Якщо ваш сервлет-контейнер не підтримує trimDirectiveWhitespacesвластивість JSP 2.1 , вам потрібно ознайомитися з його JspServletдокументацією щодо будь-яких параметрів ініціалізації. Наприклад, Tomcat , ви можете налаштувати його, встановивши trimSpacesinit-param для trueв JspServletв Tomcat /conf/web.xml:

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

Зовсім інша альтернатива - JTidyFilter . Він не тільки обробляє пробіл, але й форматує HTML у правильному відступі.


Я налаштував, встановивши trimSpaces init-param на true у /conf/web.xml, але пробіли в створеному HTML не обрізані. Я використовую Tomcat 6.0. Якісь ідеї?
ria

7
@ria: Зауважте, що вам потрібно зрозуміти, що це лише обробка пробілів, залишених талібами, такими як JSTL та скрипти. Якщо ви хочете обрізати ВСІ пробіли з HTML, тоді перейдіть до іншого рішення. Приклад фільтру ви можете знайти тут: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC

Я щойно помітив пару корчів з кодом із статті b / c, що речі на моєму сайті почали виявлятися неправильно. Я скопіював html-джерело і вставив його у валідатор w3, щоб з'ясувати, що фільтр пробілів час від часу об'єднує атрибути. Наприклад, це ... <div onclick = "правильний ()" class = "правильний"> перетвориться на цей <div onclick = "неправильний" class = "неправильний">. Або це <a class="correct"> в цей <aclass = "неправильний">. Таким чином, втрачаючи пробіл, тег закриття для елемента стає недійсним. Якісь поради щодо цього?
gmustudent

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>

Це змінить лише JSP в каталозі build, а не торкнеться JSP у ваших джерелах.

Можливо, вам доведеться адаптувати шлях ( <filesToInclude>), де знаходяться ваші JSP.




0

Трохи від актуального питання. Якщо ви хочете позбутися від порожніх рядків, будь-що, що ви робили перед виведенням, ви можете використовувати

out.clearBuffer();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.