J'espère que dans cet article, je pourrai obtenir l'opinion des gens sur les meilleures pratiques en matière d'interface entre les pages JSF et les beans de sauvegarde.
Une chose sur laquelle je ne peux jamais m'installer est la structure de mes haricots. De plus, je n'ai jamais trouvé un bon article sur le sujet.
Quelles propriétés appartiennent à quels haricots? Quand est-il approprié d'ajouter plus de propriétés à un bean donné plutôt que de créer un nouveau bean et d'y ajouter les propriétés? Pour les applications simples, est-il judicieux d’avoir un seul haricot de sauvegarde pour toute la page, compte tenu de la complexité liée à l’injection d’un haricot dans un autre? Le bean de support doit-il contenir une logique métier réelle ou doit-il contenir strictement des données?
N'hésitez pas à répondre à ces questions et à d’autres éventuelles.
En ce qui concerne la réduction du couplage entre la page JSF et le bean de support, je ne permets jamais à la page JSF d’accéder aux propriétés des propriétés du bean de support. Par exemple, je n'autorise jamais quelque chose comme:
<h:outputText value="#{myBean.anObject.anObjectProperty}" />
J'ai toujours besoin de quelque chose comme:
<h:outputText value="#{myBean.theObjectProperty}" />
avec une valeur de haricot de support de:
public String getTheObjectProperty()
{
return anObject.getAnObjectProperty();
}
Lorsque je boucle sur une collection, j'utilise une classe wrapper pour éviter de faire un zoom avant sur un objet d'une table de données, par exemple.
En général, cette approche me semble "juste". Cela évite tout couplage entre la vue et les données. Corrigez-moi si j'ai tort, s'il-vous plait.
Vous voudrez peut-être vérifier ceci: faire des distinctions entre différents types de beans gérés par JSF .
Voici une description des différents types de haricots, tels que définis dans l'article ci-dessus de Neil Griffin:
Excellente question. J'ai beaucoup souffert du même dilemme quand j'ai déménagé à JSF. Cela dépend vraiment de votre application. Je viens du monde Java EE. Je vous recommande donc d’avoir le moins de logique commerciale possible dans vos beans de support. Si la logique est purement liée à la présentation de votre page, c’est bien de l'avoir dans le haricot de sauvegarde.
Je pense que l’un des atouts (nombreux) de JSF réside dans le fait que vous pouvez exposer des objets de domaine directement sur les beans gérés. Je recommande donc fortement le <:outputText value="#{myBean.anObject.anObjectProperty}" />
, sinon vous faites trop de travail pour exposer manuellement chaque propriété. De plus, l'insertion ou la mise à jour de données créerait un désordre si vous encapsuliez toutes les propriétés. Il existe des situations où un seul objet de domaine peut ne pas être suffisant. Dans ces cas, je prépare un ValueObject avant de l'exposer sur le haricot.
EDIT: si vous voulez encapsuler chaque propriété d’objet que vous voulez exposer, je vous recommanderais plutôt de lier les composants d’UI au bean de support, puis d’injecter le contenu directement dans la valeur du composant.
Pour ce qui est de la structure des haricots, le tournant a été pour moi lorsque j’ignorais avec force tout ce que je savais sur la création d’applications Web et commençais à le traiter comme une application à interface graphique. JSF imite beaucoup Swing et par conséquent, les meilleures pratiques pour développer des applications Swing s’appliqueraient principalement à la création d’applications JSF.
Je pense que la chose la plus importante avec vos haricots de sauvegarde est de séparer leurs logiques. Si vous avez une page de garde pour un système de gestion de contenu, je considérerais comme une mauvaise pratique de mettre chaque morceau de code dans un seul haricot, car:
Juste mes 2 centimes à ce sujet même avec la question déjà marquée comme réponse.
Je ne répondrais peut-être pas à toutes vos questions car peu d’entre elles semblent assez dépendantes des cas à cas.
C'est bien d'avoir une logique métier dans votre bean backing. Cela dépend d'où venez-vous. Si vous pratiquez la conception axée sur le domaine, vous serez tenté d'inclure la logique métier dans le bean de sauvegarde ou vous pourrez également utiliser la logique de persistance. Ils soutiennent que pourquoi objet si bête. L'objet ne devrait pas seulement contenir un état, mais aussi un comportement. D'autre part, si vous considérez la manière traditionnelle Java EE, vous pourriez avoir l'impression d'avoir des données dans votre bean de support, qui peut également être votre bean entité, et une autre logique de gestion et de persistance dans un haricot de session ou quelque chose du même genre.
Son parfaitement bien d'avoir un haricot simple pour toute la page. Je ne vois pas de problème avec cela seul. Cela peut ne pas sembler correct, mais cela dépend du cas.
Votre autre question dépend beaucoup plus du cas que vous avez en main. Je préférerais utiliser un domaine déterminé ici, il peut être approprié d’ajouter des propriétés à l’existant ou de créer un nouveau bean pour cela. Ce qui convient le mieux. Je ne pense pas qu'il y ait une solution miracle pour cela.
Quelles propriétés appartient à quelle haricot de sauvegarde. Eh bien, cela ne dépend-il pas de l'objet de domaine? Ou peut-être que la question n'est pas si claire.
De plus, dans votre exemple de code, je ne vois aucun avantage énorme.
Je n'aurais pas besoin de ne garder qu'un seul haricot par page. Cela dépend des fonctionnalités, mais la plupart du temps, je n'avais qu'un seul haricot par page, la plupart du temps une page gérant une fonctionnalité. Par exemple, sur une page, j'ai un lien d'inscription (je vais créer un lien avec RegisterBean) et un lien de panier d'achat (ShoopingBasketBean).
J'utilise ce <: outputText value = "# {myBean.anObject.anObjectProperty}" /> comme je conserve normalement des beans de sauvegarde en tant que beans actions contenant un objet de données. Je ne veux pas écrire un wrapper dans mon bean de support pour accéder aux propriétés de mes objets de données.
J'aime tester le code métier sans View's, je considère donc BackingBeans comme des interfaces de View à code de modèle. Je ne mets jamais aucune règle ou processus dans un BackingBean. Ce code va dans Services ou Helpers, permettant sa réutilisation.
Si vous utilisez des validateurs, mettez-les hors de votre BackingBean et faites-les référence à partir de votre méthode de validation.
Si vous accédez aux DAO pour remplir les sélections, radios, cases à cocher, faites-le toujours à partir d'un BackingBean.
Crois moi!. Vous pouvez injecter un JavaBean dans un BackingBean, mais essayez d’injecter un BackingBean dans un autre. Vous serez bientôt dans un environnement de maintenance et de compréhension du code.