Можно ли использовать JSF + Facelets с HTML 4/5?

Facelets опирается на пространства имен XML для работы с XHTML. Как HTML 4, и насколько я знаю, HTML 5 не поддерживает пространства имен. Также в HTML 5 есть несколько новых элементов, которые недоступны в XHTML. Даже HTML 4 и XHTML имеют некоторые отличия в отношении элементов и атрибутов, которые они поддерживают.

Возникает вопрос: возможно ли оформлять документы HTML 4/5 с помощью Facelets? Если да, то как?

Ответ 1

Так как Facelets - это технология просмотра на основе XML, которая ест и испускает по существу разметку XML, вы не можете использовать ее с doctype HTML4. В документе типа HTML4 описаны несколько элементов, которые не могут быть самозакрывающимися, например <link>, <meta>, <br> и <hr>. Однако с помощью XML вы вынуждены закрывать их, например, <link/>, <meta/> и т.д. Таким образом, использование документа типа HTML4 абсолютно не является вариантом для Facelets (то есть, когда вы уважаете стандарты и/или боитесь валидатора w3, он, однако, отлично работает на большинстве, если не на всех веб-браузерах).

HTML5, с другой стороны, позволяет разметку XML. Это указано в глава 3.2.2 - Элементы:

Пример:

<link type="text/css" href="style.css"/>

Авторы могут по выбору выбрать этот синтаксис для элементов void в синтаксисе HTML. Некоторые авторы также предпочитают включать пробелы перед косой чертой, однако это необязательно. (Использование пробелов в этом модуле - это соглашение, унаследованное от рекомендаций по совместимости в XHTML 1.0, приложение C.)

Я сам использую <!DOCTYPE html> полностью, также с JSF/Facelets, даже без объявления <?xml?> в верхней части страницы. Он отлично работает во всех браузерах. С доктриной XHTML вы должны в соответствии с спецификацией использовать Content-Type of application/xhtml+xml, который только заставляет MSIE задыхаться (это не понимает). И поскольку это еще один из наиболее широко используемых браузеров... Замена типа содержимого XHTML на text/html считается вредным, вы также Не хочу этого делать.

В соответствии с вашими аргументами:

HTML 5 не поддерживает пространства имен.

Это не имеет значения. Пространства имен представляют интерес только для технологии просмотра на стороне сервера на основе XML (например, Facelets), которая, в свою очередь, может генерировать чистый HTML-код с этими тегами. Следующий пример действителен для Facelets:

<!DOCTYPE html>
<html lang="en"
    xmlns:f="http://xmlns.jcp.org/jsf/core" 
    xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>Title</title>
    </h:head>
    <h:body>
        <h:outputText value="#{bean.text}" />
    </h:body>
</html>

Это делает допустимым допустимым HTML5 (для клиентской стороны):

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Title</title>
    </head>
    <body>
        Some text
    </body>
</html>

Видите ли, Facelets уже удаляет объявления XHTML, поскольку они не имеют никакого значения на стороне клиента.

и

Также в HTML 5 есть несколько новых элементов, которые недоступны в XHTML

это тоже не имеет смысла. Это все о сгенерированном выходе. Который может быть HTML5 как хороший. Единственной проблемой может быть поддержка браузера и наличие сторонних компонентов JSF, которые отображают определенные элементы HTML5. Начиная с JSF 2.2, можно использовать новую функцию passthrough elements для включения пользовательских элементов в компонент JSF. Просто укажите элемент HTML5 a jsf:id. Он будет прозрачно внутренне интерпретироваться как экземпляр UIPanel в дереве компонентов JSF (например, <h:panelGroup>).

<!DOCTYPE html>
<html lang="en"
    xmlns:jsf="http://xmlns.jcp.org/jsf"
    xmlns:f="http://xmlns.jcp.org/jsf/core" 
    xmlns:h="http://xmlns.jcp.org/jsf/html"
>
    <h:head>
        <title>Title</title>
    </h:head>
    <h:body>
        <header jsf:id="header">Header</header>
        <nav jsf:id="nav">Nav</nav>
        <main jsf:id="main">Main</main>
        <footer jsf:id="footer">Footer</footer>
    </h:body>
</html>

Вы даже можете ссылаться на него из ajax, как в <f:ajax render="main">.

Собственно, XHTML является сверхвысоким. Его единственная цель - облегчить разработку HTML, используя инструменты на основе XML, которые могут манипулировать/преобразовывать/генерировать HTML-страницы на стороне сервера (например, Facelets). Но некоторые стартеры также используют его без использования какого-либо инструмента XML и выводят его как есть, потому что он "настолько классный" - по какой-то непонятной причине.

Не поймите меня неправильно. XHTML отлично подходит для просмотра на стороне сервера. Но просто не как технология разметки на стороне клиента. Это не имеет никакого значения на стороне клиента.

См. также:

Ответ 4

Я читал, что это должно быть возможно, но я не делал этого сам. Возможно, вам нужно просто использовать HTML 5 внутри кода оболочки xHTML. Я увижу, если я смогу найти источник, если информация еще раз.

[EDIT] Похоже, в MyFaces была некоторая работа для поддержки рендеринга HTML5 во время летнего кода Goole. Я не знаю, следует ли использовать его продуктивным образом.

Пожалуйста, дайте нам обратную связь, если вы получите ее на работу. [/EDIT]

Ответ 5

http://wiki.whatwg.org/wiki/HTML_vs._XHTML содержит полезную информацию о том, как пространства имен могут использоваться в HTML5 для облегчения миграции из XHTML. Возможно, вы можете попробовать применить пространство имен, как он предлагает, и посмотреть, что происходит?