Можно ли использовать JSF + Facelets с HTML 4/5? - PullRequest
65 голосов
/ 29 мая 2010

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

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

Ответы [ 5 ]

91 голосов
/ 06 октября 2010

Поскольку 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-документа вы должны, согласно спецификации, использовать 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 отлично как технология серверного вида. Но просто не как технология разметки на стороне клиента. Это совершенно не имеет значения на стороне клиента.

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

8 голосов
/ 12 октября 2010

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

4 голосов
/ 08 марта 2012

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

3 голосов
/ 04 октября 2010

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

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

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

2 голосов
/ 05 октября 2010

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

...