web-dev-qa-db-fra.com

Est-il possible d'utiliser des facettes JSF + avec HTML 4/5?

Facelets s'appuie sur des espaces de noms XML pour fonctionner avec XHTML. Comment sont HTML 4, et pour autant que je sache, HTML 5 ne prend pas en charge les espaces de noms. HTML 5 contient également de nouveaux éléments qui ne sont pas disponibles en XHTML. Même HTML 4 et XHTML présentent des différences concernant les éléments et les attributs qu'ils prennent en charge.

La question est: est-il possible de rendre des documents HTML 4/5 à l'aide de Facelets? Si c'est le cas, comment?

65
Behrang

Étant donné que Facelets est une technologie de vue basée sur XML qui mange et émet essentiellement du balisage XML, vous ne pouvez pas l'utiliser avec un doctype HTML4. Le doctype HTML4 décrit plusieurs éléments qui ne peuvent pas se fermer automatiquement, comme <link>, <meta>, <br> et <hr>. Cependant, avec XML, vous êtes obligé de les fermer comme <link/>, <meta/>, etc. Donc, l'utilisation d'un doctype HTML4 n'est absolument pas une option pour Facelets (c'est-à-dire que lorsque vous respectez les normes et/ou craignez le validateur w3, cela fonctionnera cependant parfaitement sur la plupart sinon tous les navigateurs Web).

HTML5, d'autre part, permet le balisage XML. Ceci est spécifié dans chapitre 3.2.2 - Éléments :

Exemple:

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

Les auteurs peuvent également choisir d'utiliser cette même syntaxe pour les éléments vides dans la syntaxe HTML. Certains auteurs choisissent également d'inclure des espaces avant la barre oblique, mais cela n'est pas nécessaire. (L'utilisation des espaces blancs de cette manière est une convention héritée des directives de compatibilité de XHTML 1.0, annexe C.)

J'utilise moi-même <!DOCTYPE html> tout le chemin, également avec JSF/Facelets, même sans <?xml?> déclaration en haut de la page. Cela fonctionne parfaitement dans tous les navigateurs. Avec un doctype XHTML, selon la spécification, vous devez utiliser un Content-Type de application/xhtml+xml ce qui ne ferait qu'étouffer MSIE (il ne le comprend pas). Et puisque c'est toujours l'un des navigateurs les plus utilisés ... Remplacement du type de contenu XHTML par text/html est considéré comme dangereux , vous ne voulez pas non plus le faire.

Selon vos arguments:

HTML 5 ne prend pas en charge les espaces de noms.

Ça n'a pas d'importance. Les espaces de noms ne sont intéressants que pour la technologie de vue côté serveur basée sur XML (comme les Facelets) qui à son tour peut générer du HTML pur avec ces balises. L'exemple suivant est légitimement valable pour 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>

Cela rend HTML5 valablement légitime (pour le côté client):

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

Vous voyez, Facelets supprime déjà les déclarations XHTML car elles n'ont aucune signification du côté client.

Et,

HTML 5 contient également de nouveaux éléments qui ne sont pas disponibles en XHTML

cela n'a également aucun sens. Tout dépend de la sortie générée. Ce qui peut être aussi bon en HTML5. Votre seul problème peut être la prise en charge du navigateur et la disponibilité de composants JSF tiers qui rendent des éléments HTML5 spécifiques. Depuis JSF 2.2, il est possible d'utiliser la nouvelle fonctionnalité passthrough elements pour transformer les éléments personnalisés en composant JSF. Donnez simplement à l'élément HTML5 un jsf:id attribut. Il sera interprété de manière transparente en interne comme une instance UIPanel dans l'arborescence des composants JSF (comme <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>

Vous pouvez même le référencer depuis ajax comme dans <f:ajax render="main">.

En fait, XHTML est sur-typé. Son seul objectif est de faciliter le développement HTML en utilisant des outils basés sur XML qui peuvent manipuler/transformer/générer des pages HTML côté serveur (comme Facelets). Mais certains démarreurs l'utilisent également sans utiliser d'outil XML et le sortent tel quel, car il est "tellement cool" - pour une raison peu claire.

Ne vous méprenez pas. XHTML est super comme technologie de vue côté serveur. Mais tout simplement pas en tant que technologie de balisage côté client. Il n'a absolument aucune valeur côté client.

Voir également:

93
BalusC

Sur une note connexe, consultez cet article IBM developerWorks: JSF 2 fu: composants composites HTML5, partie 1

8
Vetle

MyFaces a une extension pour html5. Essayez ceci http://myfaces.Apache.org/html5/

4
ogok

J'ai lu que cela devrait être possible, mais je ne l'ai pas encore fait moi-même. Vous devriez peut-être simplement utiliser HTML 5 dans le code wrapper xHTML. Je verrai, si je peux retrouver la source d'information que j'ai encore.

[EDIT] On dirait que MyFaces a fait des travaux pour prendre en charge le rendu HTML5 pendant l'été de code de Google. Je ne sais pas encore s'il doit être utilisé de manière productive.

Veuillez nous faire part de vos commentaires si vous le faites fonctionner. [/ÉDITER]

3
PageFault

http://wiki.whatwg.org/wiki/HTML_vs._XHTML contient des informations utiles sur la façon dont les espaces de noms peuvent être utilisés en HTML5 pour faciliter la migration depuis XHTML. Vous pouvez peut-être essayer d'appliquer l'espace de noms comme il le suggère et voir ce qui se passe?

2
Martijn Verburg