Quand utiliser , des fichiers de balises, des composants composites et / ou des composants personnalisés?

J’ai commencé à utiliser JSF 2.0 avec Facelets récemment et je me suis laissé surprendre par de nouveaux composants composites connaissant les et autres techniques de modélisation offertes par Facelets 1.x.

Quelle est la différence entre ces approches? Fonctionnellement, ils semblent offrir à peu près la même chose: vs , + vs fichiers de balises, réutiliser les modèles existants. Y a-t-il autre chose que la syntaxe et la spécification d’interface claire dans le cas de composants composites? La performance pourrait-elle différer?

Quelle est la différence entre ces approches?

Modèles de facettes

Utilisez les modèles Facelet (comme dans , et ) si vous souhaitez diviser les fragments de mise en page principale en modèles réutilisables. Par exemple, en-tête, menu, contenu, pied de page, etc.

Exemples:

  • Comment inclure un autre XHTML dans XHTML en utilisant les Facelets JSF 2.0?
  • Quelle est la vraie différence conceptuelle entre ui: décorer et ui: inclure?
  • Comment personnaliser h: head en utilisant ui: template de composition?
  • Comment changer les éléments de tête d’une page en utilisant ui: composition
  • Comment ajax-refresh dynamic inclure le contenu par menu de navigation? (SPA JSF)

Fichiers de balises à facettes

Utilisez les fichiers de balises Facelet si vous souhaitez disposer d’un groupe de composants réutilisables afin d’empêcher / de minimiser la duplication de code. Par exemple, un groupe de composants label + input + message. La principale différence avec les composants composites est que la sortie d’un fichier de balises Facelet ne représente pas un seul composant UIComponent et peut, dans certaines circonstances, être la seule solution lorsqu’un composant composite ne suffit pas. En général, avoir un avec un ou plusieurs que le fichier d’inclusion peut être un fichier de balises.

Exemples:

  • Comment créer une balise Facelets personnalisée?
  • Comment faire une grid de composant composite JSF?
  • Comment créer un composant composite pour une colonne datatable?
  • PrimeFaces outputLabel pour le composant composite

Composants Composites

Utilisez des composants composites si vous souhaitez créer un composant UIComponent personnalisé unique et réutilisable avec une seule responsabilité utilisant du XML pur. Un tel composant composite consiste généralement en un ensemble de composants existants et / ou HTML et est rendu physiquement en tant que composant unique et est supposé être lié à une propriété de bean unique. Par exemple, un composant qui représente une propriété java.util.Date unique par 3 composants , ou un composant qui combine et en un seul référençant un seul com.example.Image entité personnalisée en tant que propriété.

Exemples:

  • Notre page wiki Composite Composite
  • Le code BalusC: Composant composite avec plusieurs champs d’entrée
  • Fractionner java.util.Date sur deux champs h: inputText représentant les heures et les minutes avec f: convertDateTime
  • Sélectionner tous les éléments dans SelectManyCheckBox multiple avec des identifiants dynamics
  • Extension du composant commandLink JSF
  • Éviter les identifiants en double lors de la réutilisation de compositions de facelets dans le même conteneur de dénomination

Composants personnalisés

Utilisez un composant personnalisé lorsque la fonctionnalité ne peut pas être obtenue avec les fichiers de balises Facelet ou les composants composites, en raison du manque de prise en charge du jeu de composants standard / disponible. Des exemples peuvent être trouvés partout dans le code source des bibliothèques de composants open source telles que PrimeFaces et OmniFaces .

Gestionnaires de balises

Lorsque vous souhaitez contrôler la construction de l’arborescence des composants JSF au lieu du rendu de la sortie HTML, vous devez utiliser un gestionnaire de balises au lieu d’un composant.

Exemples:

  • Composant Facelet personnalisé dans JSF
  • Comment puis-je accéder au contenu de quelque chose créé avec par programmation?
  • Rendu conditionnel dans le fichier de balise selon que l’atsortingbut est spécifié ou non
  • Réalisation d’une redirection lorsque la conversion / validation associée aux parameters de requête échoue

Exemples de projets

Voici quelques exemples de projets utilisant toutes les techniques mentionnées ci-dessus.

  • App Kickoff Java EE ( modèles – inclut – fichiers de balises – composite )
  • OmniFaces Showcase ( templates – inclut – tagfiles – composite )

La performance pourrait-elle différer?

Techniquement, le souci de performance est négligeable. Le choix doit être fait en fonction des exigences fonctionnelles concrètes et du degré final d’abstraction, de réutilisation et de maintenabilité de la mise en œuvre. Chaque approche a son propre objective et ses limites bien définies.

Les composants composites ont cependant un surcoût important lors de la création / restauration de la vue (en particulier lors de la sauvegarde / restauration de l’état d’affichage). Et, dans les anciennes versions de Mojarra, les composants composites présentaient des problèmes de performance lors de l’atsortingbution de valeurs par défaut, ce qui est déjà corrigé depuis la version 2.1.13. De plus, Mojarra a eu une fuite de mémoire lorsqu’un est utilisé pour les expressions de méthode, essentiellement l’arborescence des composants est référencée dans la session HTTP, ceci est corrigé depuis le 2.1.29 / 2.2.8. La fuite de mémoire peut être contournée dans les versions 2.1 précédentes, comme ci-dessous:

  com.sun.faces.serializeServerState true  

Ou dans les anciennes versions 2.2 comme ci-dessous:

  javax.faces.SERIALIZE_SERVER_STATE true  

Cependant, lorsque vous avez relativement beaucoup de composants composites et que javax.faces.STATE_SAVING_METHOD défini sur client , les performances seront pénibles. N’abusez pas des composants composites si vous voulez simplement la fonctionnalité de base qui est déjà possible avec un simple fichier d’inclusion ou fichier de balises. N’utilisez pas la facilité de configuration (lisez: pas de fichier *.taglib.xml nécessaire) comme une excuse pour préférer les composants composites aux fichiers de balises.

Lorsque vous utilisez Mojarra 2.2.10 ou une version antérieure, n’oubliez pas de désactiver la période de rafraîchissement Facelets relativement courte pour le mode de production:

  javax.faces.FACELETS_REFRESH_PERIOD -1  

N’utilisez pas ce paramètre pour le développement, sinon vous devez redémarrer tout le serveur pour que les modifications apscopes aux fichiers Facelets soient sockets en compte! Mojarra 2.2.11 et versions ultérieures, et MyFaces ont déjà une valeur par défaut de -1 lorsque javax.faces.PROJECT_STAGE n’est pas défini sur Development .