Документ JSP / JSPX: что определяет, как вкладки / пробелы / переносы строк удаляются в выводе? - PullRequest
6 голосов
/ 29 мая 2010

У меня есть "JSP Document" ("JSP in XML"), красиво отформатированный, и когда веб-страница генерируется и отправляется пользователю, некоторые разрывы строк удаляются.

Теперь действительно странная часть:очевидно, «main» .jsp всегда получает all разрыв строки, но для любого последующего .jsp, включенного в основной .jsp, разрывы строки, кажется, удаляются случайным образом (некоторые есть, другие нет).

Например, если я смотрю на веб-страницу, обслуживаемую Firefox, и спрашиваю «просмотреть исходный код» , я вижу, что генерируется.

Итак, чтоопределяет, когда / как будут сохраняться / удаляться разрывы строк?

Это всего лишь пример, который я составил ... Можете ли вы заставить .jsp служить этому:

<body><div id="page"><div id="header"><div class="title">...

или вот так:

<body>
  <div id="page">
    <div id="header">
      <div class="title">...

?

Я понимаю, что разрывы строк удаляются для экономии пропускной способности, но что, если я хочу сохранить их?А что, если я хочу сохранить тот же XML-отступ, что и в моем файле .jsp?

Это выполнимо?

РЕДАКТИРОВАТЬ

Следуя советам СкаффманаЯ взглянул на сгенерированные файлы .java, и у «основного» нет большого количества out.write , но нет ни одной вкладки для написания ни новой строки.В отличие от этого файла, все те, которые я включаю из этого основного .jsp, имеют много строк, таких как:

out.write("\t...\n");

Так что я думаю, мой вопрос остается точно таким же: что определяет, как tabs / space /разрывы строк включены / удалены в выводе?

Ответы [ 3 ]

7 голосов
/ 29 мая 2010

Согласно спецификации JSP :

JSP.6.2.3 Семантическая модель

...

Чтобы четко объяснить обработку пробелов, мы следуем структуре Спецификация XSLT. Первым шагом в обработке документа JSP является определение узлы документа. Тогда все текстовые узлы, которые имеют только пробел, выпал из документа; единственным исключением являются узлы в элементе jsp: text, которые хранятся дословно. Полученные узлы интерпретируются как описано в следующие разделы. Данные шаблона либо передаются непосредственно в ответ, либо опосредовано через (стандартные или пользовательские) действия.

Итак, если вы хотите сохранить пробелы, вам нужно обернуть нужные части в <jsp:text>.

2 голосов
/ 29 мая 2010

Не очень точный ответ, но согласно этому сообщению , Джаспер может делать это (признаюсь, я не проверял себя):

У меня был поиск вокруг, и я не думаю, об этом уже спрашивали.

Я пишу свои страницы JSP в формате XML документы (суффикс .jspx) и один разница, которая меня немного раздражает между использованием краткого XML-документа синтаксис и (до-2.0) унаследованный синтаксис являются разрывы строк, или отсутствие в бывший.

Обработанный документ XML приводит к XHTML, где теги не сломаны либо через пробел, либо через разрыв строки.

Я полностью понимаю концепцию почему это так; первый XML документ анализируется до его узла дерево, а затем генерируется XHTML на основе этого дерева.

Однако я понимаю что белый интервал не должен быть потерянным по пути. Я проверил код яшмы, в частности org.apache.jasper.compiler.Node и Беглый осмотр выявляет много .trim () вызывает, что может быть излишне удаляя расстояние. Однако я не очень знаком с этот код сказать решительно.

В сумме это может быть ошибка / область улучшения. Независимо от того, есть ли способ вставлять разрывы строк через конфигурация? Я чувствую себя уверенно в состоянии достичь этого с уродливым, уродливым Разделы CDATA или что-то подобное (JSP: текст?) ... но прежде чем я пойду к этому Беда, есть ли легче / аккуратнее способ

Сообщение довольно старое, но такое же поведение также сообщается в этом комментарии , и ваш вопрос, по-видимому, подразумевает, что оно все еще применяется.

Не уверен, что вы можете изменить это поведение (без использования фильтра).

0 голосов
/ 29 мая 2010
<trim-directive-whitespaces>true</trim-directive-whitespaces>

Пробел внутри <jsp:text> удаляется, если вы используете указанную выше директиву в web.xml. Учитывая семантическую модель, приведенную в ответе BalusC , эта директива полезна, только если вы не используете синтаксис XML.

(Tomcat 6.0.16; объявления Servlet 2.5; объявления JSP 2.1 в синтаксисе XML)

...