jsp: текст теряет пробелы внутри tagx
Попытка использовать JSPX и столкнуться со странной проблемой. Согласно документации JSP, текст внутри jsp:text не подлежит удалению пробелов, но когда у меня есть элемент jsp:text с начальным пробелом в начале файла tagx, при использовании в представлениях jspx, ведущий пробелы исчезают.
Я немного погуглил, но не могу найти причину, по которой это нужно удалить. Я проверил, что те же самые экземпляры jsp:text, включенные непосредственно в представление jspx, работают правильно, но помещенные в отдельный файл tagx приводят к его потере.
Это под Jetty 6.1.19 и 6.1.22 с использованием библиотек JSP 2.1.
РЕДАКТИРОВАТЬ: Ниже приведен пример кода. Обратите внимание, что пробелы в начале и в конце <jsp:text>
метки зачищены. Судя по документации JSP, я вижу, что пробелы в них должны быть сохранены.
WEB-INF / Вкладки / 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>
2 ответа
Мне кажется, что tagx обрезается, чтобы упростить написание тегов. Новая строка в конце, например, будет содержать пробел, где используется тег, и это может быть плохо.
Хотя почему бы не поместить свой текст в тег в диапазоне:
<jsp:text><span> ${name}=${value} </span></jsp:text>
Или используйте неразрывный пробел:
Таким образом, вы избегаете обрезки и получите желаемый результат.
Мой текст все еще должен был сломаться, поэтому я добавил <wbr>
до промежутков между ${...}
s.
Оказывается, это не работает в Internet Explorer, и проблема была в этой строке:
<%@ page trimDirectiveWhitespaces="true" %>
Это исправило это:
<%@ page trimDirectiveWhitespaces="false" %>
У меня была эта проблема с потерей пробела тоже. Я использую документы 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"> </span>
<span class="ex7">	</span>
Это единственные варианты, которые работают для меня:
<span class="ex8"> </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", что является юникодом для "неразрывного пробела".
Поскольку неразрывный пробел не всегда то, что вы хотите, ваш единственный вариант <c: out value=""/>
, Если есть другие варианты, я рад услышать об этом в комментариях.