Вопрос по facelets, xml, jsf-2 – Пролог / инструкция XML не удалены из вывода XHTML

12

Я начинаю изучать JavaServer Faces (JSF). Я использую GlassFish 3+. Я только что создал новый проект JSF в NetBeans и запустил проект. Это работало нормально, но, изучив вывод XHTML, я заметил, что объявление XML осталось. Это портит объявление DOCTYPE (которое всегда должно быть первым в документе).

enter image description here

Должен ли JSF удалять декларацию XML, или я что-то не так сделал?

Что касается описания вознаграждения, оно будет исправлено в следующем издании книги Core JSF. Что касается Netbeans, я не имею на это никакого влияния, и я не заинтересован в этом. BalusC
Если существует декларация XML, она должна появиться перед Doctype. Это вызовет проблемы только в IE6, поэтому я не буду беспокоиться об этом, если только IE6 не является целевой платформой. Quentin

Ваш Ответ

2   ответа
11

По умолчанию Facelets удаляет его только из композиций (включая файлы и составные компоненты) и файлов тегов. Он не удалит его из основного шаблона. Просто убери это сам. Вы не должны вообще использовать пролог XML при создании HTML.

Будет ли пролог XML удален из основного шаблона, указано в приложении 1.1.1.1 кСпецификация JSF 2.2 который описывает конфигурацию<facelets-processing> элемент вfaces-config.xml, Пролог XML описан как «инструкции по обработке». В этой таблице вы увидите, что он удаляется (используется) только тогда, когда шаблон обрабатывается как представление XML или JSPX.

1.1.1.1 The facelets-processing element

The <facelets-processing> element is used to affect the processing of Facelets VDL files. Therefore, this setting only applies to those requests that reach the Facelets ViewDeclarationLanguage implementation, as specified to the runtime via the javax.faces.FACELETS_VIEW_MAPPINGS and javax.faces.DEFAULT_SUFFIX <context-param> entries. The specification defines three processing modes for Facelets files: Facelets XHTML syntax, XML View syntax, and Facelets JSPX syntax. This last syntax is intended to ease the migration to Facelets for applications already using the JSP document syntax (also known as JSPX syntax). The affect on the processing of files in each of these three modes is specified in the following table.

Valid <process-as> values and their implications on the processing of Facelets.
-----------------------------------------------------------------------------------------
              <process-as>         <process-as>         <process-as>       <process-as>
              html5</process-as>   xhtml</process-as>   xml</process-as>   jspx</process-as>
              HTML 5 (default)     Facelets XHTML       XML View           Facelets JSPX
-----------------------------------------------------------------------------------------
XML Doctype   Simplified to        passed through       consumed           consumed
              <!DOCTYPE html>  

XML           passed through       passed through       consumed           consumed
declaration 

Processing    passed through       passed through       consumed           consumed
instructions

CDATA         passed through       passed through       consumed           consumed
section

Escaping of   escaped              escaped              escaped            not escaped
inline text    

XML           passed through       passed through       consumed           consumed
Comments 

In the preceding table, “passed through” means that the content is passed through unmodified to the user agent. “consumed” means the content is silently consumed on the server. Note that for CDATA sections, the content of the CDATA section itself is passed through, even if the start and end tags should be consumed. “escaped” means that sensivite content in the response is automatically escaped: & becomes &amp;, for example. “not escaped” means that such content is not escaped.

Другими словами, когда вы создаете HTML5 / XHTML, вы должны удалить его самостоятельно. Лучшая формулировка на самом деле:you shouldn't be including the XML prolog yourself in HTML5 and XHTML pages as that's not required; it's only required in XML and JSPX pages (and thus Facelets will automatically remove it).

See also:


Unrelated к конкретной проблеме, вы должны использовать<h:outputStylesheet> вместо<link rel="stylesheet"> быть независимым от URL запроса.

<h:outputStylesheet name="css/default.css" />
<h:outputStylesheet name="css/cssLayout.css" />

See also:

с<process-as>xml</process-as>в сгенерированном HTML отсутствует объявление типа документа HTML5
Вы можете воспроизвести проблему в вопросе?
Да, присутствие пролога XML будет причиной этого. Просто избавься от этого. Он не относится к целевым страницам HTML5. Он будет удален только из включенных и теговых файлов, но не из (шаблонных) клиентов. Смотрите также последний параграф в ответе.
Кажется, он работает в GlassFish Server Open Source Edition 4.0 (89), когда я удаляю пролог XML. Я проверю в другой среде с текущей версией GlassFish 4.1.
@ mjn: действительно, этоconsumed, Если вы хотите создать HTML5, просто придерживайтесь значения по умолчанию и избавьтесь от всех прологов XML.
3

Чтобы объявление XML не отображалось на моих отображаемых страницах, я обнаружил, что могу настроить JSF для обработки моих файлов .xhtml как XML. При обработке в режиме XML объявление xml не будет передаваться из моих исходных файлов на выход. Я еще не заметил каких-либо других побочных эффектов для внесения этого изменения. (Но если я найду что-нибудь, я последую здесь.)

Чтобы внести изменения в конфигурацию, я добавил следующее в мой файл names-config.xml:

<faces-config-extension>
    <facelets-processing>
        <file-extension>.xhtml</file-extension>
        <process-as>xml</process-as>
    </facelets-processing>  
</faces-config-extension>    

Надеюсь это поможет

Я не смог найти FACELETS_SUPPRESS_XML_DECLARATION в документации JSF 2, вы уверены, что она существует?
Я удалил информацию о javax.faces.FACELETS_SUPPRESS_XML_DECLARATION, которая вводит в заблуждение и не является частью реального ответа.
Должно быть, это была экспериментальная команда, которую я выбрал, которая не попала в производственные релизы. Я нашел пару ссылок в Google, которые содержат вспомогательные ссылки на javax.faces.FACELETS_SUPPRESS_XML_DECLARATION (например:lists.jboss.org/pipermail/jsr-314-open-mirror/2010-August/… ), но ничего недавнего.
Его ответ не говорит иначе.

Похожие вопросы