Gestern habe ich eine Präsentation auf Java Server Faces 2.0 gesehen, die wirklich beeindruckend ausgesehen hat, obwohl ich derzeit ein glücklicher ASP.NET MVC/jQuery-Entwickler bin AJAX-fähige UI-Komponenten, die die Entwicklung vor allem auf AJAX-lastigen Sites deutlich beschleunigen als mit ASP.NET MVC.
Da die Präsentation nur die Vorteile von JSF hervorhob, würde ich gerne auch von der anderen Seite hören.
Meine Fragen sind also:
JSF 2.0 Nachteile? Mal ganz ehrlich, abgesehen von der relativ steilen Lernkurve, wenn Sie kein solides Hintergrundwissen über grundlegende Webentwicklung haben. (HTML/CSS/JS, Server-Seite versus Client-Seite, etc) und der basic Java Servlet API (Anfrage/Antwort/Sitzung, Weiterleitung/Umleitung, etc), treten keine gravierenden Nachteile auf JSF muss in seiner aktuellen Version noch das negative Image beseitigen, das es in den frühen Jahren gewonnen hat, in denen es mehrere schwerwiegende Nachteile gab.
Dies war die Erstveröffentlichung. Es war voll mit Fehlern in den Kern- und Leistungsbereichen, über die Sie nichts wissen wollen. Ihre Webanwendung funktionierte nicht immer so, wie Sie es intuitiv erwartet hatten. Du als Entwickler würdest weinen.
Dies war die Bugfix-Version. Die Leistung wurde noch nicht wesentlich verbessert. Es gab auch einen großen Nachteil: Sie können nicht einwandfrei HTML in die JSF-Seite einbinden. Alle einfachen Vanilla-HTML-Dateien werden gerendert vor dem JSF-Komponentenbaum. Sie müssen alle einfachen Vanilla-Tags in <f:verbatim>
einschließen, damit sie in den JSF-Komponentenbaum aufgenommen werden. Obwohl dies der Spezifikation entsprach, wurde dies vielfach kritisiert. Siehe auch a.o. JSF/Facelets: Warum ist es nicht sinnvoll, JSF/Facelets mit HTML-Tags zu mischen?
Dies war die erste Veröffentlichung des neuen JSF-Entwicklungsteams unter der Leitung von Ryan Lubke. Das neue Team hat eine Menge großartiger Arbeit geleistet. Es gab auch Änderungen in der Spezifikation. Die wesentliche Änderung war die Verbesserung des View-Handlings. Dadurch wurde JSF nicht nur vollständig von JSP getrennt, sondern es konnte auch eine andere View-Technologie als JSP verwendet werden. Entwickler konnten damit auch einfaches Vanilla-HTML in die JSF-Seite einbinden, ohne sich mit <f:verbatim>
-Tags herumärgern zu müssen. Ein weiterer Schwerpunkt des neuen Teams lag in der Leistungssteigerung. Während der Laufzeit von Sun JSF Reference Implementation 1.2 (Codename Mojarra seit Build 1.2_08, um 2008) wurde praktisch jeder Build mit (großen) Leistungsverbesserungen ausgeliefert übliche (kleinere) Bugfixes.
Der einzige schwerwiegende Nachteil von JSF 1.x (einschließlich 1.2) ist das Fehlen eines Bereichs zwischen request und session , der so genannte conversation scope. Dies zwang Entwickler, sich mit versteckten Eingabeelementen, unnötigen DB-Abfragen und/oder dem Missbrauch des Sitzungsbereichs herumzuschlagen, wenn die ursprünglichen Modelldaten in der nachfolgenden Anforderung beibehalten werden sollen, um Validierungen, Konvertierungen, Modelländerungen und Aktionsaufrufe erfolgreich zu verarbeiten komplexe Webanwendungen. Der Schmerz könnte gemildert werden, indem eine Bibliothek eines Drittanbieters verwendet wird, die die erforderlichen Daten in der nachfolgenden Anforderung beibehält, z. B. MyFaces Tomahawk<t:saveState>
component, JBoss Seam Konversationsumfang und MyFaces Orchestra Konversationsrahmen.
Ein weiterer Nachteil für HTML/CSS-Puristen ist, dass JSF den Doppelpunkt :
als ID-Trennzeichen verwendet, um die Eindeutigkeit des HTML-Elements id
in der generierten HTML-Ausgabe sicherzustellen, insbesondere wenn eine Komponente häufiger wiederverwendet wird als einmal in der Ansicht (Vorlagen erstellen, Komponenten iterieren usw.). Da dies in CSS-Bezeichnern ein unzulässiges Zeichen ist, müssen Sie den \
verwenden, um den Doppelpunkt in CSS-Selektoren zu umgehen. Dies führt zu hässlichen und seltsam aussehenden Selektoren wie #formId\:fieldId {}
oder sogar #formId\3A fieldId {}
. Siehe auch Wie verwende ich die JSF-generierte HTML-Element-ID mit Doppelpunkt ":" in CSS-Selektoren? Wenn Sie jedoch kein Purist sind, lesen Sie auch Standardmäßig generiert JSF nicht verwendbare IDs, die nicht mit dem CSS-Teil der Webstandards kompatibel sind.
Außerdem wurde JSF 1.x nicht mit sofort einsatzbereiten Ajax-Funktionen ausgeliefert. Kein wirklicher technischer Nachteil, aber aufgrund des Web 2.0-Hype in dieser Zeit wurde es zu einem funktionalen Nachteil. Exadel hat frühzeitig Ajax4jsf eingeführt, das im Laufe der Jahre gründlich weiterentwickelt wurde und der Kern von JBoss RichFaces Komponentenbibliothek. Eine weitere Komponentenbibliothek wurde ebenfalls mit integrierten Ajax-Funktionen ausgeliefert. Die bekannte ist ICEfaces .
Ungefähr zur Hälfte der Lebensdauer von JSF 1.2 wurde eine neue XML-basierte View-Technologie eingeführt: Facelets . Dies bot enorme Vorteile gegenüber JSP, insbesondere im Bereich Templating.
Dies war die zweite Hauptversion mit Ajax als Schlagwort. Es gab viele technische und funktionale Änderungen. JSP wird durch Facelets als Standardansichtstechnologie ersetzt, und Facelets wurde um Funktionen zum Erstellen benutzerdefinierter Komponenten unter Verwendung von reinem XML (die sogenannten Composite Components ) erweitert. Siehe auch Warum wird Facelets gegenüber JSP als Ansichtsdefinitionssprache ab JSF2.0 bevorzugt?
Ajax-Potenzen wurden in der Version der <f:ajax>
-Komponente eingeführt, die viele Ähnlichkeiten mit Ajax4jsf aufweist. Anmerkungen und Verbesserungen in Bezug auf die Konfiguration gegenüber Konventionen wurden so weit wie möglich in kill der ausführlichen faces-config.xml
-Datei eingefügt. Außerdem wurde das Standardtrennzeichen für die Namenscontainer-ID :
konfigurierbar, sodass HTML/CSS-Puristen erleichtert atmen konnten. Alles, was Sie tun müssen, ist, es als init-param
in web.xml
mit dem Namen javax.faces.SEPARATOR_CHAR
zu definieren und sicherzustellen, dass Sie das Zeichen nicht selbst in Client-IDs verwenden , wie zum Beispiel -
.
Last but not least wurde ein neuer Bereich eingeführt, der view Bereich. Es beseitigte einen weiteren großen JSF 1.x-Nachteil, wie zuvor beschrieben. Sie müssen nur das Bean @ViewScoped
deklarieren, um den Konversationsbereich zu aktivieren, ohne die Daten in nachfolgenden (Konversations-) Anforderungen auf mühsame Weise zu speichern. Eine @ViewScoped
Bean bleibt so lange gültig, wie Sie anschließend (unabhängig vom geöffneten Browser-Tab/-Fenster!) Synchron oder asynchron (Ajax) dieselbe Ansicht senden und zu dieser navigieren. Siehe auch Unterschied zwischen Ansichts- und Anforderungsbereich in verwalteten Beans und Wie wird der richtige Bean-Bereich ausgewählt?
Obwohl praktisch alle Nachteile von JSF 1.x beseitigt wurden, gibt es JSF 2.0-spezifische Fehler, die zu einem Showstopper werden könnten. Das @ViewScoped
schlägt in den Tag-Handlern aufgrund eines Hühnerei-Problems beim teilweisen Speichern des Status fehl. Dies ist in JSF 2.2 behoben und in Mojarra 2.1.18 zurückportiert. Außerdem wird das Übergeben von benutzerdefinierten Attributen wie HTML5 data-xxx
nicht unterstützt. Dies wird in JSF 2.2 durch die neue Funktion für Durchgriffselemente/Attribute behoben. Weiterhin hat die JSF-Implementierung von Mojarra ihre eigenen Probleme . Relativ viele von ihnen haben mit dem manchmal nicht intuitiven Verhalten von <ui:repeat>
zu tun, der neuen Implementierung zum Speichern von Teilzuständen und der schlecht implementierte Flash-Bereich . Die meisten von ihnen sind in einer Mojarra 2.2.x-Version behoben.
Um die JSF 2.0-Zeit herum wurde PrimeFaces eingeführt, basierend auf jQuery und jQuery UI. Es wurde die beliebteste JSF-Komponentenbibliothek.
Mit der Einführung von JSF 2.2 wurde HTML5 als Schlagwort verwendet, obwohl dies technisch nur in allen älteren JSF-Versionen unterstützt wurde. Siehe auch JavaServer Faces 2.2 und HTML5-Unterstützung, warum wird XHTML immer noch verwendet . Die wichtigste neue JSF 2.2-Funktion ist die Unterstützung von benutzerdefinierten Komponentenattributen, wodurch eine Vielzahl von Möglichkeiten eröffnet wird, z. B. benutzerdefinierte tabellenlose Optionsfeldgruppen .
Abgesehen von implementierungsspezifischen Fehlern und einigen "ärgerlichen Kleinigkeiten" wie der Unfähigkeit, einen EJB in einen Validator/Konverter zu injizieren (bereits in JSF 2.3 behoben), gibt es in der JSF 2.2-Spezifikation nicht wirklich große Nachteile.
Einige mögen der Meinung sein, dass der Hauptnachteil von JSF darin besteht, dass es sehr wenig feinkörnige Kontrolle über das generierte HTML/CSS/JS ermöglicht. Das ist kein JSF-eigenes, sondern nur, weil es sich um ein komponentenbasiertes MVC-Framework handelt, nicht um ein anforderungsbasiertes MVC-Framework. Wenn ein hohes Maß an Kontrolle über HTML/CSS/JS bei der Betrachtung eines MVC-Frameworks Ihre Hauptanforderung ist, sollten Sie sich bereits jetzt kein komponentenbasiertes MVC-Framework, sondern ein anforderungsbasiertes MVC-Framework wie Spring MVC . Sie müssen nur berücksichtigen, dass Sie das gesamte HTML/CSS/JS-Boilerplate selbst schreiben müssen. Siehe auch Unterschied zwischen Anforderungs-MVC und Komponenten-MVC .
Nach 5 Jahren bei JSF denke ich, dass ich meine 2 Cent hinzufügen kann.
Zwei Hauptnachteile von JSF :
Und kleinere Nachteile, die mir einfallen:
<ui:remove>
Benötigt syntaktisch korrekten Inhalt, der trotzdem analysiert wird.isRendered()
nicht innerhalb der processXxx()
-Methode, bevor Sie fortfahren.Versteh mich nicht falsch. Als Komponentenframework ist JSF in Version 2 wirklich gut, aber es basiert immer noch auf Komponenten und wird immer ...
Bitte werfen Sie einen Blick auf die geringe Popularität von Tapestry, Wicket und die geringe Begeisterung erfahrener JSF-Entwickler (was noch bedeutsamer ist). Schauen Sie sich im Gegensatz dazu den Erfolg von Rails, Grails, Django, Play an! Framework - sie alle sind aktionsbasiert und versuchen nicht, sich vor dem Programmierer zu verstecken . Wahre Anfrage/Antwort und zustandslose Natur des Webs.
Für mich ist es ein großer Nachteil von JSF. IMHO JSF eignet sich für bestimmte Arten von Anwendungen (Intranet, formenintensiv), aber für reale Webanwendungen ist dies kein guter Weg.
Hoffe, es hilft jemandem bei seinen/ihren Entscheidungen in Bezug auf Frontend.
Ein paar Nachteile, die Ihnen in den Sinn kommen:
m es zusammenzufassen: Die Zeit, die Sie mit JSF sparen, nachdem Sie vermieden haben, den JSP/Servlet/Bean-Code zu schreiben, haben Sie dafür ausgegeben, ihn x10 zu skalieren und genau das zu tun, was Sie wollen machen.
Für mich ist der größte Nachteil von JSF 2.0 nicht nur die Lernkurve von JSF, sondern auch die Komponentenbibliotheken, die Sie verwenden müssen, um nützliche Arbeit zu leisten. Betrachten Sie die erstaunliche Anzahl von Spezifikationen und Standards, mit denen Sie sich befassen, um wirklich kompetent zu sein:
Sobald Sie damit fertig sind, können Sie mit den proprietären Spezifikationen, nämlich den Komponentenbibliotheken und Anbieterbibliotheken, fortfahren, die Sie auf dem Weg abrufen werden:
Und vergiss den Container nicht! Und all diese Konfigurationsdateien:
Also - DIESE IS EINFACH? Sicher, JSF 2.0 ist "einfach", solange Sie nur die grundlegendsten Webseiten mit den einfachsten Interaktionen ausführen möchten.
Einfach ausgedrückt ist JSF 2.0 das komplizierteste und umständlichste Durcheinander von zusammengeklebten Technologien, wie es im heutigen Softwareuniversum existiert. Und mir fällt nichts ein, was ich lieber benutzen würde.
Kurz gesagt, meine Nachteile wären: Komplexität, nicht sehr reibungsloser Entwicklungsfortschritt, fehlerhaft, unflexibel.
Natürlich gibt es auch Vorteile, aber das haben Sie nicht gefragt. Sowieso ist das meine Erfahrung mit Framework, für das andere möglicherweise unterschiedliche Meinungen haben. Am besten probieren Sie es einfach für eine Weile aus, um zu sehen, ob es für Sie geeignet ist (nur etwas komplexeres - keine naiven Beispiele - JSF scheint wirklich dort :) IMHO bester Anwendungsfall für JSF ist Geschäftsanwendungen, wie CRMs etc ...
"JSF gibt View-Layer-HTML und JavaScript aus, die Sie nicht steuern oder ändern können, ohne in den Controller-Code zu wechseln."
Tatsächlich gibt Ihnen JSF die Flexibilität, Sie können entweder Standard-/Drittanbieter-Komponenten verwenden oder eigene Komponenten erstellen, die Sie vollständig steuern können, was gerendert wird. Es ist nur ein xhtml, das Sie benötigen, um Ihre benutzerdefinierten Komponenten mit JSF 2.0 zu erstellen.
Wir haben ein Beispielprojekt mit JSF entwickelt (es war eine dreiwöchige Recherche, daher haben wir möglicherweise einige Dinge verloren!)
Wir versuchen, core jsf zu verwenden. Wenn eine Komponente benötigt wird, haben wir PrimeFaces verwendet.
Das Projekt war eine Website mit Navigation. Jede Seite sollte über Ajax geladen werden, wenn auf das Menü geklickt wird.
Die Site hat zwei Verwendungszwecke:
Wir haben das gefunden:
ajaxComplete
abgeschlossen ist, und wir haben festgestellt, dass der PF 4 seine eigenen Ajax-Ereignisse implementiert hat. Wir hatten einige jQuery-Komponenten und müssen ihren Code ändern.Wenn Sie das obige Beispiel in ein nicht Ajax - Projekt (oder zumindest ein weniger Ajax-Projekt) ändern, werden Sie nicht mit vielen der oben genannten Probleme konfrontiert.
Wir fassen unsere Forschung wie folgt zusammen:
JSF funktioniert auf einer vollständig ajax-basierten Website nicht gut.
Natürlich finden wir in JSF viele nette Funktionen, die in einigen Projekten sehr hilfreich sein können. Berücksichtigen Sie also Ihre Projektanforderungen.
Informationen zu den Vorteilen von JSF finden Sie in den technischen Dokumenten von JSF. Der größte Vorteil von JSF ist meiner Meinung nach die KOMPLETTE UND GROSSE Unterstützung von @BalusC ;-)
Ich bin überhaupt kein Java Server Faces-Experte. Aber meiner Meinung nach ist der Hauptnachteil, dass es sich um eine Serverseite handelt. Ich bin es leid, serverseitige Frameworks für Webpräsentationsebenen wie ASP.NET zu lernen und zu verwenden Web Forms, ASP.NET MVC, Java Server Faces, Struts, PHP Frameworks und Ruby on Rails Frameworks. I Ich habe mich von allen verabschiedet und mich von Angularjs und TypeScript verabschiedet. Meine Präsentationsebene wird im Browser ausgeführt. Es spielt keine Rolle, ob sie von Windows IIS mit PHP oder ASP ausgeführt wird. NET, oder wenn es von einem Apache-Webserver unter Linux bereitgestellt wird. Ich muss nur ein Framework lernen, das überall funktioniert.
Nur meine zwei Cent.
Kommentar zu meinen letzten Monaten mit Primefaces/JSF:
Das Versprechen von JSF, das Schreiben von Javascript zu vermeiden, verwandelte sich in das Schreiben von mehr Javascript, als wir hätten, wenn Primefaces nicht verwendet würden.
Es ist eine Zeitsenke - es sei denn, Sie verwenden wieder Sachen von der Stange. Auch sehr hässlich (Primefaces), wenn man mit Selen arbeiten muss. Es kann alles gemacht werden - aber es bleibt nur so viel Zeit.
Vermeiden Sie dies auf jeden Fall, wenn Sie mit einem UX-/Designteam zusammenarbeiten und schnell auf der Benutzeroberfläche iterieren müssen. Sie können Zeit sparen, indem Sie lernen, wie man HTML-Code abruft oder direkt schreibt.
Das größte Manko von JSF ist für mich die schlechte Unterstützung für programmatisch (dynamisch) generierte Seiten.
Wenn Sie Ihre Seite dynamisch aus dem Code Java) erstellen möchten, zum Beispiel, wenn Sie am WYSIWYG-Webseiten-Konstruktor arbeiten. Angemessene Dokumentation dieses Anwendungsfalls in nicht allgemein verfügbar. Es gibt viele Punkte, an denen Sie experimentieren müssen und die Entwicklung ist sehr langsam. Viele Dinge funktionieren einfach nicht so, wie Sie es erwarten würden. Aber im Allgemeinen ist es möglich, es irgendwie zu hacken.
Gut ist, dass es in der Philosophie oder Architektur von JSF kein Problem gibt. Es ist einfach nicht genug ausgearbeitet (soweit ich weiß).
JSF 2 brachte Composite Components mit, die die Entwicklung von Komponenten vereinfachen sollten, deren Unterstützung für dynamische (programmatische) Konstruktionen jedoch sehr gering ist. Wenn Sie einen recht komplizierten und fast undokumentierten Prozess der dynamischen Konstruktion von Verbundbauteilen überwinden, werden Sie feststellen, dass wenige Verbundbauteile nicht mehr funktionieren, wenn Sie sie etwas tiefer verschachteln, was einige Ausnahmen zur Folge hat.
Es scheint jedoch, dass die JSF-Gemeinschaft sich dieser Mängel bewusst ist. Sie arbeiten daran, wie Sie an diesen beiden Fehlern sehen können
http://Java.net/jira/browse/JAVASERVERFACES-1309
http://Java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-599
Mit JSF 2.2 sollte die Situation zumindest dann besser sein, wenn es sich um Spezifikationen handelt.
JSF hat viele Vorteile, da die Frage im Nachteil ist, möchte ich ein paar Punkte hinzufügen.
In einem praktischen Szenario für die Implementierung eines Webprojekts in einem bestimmten Zeitraum müssen Sie die folgenden Faktoren im Auge behalten.
Haben Sie die Bandbreite, um die anfängliche Lernkurve aufzunehmen?
Haben Sie genügend Fachwissen in Ihrem Team, das die JSF überprüfen kann?
Zeug produziert von den Entwicklern?
Lautet Ihre Antwort bei den Fragen "Nein", landen Sie möglicherweise in einer nicht verwaltbaren Codebasis.
Unter allen "Mainstream" -Frameworks wie Spring MVC, Wicket, Tapestry usw. ist das JSF von Java EE mit seinen zusammengesetzten Komponenten die am besten ausgearbeitete Präsentationsebene und komponentenorientierte Technologie Es ist etwas umständlich und unvollständig im Vergleich zu den von HybridJava angebotenen Lösungen.
JSF hat nur einen Nachteil: Bevor Sie mit der "JSF" -Entwicklung beginnen, sollten Sie die Web-Entwicklung, die Core Java und die Front-End-Architektur genau verstehen.
Heutzutage versuchen "neue" JavaScript-Frameworks nur, "JSF" -Komponentenmodelle zu kopieren und einzufügen.