jsp: текст теряет пробелы внутри tagx

Пытаюсь использовать JSPX и сталкиваюсь со странной проблемой. Предполагается, что текст внутри jsp:text не подлежит удалению пробелов в соответствии с документацией JSP, но когда у меня есть элемент jsp:text с начальным пробелом в начале файла tagx, при использовании в представлениях jspx начальный пробел исчезает.

Я немного погуглил, но не могу найти причину, по которой это удаляется. Я проверил, что одни и те же экземпляры jsp:text, включенные непосредственно в представление jspx, работают правильно, но помещаются в отдельный файл tagx, что приводит к его потере.

Это в Jetty 6.1.19 и 6.1.22 с использованием библиотек JSP 2.1.

EDIT: Ниже приведен пример кода. Обратите внимание, что пробелы в начале и конце тегов <jsp:text> удаляются. Судя по документации JSP, которую я вижу, пробелы внутри них должны быть сохранены.

WEB-INF/tabs/nameValuePair.tagx:

<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page">
<jsp:directive.attribute name="name" type="java.lang.String" required="true"/>
<jsp:directive.attribute name="value" type="java.lang.String" required="true"/>
<jsp:text> ${name}=${value} </jsp:text>
</jsp:root>

test.jspx:

<jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:t="urn:jsptagdir:/WEB-INF/tags">
<jsp:directive.page contentType="text/html; charset=ISO-8859-1" />

<html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <t:nameValuePair name="name" value="Google" />
        <t:nameValuePair name="age" value="11" />
        <t:nameValuePair name="description" value="Popular Search Engine" />
        <jsp:text> test=value </jsp:text>
    </body>
</html>

</jsp:root>

выход:

<html><head><title>Test</title></head><body>name=Googleage=11description=Popular Search Engine test=value </body></html>

person Alan Krueger    schedule 11.12.2009    source источник
comment
Если вы замените пробелы точками или чем-то еще, они сохранятся? Вы уверены, что вокруг тега нет ничего, что удаляет пробел? Удалены ли также пробелы за пределами тега или исчезают только пробелы вашего jsp:text?   -  person Brimstedt    schedule 22.12.2009
comment
Обратите внимание, что теги jsp:text, которые теряют свои пробелы, находятся непосредственно под jsp:root файла tagx, и ничто не заключает их в файл jspx. Аналогичные теги jsp:text непосредственно внутри файла jspx сохраняют свои начальные и конечные пробелы, а теги внутри файла tagx — нет.   -  person Alan Krueger    schedule 22.12.2009
comment
Я не совсем уверен, в чем проблема. test=value содержит пробелы в выводе. В элементах t:nameValuePair нет пробелов, и это правильно. Вывод выглядит правильно! Один комментарий, который я мог бы сделать, заключается в том, что есть два закрывающих тега ‹/jsp:root›.   -  person Joshua    schedule 22.12.2009
comment
@Josh Можете ли вы объяснить, почему вы говорите, что в элементах t: nameValuePair нет пробелов, и это правильно. Тег nameValuePair задает пробелы в ‹jsp:text›; разве эти пробелы не должны быть сохранены? Если нет, то почему? Два закрывающих тега ‹/jsp:root› — это ошибка копирования/вставки с моей стороны.   -  person Alan Krueger    schedule 28.12.2009


Ответы (3)


Мне кажется, что tagx обрезается, чтобы упростить написание тегов. Например, новая строка в конце может заканчиваться пробелом, в котором используется тег, и это может быть плохо.

Хотя почему бы не поместить свой текст в тег в спане:

<jsp:text><span> ${name}=${value} </span></jsp:text>

Или используйте неразрывный пробел: &nbsp;

Так вы избежите обрезки и получите желаемый результат.

person Knubo    schedule 13.11.2010
comment
На самом деле я хочу выдать исходный HTML-код с тегом, а не отображаемым контентом. Таким образом, включение элемента ‹span› или сущности кажется неправильным. - person Alan Krueger; 15.11.2010
comment
Тогда вам, вероятно, следует подумать о написании тегов без использования jspx и сделать это с помощью класса, чтобы вы могли больше контролировать свой вывод. Хотя мне интересно, где вы хотите использовать источник? Это для источника сохранения я могу понять, что это проблема, хотя, если это для отображения на экране, это может не иметь значения. - person Knubo; 15.11.2010

У меня тоже была проблема с потерей пробелов. Я использую документы jspx и предварительный компилятор для производства. Но на моей машине разработки я использую встроенный tomcat для перекомпиляции документов jspx на лету всякий раз, когда jsp меняется.

Сначала мне нужно было добиться тех же результатов компиляции с помощью прекомпилятора и встроенного компилятора tomcat с помощью этого фрагмента для моего web.xml

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

При активации этой директивы оба ведут себя одинаково. Если вы пытаетесь сохранить пробелы, не делайте этого:

<span class="ex1"> </span>
<span class="ex2"><jsp:text> </jsp:text></span>
<span class="ex3"> <jsp:text><!-- keep --> </jsp:text></span>
<span class="ex4"><!--  keep --></span>
<span class="ex5"><span> </span> <!--  keep --></span>
<span class="ex6">&#032;</span>
<span class="ex7">&#009;</span>

Это единственные варианты, которые работают для меня:

<span class="ex8">&#160;</span>
<span class="ex9"><c:out value=" " /></span>

Результирующая компиляция jsp выглядит так:

out.write("<span class=\"ex1\"/>");
out.write("<span class=\"ex2\">");
out.write("</span>");
out.write("<span class=\"ex3\">");
out.write("</span>");
out.write("<span class=\"ex4\">");
out.write("</span>");
out.write("<span class=\"ex5\">");
out.write("<span/>");
out.write("</span>");
out.write("<span class=\"ex6\"/>");
out.write("<span class=\"ex7\"/>");
out.write("<span class=\"ex8\">");
out.write(' ');
out.write("</span>");
out.write("<span class=\"ex9\">");
if (_jspx_meth_c_005fout_005f0(_jspx_th_ktr_005fform_005f0, _jspx_page_context))
  return true;
out.write("</span>");

Кстати. Вы видите ссылку  , которая представляет собой неразрывный пробел в XML, результатом которого является out.write(' '); в скомпилированном jsp. Но неразрывный пробел сохраняется, даже если вы его не видите. Если вы сделаете hexdump -C test.jspx, вы получите:

6f 75 74 2e 77 72 69 74  65 28 27 c2 a0 27 29 3b  |out.write('..');|

«..» в правых столбцах показывает непечатаемые символы «c2 a0», которые являются Unicode для «неразрывного пробела».

Поскольку неразрывный пробел — это не всегда то, что вам нужно, единственный вариант — <c: out value=""/>. Если есть другие варианты, буду рад услышать об этом в комментариях.

person Janning    schedule 14.10.2016

Мой текст все еще должен был прерваться, поэтому я добавил <wbr> перед пробелами между ${...}.

Оказывается, это не работает в Internet Explorer, и проблема была в этой строке:

<%@ page trimDirectiveWhitespaces="true" %>

Это исправило это:

<%@ page trimDirectiveWhitespaces="false" %>
person Cees Timmerman    schedule 02.07.2019