Hier, j’ai assisté à une présentation sur Java Server Faces 2.0, qui était vraiment impressionnante, même si je suis actuellement un développeur ASP.NET MVC/jQuery heureux. Ce que j’ai le plus aimé de JSF est l’énorme Composants d'interface utilisateur prenant en charge AJAX, qui semblent rendre le développement beaucoup plus rapide qu'avec ASP.NET MVC, en particulier sur les sites utilisant une capacité AJAX élevée.
Étant donné que la présentation ne faisait que souligner les avantages de JSF, j'aimerais également entendre parler de l'autre côté.
Donc mes questions sont:
JSF 2.0 inconvénients? Honnêtement, mis à part la courbe d’apprentissage relativement abrupte lorsque vous n’avez pas une connaissance approfondie de développement Web de base (HTML/CSS/JS, côté serveur par rapport au côté client, etc.) et le basic Java API Servlet (demande/réponse/session, transfert/redirection, etc.), aucun inconvénient sérieux ne vient à l’esprit. JSF, dans sa version actuelle, doit encore se débarrasser de la image négative qu’elle a acquise au début de l’âge, au cours de laquelle il y a eu plusieurs inconvénients graves.
C'était la version initiale. Il était encombré de bugs affectant à la fois les domaines essentiels et les performances que vous ne souhaitiez pas connaître. Votre application Web n'a pas toujours fonctionné comme prévu. En tant que développeur, vous courriez beaucoup en pleurant.
C'était la version de correction de bug. La performance n'était pas encore beaucoup améliorée. Il y avait aussi un inconvénient majeur: vous ne pouvez pas parfaitement insérer du HTML dans la page JSF. Tous les fichiers plain Vanilla HTML sont rendus avantl’arborescence des composants JSF. Vous devez envelopper toute la vanille dans <f:verbatim>
balises afin qu’elles soient incluses dans l’arborescence des composants JSF. Bien que ce soit conforme à la spécification, cela a reçu beaucoup de critiques. Voir aussi a.o. JSF/Facelets: pourquoi n’est-ce pas une bonne idée de mélanger JSF/Facelets avec des balises HTML?
Il s'agissait de la première publication de la nouvelle équipe de développement JSF dirigée par Ryan Lubke. La nouvelle équipe a fait beaucoup de bon travail. Il y avait aussi des changements dans les spécifications. Le changement majeur a été l'amélioration de la gestion de la vue. Non seulement ce fichier JSF était complètement détaché de JSP, il était donc possible d'utiliser une technologie d'affichage différente de celle de JSP, mais il permettait également aux développeurs d'insérer du code HTML Vanilla simple dans la page JSF sans avoir à manipuler <f:verbatim>
Mots clés. Un autre objectif majeur de la nouvelle équipe était l'amélioration des performances. Pendant le cycle de vie de la JSF Reference Implementation 1.2 de Sun (nommée Mojarradepuis la version 1.2_08, autour de 2008), pratiquement chaque version a été livrée avec des améliorations (majeures) de performances similaires à celles habituelles. (corrections de bugs mineurs.
Le seul inconvénient majeur de JSF 1.x (y compris la version 1.2) est l’absence de portée entre la demande et sessionscope, le soi-disant conversationscope. Cela obligeait les développeurs à gérer des éléments d'entrée masqués, des requêtes de base de données inutiles et/ou à abuser de la portée de la session chaque fois que l'on souhaitait conserver les données de modèle initiales dans la requête suivante afin de traiter correctement les validations, les conversions, les modifications de modèle et les invocations d'action. applications Web complexes. La douleur pourrait être atténuée en adoptant une bibliothèque tierce qui conserve les données nécessaires dans la requête suivante, telle que MyFaces Tomahawk<t:saveState>
_ composant, JBoss Seam portée de la conversation et MyFaces Orchestra cadre de conversation.
Un autre inconvénient pour les puristes HTML/CSS est que JSF utilise le colon :
en tant que caractère séparateur d’ID pour garantir le caractère unique de l’élément HTML id
dans la sortie HTML générée, en particulier lorsqu'un composant est réutilisé plusieurs fois dans la vue (création de modèles, itération de composants, etc.). Comme il s’agit d’un caractère illégal dans les identificateurs CSS, vous devez utiliser le caractère \
pour échapper aux deux points dans les sélecteurs CSS, ce qui donne des sélecteurs laids et bizarres comme #formId\:fieldId {}
ou même #formId\3A fieldId {}
. Voir aussi Comment utiliser l'ID d'élément HTML généré par JSF avec deux points ":" dans les sélecteurs CSS? Cependant, si vous n'êtes pas puriste, lisez aussi Par défaut, JSF génère des identifiants inutilisables, qui sont incompatibles avec la partie css des standards web .
De plus, JSF 1.x n’a pas été livré avec les installations d’Ajax. Ce n’est pas vraiment un désavantage technique, mais à cause du battage médiatique du Web 2.0 au cours de cette période, cela est devenu un désavantage fonctionnel. Exadel était sur le point d'introduire Ajax4jsf, qui a été complètement développé au cours des années et qui est devenu l'élément central de la bibliothèque de composants de JBoss RichFaces . Une autre bibliothèque de composants a été livrée avec les pouvoirs Ajax intégrés, la plus connue étant ICEfaces .
À peu près à mi-parcours de la durée de vie de JSF 1.2, une nouvelle technologie d'affichage basée sur XML a été introduite: Facelets . Cela offrait d’énormes avantages par rapport à JSP, en particulier dans le domaine des modèles.
Ce fut la deuxième version majeure, avec Ajax comme mot à la mode. Il y a eu beaucoup de changements techniques et fonctionnels. JSP est remplacé par Facelets en tant que technologie d'affichage par défaut et Facelets a été élargi avec des fonctionnalités permettant de créer des composants personnalisés à l'aide de XML pur (appelé composants composites ). Voir aussi Pourquoi Facelets est-il préférable à JSP en tant que langage de définition de vue à partir de JSF 2.0??
Les pouvoirs Ajax ont été introduits à la saveur de la <f:ajax>
composant qui a beaucoup de similitudes avec Ajax4jsf. Les annotations et les améliorations de convention sur la configuration ont été introduites dans kill the verbose faces-config.xml
file autant que possible. De plus, le caractère de séparation par défaut du conteneur d’appel d’identification :
est devenu configurable, de sorte que les puristes HTML/CSS puissent respirer soulagés. Tout ce que vous avez à faire est de le définir comme init-param
dans web.xml
avec le nom javax.faces.SEPARATOR_CHAR
et vous assurer que vous n'utilisez vous-même le personnage dans aucun identifiant client, tel que -
.
Enfin et surtout, une nouvelle portée a été introduite, la vue scope. Il a éliminé un autre inconvénient majeur de JSF 1.x, comme décrit précédemment. Vous venez de déclarer le haricot @ViewScoped
pour activer l’étendue de la conversation sans tracasser tous les moyens de conserver les données dans les requêtes (conversationnelles) suivantes. UNE @ViewScoped
_ bean restera actif tant que vous soumettez et naviguez par la suite dans la même vue (indépendamment de l'onglet/de la fenêtre du navigateur ouvert!), de manière synchrone ou asynchrone (Ajax). Voir aussi Différence entre les étendues View et Request dans les beans gérés et Comment choisir l'étendue du bean correct?
Bien que pratiquement tous les inconvénients de JSF 1.x aient été éliminés, il existe des bogues spécifiques à JSF 2.0 qui pourraient devenir un obstacle. Le @ViewScoped
échoue dans les gestionnaires d'étiquettes en raison d'un problème poulet-oeuf en état de sauvegarde partielle. Ceci est corrigé dans JSF 2.2 et rétroporté dans Mojarra 2.1.18. En outre, en transmettant des attributs personnalisés, tels que HTML5 data-xxx
n'est pas supporté. Ce problème est résolu dans JSF 2.2 par la nouvelle fonctionnalité d’éléments/d’attributs passthrough. De plus, l'implémentation JSF de Mojarra a son propre ensemble de problèmes . Relativement nombreux sont liés au comportement parfois non intuitif de <ui:repeat>
, le nouvelle implémentation de sauvegarde d'état partiel et le portée de flash mal implémentée . La plupart d'entre eux sont corrigés dans une version Mojarra 2.2.x.
Aux alentours de JSF 2.0, PrimeFaces a été introduit, basé sur jQuery et jQuery UI. C'est devenu la bibliothèque de composants JSF la plus populaire.
Avec l'introduction de JSF 2.2, HTML5 était utilisé comme mot à la mode même s'il était techniquement pris en charge dans toutes les versions plus anciennes de JSF. Voir aussi prise en charge de JavaServer Faces 2.2 et HTML5, pourquoi le XHTML est-il toujours utilisé . La nouvelle fonctionnalité la plus importante de JSF 2.2 est la prise en charge des attributs de composant personnalisés, ouvrant ainsi un monde de possibilités, telles que groupes de boutons radio personnalisés sans tablea .
Mis à part les bogues spécifiques à l'implémentation et certaines "petites choses ennuyantes" telles que l'incapacité d'injecter un EJB dans un validateur/convertisseur (déjà corrigé dans JSF 2.3), la spécification JSF 2.2 ne présente pas d'inconvénient majeur.
Certains pourraient penser que le principal inconvénient de JSF est qu’il permet très peu de contrôle précis sur le code HTML/CSS/JS généré. Ce n'est pas le propre de JSF, c'est simplement parce que c'est un framework basé sur des composants MVC, pas un framework basé sur des requêtes (actions)MVC. Si vous avez besoin de beaucoup de contrôle du code HTML/CSS/JS lorsque vous envisagez un framework MVC, vous ne devriez pas déjà vous intéresser à un framework MVC basé sur des composants, mais à un framework MVC basé sur des requêtes, tel que Spring MVC). . Il vous suffit de prendre en compte le fait que vous devrez écrire vous-même tout ce que vous voulez HTML/CSS/JS. Voir aussi Différence entre Request MVC et Component MVC .
Après 5 ans de travail avec JSF, je pense pouvoir ajouter mes 2 centimes.
Deux inconvénients majeurs JSF:
Et mineurs inconvénients qui me viennent à l’esprit:
<ui:remove>
A besoin d’un contenu syntaxiquement correct, qui est quand même analysé.isRendered()
dans la méthode processXxx()
avant de continuer.Ne vous méprenez pas. En tant que framework de composants, JSF dans la version 2 est vraiment bon, mais reste basé sur des composants, et sera toujours ...
Veuillez regarder la faible popularité de Tapestry, Wicket et le faible enthousiasme des développeurs JSF expérimentés (ce qui est encore plus significatif). Et pour le contraste, jetez un coup d'œil au succès de Rails, Grails, Django, Play! Framework - ils sont tous basés sur des actions et n'essayent pas de se cacher du programmeur vraie demande/réponse et nature sans état du Web.
Pour moi, c'est le principal inconvénient de JSF. IMHO JSF peut convenir à certains types d'applications (intranet, intensif en formulaires), mais dans la vie réelle web application, ce n'est pas une bonne solution.
J'espère que cela aidera quelqu'un avec ses choix en ce qui concerne le front-end.
Quelques inconvénients qui me viennent à l’esprit:
Pour résumer: Le temps que vous gagnerez avec JSF, en évitant d’écrire le code JSP/servlet/bean, vous le passerez x10 pour le faire évoluer et faire exactement ce que vous voulez. faire.
Pour moi, le plus gros désavantage de JSF 2.0 est la courbe d’apprentissage non seulement de JSF, mais également des bibliothèques de composants que vous devez utiliser pour le rendre utile. Considérez le nombre impressionnant de spécifications et de normes que vous avez gérées pour être vraiment compétent:
Maintenant, une fois que vous en avez fini, vous pouvez vous mettre au travail avec les spécifications propriétaires, à savoir les bibliothèques de composants et les bibliothèques de fournisseurs que vous choisirez en cours de route:
Et n'oubliez pas le conteneur! Et tous ces fichiers de configuration:
Donc - CECI IS RENDRE SIMPLE? Bien sûr, JSF 2.0 est "facile" tant que vous ne voulez que faire les pages Web les plus simples avec les interactions les plus simples.
En termes simples, JSF 2.0 est le mélange le plus compliqué et le plus encombrant de technologies collées existant actuellement dans l’univers logiciel. Et je ne peux penser à rien que je préférerais utiliser.
En résumé, mes inconvénients seraient les suivants: complexité, progrès de développement peu rapides, buggy, inflexible.
Bien sûr, il y a aussi des avantages, mais ce n'est pas ce que vous avez demandé. Quoi qu’il en soit, c’est mon expérience avec framework. D’autres pourraient avoir des opinions divergentes. Le mieux est donc de l’essayer pendant un moment pour voir si c’est pour vous (quelque chose de plus complexe - pas d’exemples naïfs - JSF brille vraiment ici :) IMHO: meilleur exemple d’utilisation pour JSF est une application métier, comme un CRM, etc.
"JSF générera le code HTML et le code JavaScript de la couche de visualisation que vous ne pouvez ni contrôler ni modifier sans entrer dans le code du contrôleur."
En fait, JSF vous donne la flexibilité, vous pouvez utiliser des composants standard/tiers ou créer vos propres composants, ce qui vous permet de contrôler totalement ce qui est rendu. C'est juste un xhtml dont vous avez besoin pour créer vos composants personnalisés avec JSF 2.0.
Nous avons développé un exemple de projet avec JSF (Il s’agissait d’une recherche de trois semaines et nous risquons de perdre certaines choses!)
Nous essayons d'utiliser core jsf, si un composant est nécessaire, nous avons utilisé PrimeFaces.
Le projet était un site Web avec navigation. Chaque page doit être chargée via ajax lorsque le menu est cliqué.
Le site a deux cas d'utilisation:
Nous avons trouvé que:
ajaxComplete
et nous avons constaté que le PF 4 avait implémenté ses propres événements ajax. Nous avions quelques composants jQuery et nous devons changer leur code.Si vous modifiez l'exemple ci-dessus en un projet non Ajax (ou au moins moins d'un projet ajax), vous ne rencontrerez pas beaucoup de problèmes ci-dessus.
Nous résumons nos recherches comme suit:
JSF ne fonctionne pas bien sur un site Web de base entièrement ajax.
Bien sûr, nous trouvons dans JSF de nombreuses fonctionnalités intéressantes qui peuvent s'avérer très utiles dans certains projets, alors tenez compte de vos besoins.
Veuillez vous reporter aux documents techniques de JSF pour examiner les avantages de JSF et, à mon avis, le plus gros avantage de JSF est le support COMPLET ET ÉNORME de @BalusC ;-)
Je ne suis pas du tout expert Java Server Faces. Mais, à mon humble avis, le principal inconvénient est qu'il est côté serveur. J'en ai assez d'apprendre et d'utiliser des frameworks de couche de présentation Web côté serveur comme ASP.NET Web Forms, ASP.NET MVC, Java Faces serveur, Struts, frameworks php et Ruby sur Rails. I dit au revoir à tous, et bonjour à Angularjs et à TypeScript, ma couche de présentation s'exécute sur le navigateur. Peu importe qu'elle soit servie par Windows IIS avec php ou ASP. NET, ou s’il est servi par un serveur Web Apache fonctionnant sous Linux, il me suffit de connaître un seul framework qui fonctionne partout.
Juste mes deux cents.
Commentant mes derniers mois d’expérience Primefaces/JSF:
La promesse de JSF d'éviter d'écrire du javascript s'est traduite par l'écriture de plus de javascript que si nous n'avions pas utilisé Primefaces - et que javascript corrige ce que Primefaces a cassé.
C'est un temps perdu - à moins que vous n'utilisiez à nouveau du matériel "standard". Aussi vraiment moche (Primefaces) lorsqu’on doit travailler avec Selenium. Tout peut être fait, mais encore une fois, le temps est compté.
Evitez cela si vous travaillez avec une équipe de conception UX/et que vous avez besoin d'itérer rapidement l'interface utilisateur - vous pouvez gagner du temps en apprenant à écrire/écrire du code HTML directement - ou en regardant réactif/angulaire.
Pour moi, le plus gros inconvénient de JSF est la prise en charge insuffisante des pages générées par programmation (de manière dynamique).
Si vous souhaitez construire votre page (créer un modèle de composant de page) de manière dynamique à partir de Java. Par exemple, si vous travaillez sur le constructeur de page Web WYSIWYG. Documentation adéquate de ce cas d'utilisation Il existe de nombreux points où il faut expérimenter et le développement est assez lent.Beaucoup de choses ne fonctionnent pas comme prévu, mais en général, il est possible de le bidouiller.
La bonne chose est que ce n'est pas un problème de philosophie ou d'architecture de JSF. Ce n'est tout simplement pas assez élaboré (à ma connaissance).
JSF 2 a apporté Composites Composés qui devrait faciliter le développement de composants, mais leur support pour la construction dynamique (programmatique) est très médiocre. Si vous surmontez un processus compliqué et presque non documenté de construction dynamique de composants composites, vous découvrirez que si vous imbriquez quelques composants composites un peu plus profondément, ils cessent de fonctionner, lançant quelques exceptions.
Mais il semble que la communauté JSF est consciente de ces lacunes. Ils travaillent dessus comme vous pouvez le voir sur ces deux bugs
http://Java.net/jira/browse/JAVASERVERFACES-1309
http://Java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-599
La situation devrait être meilleure avec JSF 2.2 au moins si nous parlons de spécification.
JSF a de nombreux avantages, la question étant en désavantage, permettez-moi d'ajouter quelques points à ce sujet.
Sur un scénario pratique de mise en œuvre d'un projet Web avec une période de temps, vous devez garder un œil sur les facteurs suivants.
Avez-vous la bande passante nécessaire à la courbe d’apprentissage initiale?
Avez-vous suffisamment d’expertise dans votre équipe pour pouvoir passer en revue le JSF?
produits produits par les développeurs?
Si votre réponse est "Non" pour les questions, vous risquez de vous retrouver dans une base de code non maintenable.
Parmi tous les cadres "grand public" tels que Spring MVC, Wicket, Tapestry, etc., le JSF de Java EE avec ses composants composites est la technologie la plus élaborée en matière de couche de présentation et orientée composant fournie. Il est un peu lourd et incomplet par rapport aux solutions fournies par HybridJava.
JSF n'a qu'un seul inconvénient: avant de commencer le développement "JSF", vous devez bien comprendre le développement Web, l'architecture de base Java et l'architecture frontale.
De nos jours, les "nouveaux" frameworks JavaScript essaient simplement de copier/coller le modèle à base de composants "JSF".