Можно ли использовать 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. Возможно, вы можете попробовать применить пространство имен, как оно предлагает, и посмотреть, что происходит?