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

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

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

5 ответов

Решение

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

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

Пример:

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

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

Я сам пользуюсь <!DOCTYPE html> полностью, также с JSF/Facelets, даже без <?xml?> объявление в верхней части страницы. Он отлично работает во всех браузерах. С XHTML doctype вы должны согласно спецификации использовать Content-Type из 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 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 отлично подходит в качестве серверной технологии. Но просто не как технология разметки на стороне клиента. Это совершенно не имеет значения на стороне клиента.

Смотрите также:

Ознакомьтесь с соответствующей заметкой IBM developerWorks: JSF 2 fu: составные компоненты HTML5, часть 1

MyFaces имеет расширение для HTML5. Попробуйте это http://myfaces.apache.org/html5/

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

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

Пожалуйста, дайте нам обратную связь, если вы получите его на работу. [/РЕДАКТИРОВАТЬ]

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

Другие вопросы по тегам