Gestern habe ich eine Präsentation zu Java Server Faces 2.0 gesehen, die wirklich beeindruckend aussah, obwohl ich derzeit ein glücklicher ASP.NET MVC / jQuery-Entwickler bin. Was mir an JSF am besten gefallen hat, war die große Anzahl von AJAX-fähigen UI-Komponenten, die die Entwicklung viel schneller zu machen scheinen als mit ASP.NET MVC, insbesondere auf AJAX-lastigen Sites. Integrationstests sahen auch sehr gut aus.
Da in der Präsentation nur die Vorteile von JSF hervorgehoben wurden, würde ich gerne auch von der anderen Seite hören.
Meine Fragen sind also:
- Was sind die Hauptnachteile von Java Server Faces 2.0?
- Was könnte einen JSF-Entwickler dazu bringen, ASP.NET MVC anstelle von JSF zu verwenden?
asp.net-mvc
jsf
jsf-2
Adrian Grigore
quelle
quelle
Antworten:
JSF 2.0 Nachteile? Ehrlich gesagt, abgesehen von der relativ steilen Lernkurve, wenn Sie keine soliden Hintergrundkenntnisse über die grundlegende Webentwicklung (HTML / CSS / JS, Server- gegenüber Client-Seite usw.) und die grundlegende Java-Servlet-API (Anforderung / Antwort / Sitzung) haben , Weiterleitung / Weiterleitung usw.) fallen keine ernsthaften Nachteile ein. JSF muss in seiner aktuellen Version immer noch das negative Image beseitigen, das es in den frühen Jahren gewonnen hat, in denen es mehrere schwerwiegende Nachteile gab.
JSF 1.0 (März 2004)
Dies war die erste Veröffentlichung. Es war voller Fehler sowohl im Kern- als auch im Leistungsbereich, über die Sie nichts wissen möchten. Ihre Webanwendung funktionierte nicht immer so, wie Sie es intuitiv erwartet hatten. Sie als Entwickler würden weinend davonlaufen.
JSF 1.1 (Mai 2004)
Dies war die Bugfix-Version. Die Leistung wurde noch nicht wesentlich verbessert. Es gab auch einen großen Nachteil: Sie können HTML nicht fehlerfrei in die JSF-Seite einbinden. Alle einfachen Vanille-HTML-Dateien werden vor dem JSF-Komponentenbaum gerendert . Sie müssen alle einfachen Vanillen in
<f:verbatim>
Tags einschließen, damit sie in den JSF-Komponentenbaum aufgenommen werden. Obwohl dies der Spezifikation entsprach, wurde dies vielfach kritisiert. Siehe auch ua JSF / Facelets: Warum ist es keine gute Idee, JSF / Facelets mit HTML-Tags zu mischen?JSF 1.2 (Mai 2006)
Dies war die erste Veröffentlichung des neuen JSF-Entwicklungsteams unter der Leitung von Ryan Lubke. Das neue Team hat großartige Arbeit geleistet. Es gab auch Änderungen in der Spezifikation. Die wichtigste Änderung war die Verbesserung der Ansichtsbehandlung. Dadurch wurde JSF nicht nur vollständig von JSP getrennt, sodass eine andere Ansichtstechnologie als JSP verwendet werden konnte, sondern Entwickler konnten auch einfaches Vanille-HTML in die JSF-Seite einbinden, ohne sich mit
<f:verbatim>
Tags herumschlagen zu müssen . Ein weiterer Schwerpunkt des neuen Teams war die Verbesserung der Leistung. Während der Lebensdauer der Sun JSF-Referenzimplementierung 1.2 (die seit Build 1.2_08 um 2008 den Codenamen Mojarra trug) wurde praktisch jeder Build mit (größeren) Leistungsverbesserungen neben den üblichen (kleinen) Bugfixes ausgeliefert.Der einzige schwerwiegende Nachteil von JSF 1.x (einschließlich 1.2) ist das Fehlen eines Bereichs zwischen dem Anforderungs- und dem Sitzungsbereich , dem sogenannten Konversationsbereich . Dies zwang Entwickler dazu, sich mit versteckten Eingabeelementen, unnötigen DB-Abfragen und / oder Missbrauch des Sitzungsbereichs zu beschäftigen, 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 gelindert werden, indem eine Bibliothek eines Drittanbieters verwendet wird, die die erforderlichen Daten in der nachfolgenden Anforderung wie MyFaces Tomahawk-
<t:saveState>
Komponente, JBoss Seam- Konversationsumfang und MyFaces Orchestra speichert Gesprächsrahmen.Ein weiterer Nachteil für HTML / CSS-Puristen besteht darin, dass JSF den Doppelpunkt
:
als ID-Trennzeichen verwendet, um die Eindeutigkeit des HTML-Elementsid
in der generierten HTML-Ausgabe sicherzustellen , insbesondere wenn eine Komponente in der Ansicht mehrmals verwendet wird (Vorlagen, iterierende Komponenten usw.). . Da dies ein unzulässiges Zeichen in CSS-Bezeichnern ist, müssten Sie das verwenden\
, um den Doppelpunkt in CSS-Selektoren zu umgehen, was zu hässlichen und seltsam aussehenden Selektoren wie#formId\:fieldId {}
oder gerade führt#formId\3A fieldId {}
. Siehe auch Verwendung der von JSF generierten HTML-Element-ID mit Doppelpunkt ":" in CSS-Selektoren. Wenn Sie jedoch kein Purist sind, lesen Sie auch Standardmäßig generiert JSF unbrauchbare IDs, die nicht mit CSS-Teilen von Webstandards kompatibel sind .Außerdem wurde JSF 1.x nicht sofort mit Ajax-Funktionen ausgeliefert. Kein wirklicher technischer Nachteil, aber aufgrund des Web 2.0-Hype in dieser Zeit wurde es zu einem funktionalen Nachteil. Exadel war früh dran , Ajax4jsf einzuführen, das im Laufe der Jahre gründlich entwickelt wurde und zum Kernbestandteil der JBoss RichFaces- Komponentenbibliothek wurde. Weitere Komponentenbibliotheken wurden ebenfalls mit integrierten Ajax-Funktionen ausgeliefert, wobei ICEfaces bekannt ist .
Ungefähr zur Hälfte der Lebensdauer von JSF 1.2 wurde eine neue XML-basierte Ansichtstechnologie eingeführt: Facelets . Dies bot enorme Vorteile gegenüber JSP, insbesondere im Bereich des Templating.
JSF 2.0 (Juni 2009)
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 mit reinem XML (den sogenannten Composite-Komponenten ) erweitert. Siehe auch Warum werden Facelets ab JSF2.0 als Ansichtsdefinitionssprache JSP vorgezogen?
Ajax-Kräfte wurden im Geschmack der
<f:ajax>
Komponente eingeführt, die viele Ähnlichkeiten mit Ajax4jsf aufweist. Anmerkungen und Verbesserungen bei der Konvention über die Konfiguration wurden eingeführt, um die ausführlichefaces-config.xml
Datei so weit wie möglich zu beenden . Außerdem wurde das Standard-Trennzeichen für die ID des Namenscontainers:
konfigurierbar, sodass HTML / CSS-Puristen erleichtert atmen konnten. Alles , was Sie tun müssen , ist es so zu definieren ,init-param
inweb.xml
mit dem Namenjavax.faces.SEPARATOR_CHAR
und sicherzustellen , dass Sie nicht dem Charakter selbst überall in Client - IDs verwenden, wie zum Beispiel-
.Zu guter Letzt wurde ein neuer Bereich eingeführt, der Ansichtsbereich . Es beseitigte einen weiteren großen Nachteil von JSF 1.x, wie zuvor beschrieben. Sie deklarieren einfach die Bean
@ViewScoped
, um den Konversationsbereich zu aktivieren, ohne alle Möglichkeiten zu beeinträchtigen, die Daten in nachfolgenden (Konversations-) Anforderungen beizubehalten. Eine@ViewScoped
Bean lebt so lange, wie Sie sie anschließend senden und zu derselben Ansicht navigieren (unabhängig von der geöffneten Registerkarte / dem geöffneten Browserfenster!), Entweder synchron oder asynchron (Ajax). Siehe auch Unterschied zwischen Ansichts- und Anforderungsbereich in verwalteten Beans und Wie wählt man den richtigen Bean-Bereich aus?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 bei Tag-Handlern aufgrund eines Hühnerei-Problems beim teilweisen Speichern des Zustands fehl . Dies ist in JSF 2.2 behoben und in Mojarra 2.1.18 zurückportiert. Auch das Übergeben von benutzerdefinierten Attributen wie HTML5data-xxx
wird nicht unterstützt. Dies wird in JSF 2.2 durch die neue Funktion für Passthrough-Elemente / Attribute behoben. Darüber hinaus hat die JSF-Implementierung Mojarra ihre eigenen Probleme . Relativ viele von ihnen hängen mit dem manchmal unintuitiven Verhalten von<ui:repeat>
, der neuen Implementierung zum Speichern von Teilzuständen und dem schlecht implementierten Flash-Bereich zusammen . Die meisten davon sind in einer Mojarra 2.2.x-Version behoben.Ungefähr zur Zeit von JSF 2.0 wurde PrimeFaces eingeführt, basierend auf jQuery und jQuery UI. Es wurde die beliebteste JSF-Komponentenbibliothek.
JSF 2.2 (Mai 2013)
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 ist noch XHTML verwendet wird . Die wichtigste neue Funktion von JSF 2.2 ist die Unterstützung benutzerdefinierter Komponentenattribute, wodurch sich eine Vielzahl von Möglichkeiten eröffnet, z. B. benutzerdefinierte tabellenlose Optionsfeldgruppen .
Abgesehen von implementierungsspezifischen Fehlern und einigen "nervigen Kleinigkeiten" wie der Unfähigkeit, einen EJB in einen Validator / Konverter einzufügen (bereits in JSF 2.3 behoben), gibt es in der JSF 2.2-Spezifikation keine wirklich großen Nachteile.
Komponentenbasierte MVC vs Anforderungsbasierte MVC
Einige mögen sich dafür entscheiden, dass der Hauptnachteil von JSF darin besteht, dass es nur sehr wenig feinkörnige Kontrolle über das generierte HTML / CSS / JS ermöglicht. Das ist nicht JSFs eigenes, nur weil es ein komponentenbasiertes MVC-Framework ist, kein anforderungs- (aktions-) MVC-Framework. Wenn ein hohes Maß an Kontrolle über HTML / CSS / JS Ihre Hauptanforderung ist, wenn Sie ein MVC-Framework in Betracht ziehen, sollten Sie sich bereits nicht mit einem komponentenbasierten MVC-Framework befassen, sondern mit einem anforderungsbasierten 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 .
Siehe auch:
quelle
click and go to component or include
, kein Abhängigkeitsdiagramm von Komponenten / Tags und kein Menü für eigene Tags oder Tags von Drittanbietern. Ich verbringe viel Zeit damit, projektweite Suchvorgänge durchzuführen, um zu verstehen, wo Komponente oder Funktion x verwendet wird.Nach 5 Jahren Arbeit mit JSF denke ich, dass ich meine 2 Cent hinzufügen kann.
Zwei Hauptnachteile von JSF :
IMHO ist es ein enormer Fehler, HTTP Request / Response vor dem Entwickler zu verbergen. Nach meiner Erfahrung fügt jedes komponentenbasierte Framework der Webentwicklung Abstraktion hinzu, und diese Abstraktion führt zu unnötigem Overhead und höherer Komplexität.
Und kleine Nachteile, die mir in den Sinn kommen:
<ui:remove>
benötigt syntaktisch korrekten Inhalt, der ohnehin analysiert wird.isRendered()
innenprocessXxx()
Methode , bevor Sie fortfahren.Versteh mich nicht falsch. Als Komponenten-Framework ist JSF in Version 2 wirklich gut, aber es ist immer noch komponentenbasiert und wird es immer sein ...
Bitte werfen Sie einen Blick auf die geringe Beliebtheit von Tapestry, Wicket und die geringe Begeisterung erfahrener JSF-Entwickler (was noch aussagekräftiger ist). Schauen Sie sich zum Kontrast den Erfolg von Rails, Grails, Django, Play! Framework - alle sind aktionsbasiert und versuchen nicht, die wahre Anfrage / Antwort und den zustandslosen Charakter des Webs vor dem Programmierer zu verbergen .
Für mich ist es ein großer Nachteil von JSF. IMHO JSF eignet sich für einige Arten von Anwendungen (Intranet, formularintensiv), aber für echte Webanwendungen ist dies kein guter Weg.
Ich hoffe, es hilft jemandem bei seinen Entscheidungen in Bezug auf das Front-End.
quelle
real-life web application
? Auch JSF verbirgt die Art der Anfrage / Antwort, das könnte wahr sein, aber es liegt in der Verantwortung des Programmierers, zu wissen, was wirklich unter der Decke läuft. Wenn Sie nicht wissen, wie HTTP funktioniert, lernen Sie es vor JSF oder einem anderen Framework.Ein paar Nachteile, die mir in den Sinn kommen:
Zusammenfassend lässt sich sagen: Die Zeit, die Sie mit JSF sparen, da Sie nicht den JSP- / Servlet- / Bean-Boilerplate-Code schreiben müssen, haben Sie x10 ausgegeben, um ihn skalieren zu lassen und genau das zu tun, was Sie möchten.
quelle
Für mich ist der größte Nachteil von JSF 2.0 die Lernkurve nicht nur von JSF, sondern auch der Komponentenbibliotheken, die Sie verwenden müssen, damit es nützliche Arbeit leistet. 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 fortfahren, nämlich den Komponentenbibliotheken und Anbieterbibliotheken, die Sie unterwegs abholen werden:
Und vergiss den Container nicht! Und all diese Konfigurationsdateien:
Also - DAS MACHT ES EINFACH? Sicher, JSF 2.0 ist "einfach", solange Sie nur die grundlegendsten Webseiten mit den einfachsten Interaktionen verwenden möchten.
Einfach ausgedrückt ist JSF 2.0 die komplizierteste und umständlichste Mischung aus zusammengeklebten Technologien, wie sie heute im Softwareuniversum existiert. Und mir fällt nichts ein, was ich lieber benutzen würde.
quelle
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. Wie auch immer, das ist meine Erfahrung mit Framework. Andere haben möglicherweise andere Meinungen. Der beste Weg ist es, es eine Weile zu versuchen, um zu sehen, ob es für Sie ist (nur etwas komplexeres - keine naiven Beispiele - JSF glänzt wirklich dort :) IMHO bester Anwendungsfall für JSF sind Geschäftsanwendungen wie CRMs usw.
quelle
"JSF gibt HTML und JavaScript auf Ansichtsebene aus, die Sie nicht steuern oder ändern können, ohne den Controller-Code zu verwenden."
Tatsächlich bietet Ihnen JSF die Flexibilität. Sie können entweder Standardkomponenten / Komponenten von Drittanbietern verwenden oder eigene Komponenten erstellen, bei denen Sie die volle Kontrolle darüber haben, was gerendert wird. Es ist nur ein XML-Code, den Sie zum Erstellen Ihrer benutzerdefinierten Komponenten mit JSF 2.0 benötigen.
quelle
Ich bin überhaupt kein Java Server Faces-Experte. Aber meiner Meinung nach ist der Hauptnachteil, dass es serverseitig ist. Ich bin es leid, serverseitige Frameworks für Webpräsentationsschichten wie ASP.NET Web Forms, ASP.NET MVC, Java Server Faces, Struts, PHP-Frameworks und Ruby on Rails-Frameworks zu lernen und zu verwenden. Ich verabschiedete mich von allen und begrüßte Angularjs und TypeScript. Meine Präsentationsebene wird im Browser ausgeführt. Es spielt keine Rolle, ob es von Windows IIS mit PHP oder ASP.NET oder von einem Apache-Webserver unter Linux bereitgestellt wird. Ich muss nur ein Framework lernen, das überall funktioniert.
Nur meine zwei Cent.
quelle
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 Anwendungsfälle:
Wir haben das gefunden:
ajaxComplete
und 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, treten nicht viele der oben genannten Probleme auf.
Wir fassen unsere Forschung zusammen als:
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 JSF-Vorteilen finden Sie in den technischen Dokumenten von JSF. Meiner Meinung nach ist der größte Vorteil von JSF die KOMPLETTE UND RIESIGE Unterstützung von @BalusC ;-)
quelle
Für mich ist das größte Manko von JSF die schlechte Unterstützung für programmgesteuert (dynamisch) generierte Seiten.
Wenn Sie Ihre Seite dynamisch aus Java-Code erstellen (Seitenkomponentenmodell erstellen) möchten. Zum Beispiel, wenn Sie am WYSIWYG-Webseitenkonstruktor arbeiten. Eine angemessene Dokumentation dieses Anwendungsfalls ist nicht allgemein verfügbar. Es gibt viele Punkte, an denen man experimentieren muss und die Entwicklung sehr langsam verläuft. 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 kein Problem in der Philosophie oder Architektur von JSF ist. Es ist einfach nicht genug ausgearbeitet (soweit ich weiß).
JSF 2 brachte Composite Components mit, die die Entwicklung von Komponenten vereinfachen sollten, aber ihre Unterstützung für dynamische (programmatische) Konstruktionen ist sehr schlecht. Wenn Sie einen recht komplizierten und fast undokumentierten Prozess der dynamischen Konstruktion von Verbundkomponenten überwinden, werden Sie feststellen, dass einige Verbundkomponenten, die etwas tiefer verschachtelt sind, nicht mehr funktionieren und einige Ausnahmen auslösen.
Es scheint jedoch, dass sich die JSF-Community 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 besser sein, zumindest wenn es um Spezifikationen geht.
quelle
Kommentar zu meinen letzten Monaten mit Primefaces / JSF:
Das Versprechen von JSF, das Schreiben von Javascript zu vermeiden, führte dazu, dass mehr Javascript geschrieben wurde als ohne Primefaces - und dieses Javascript behebt, was Primefaces kaputt macht.
Es ist eine Zeitsenke - es sei denn, Sie verwenden wieder "von der Stange". Auch sehr hässlich (Primefaces), wenn man mit Selen arbeiten muss. Es kann alles gemacht werden - aber auch hier 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 jquery lernen / direktes HTML schreiben - oder sich Reagieren / Winkel ansehen.
quelle
<input type="checkbox" name="versionsTab" value="version1">
Primefaces-Kontrollkästchen:<div class="ui-chkbox ui-widget"> <div class="ui-helper-hidden-accessible"> <input type="checkbox" name="datasetForm:tabView:versionsTable_checkbox"> </div> <div class="ui-chkbox-box ui-widget ui-corner-all ui-state-default"> <span class="ui-chkbox-icon ui-c"></span> </div> </div>
Selenium konnte das tatsächlich ausgeblendete Kontrollkästchen nicht finden. zB konnte ich es mit Selektoren / Codierung / etc finden, aber das nicht so technische QA-Team konnte es nichtJSF hat viele Vorteile. Da die Frage im Nachteil ist, möchte ich einige 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 genug Fachwissen in Ihrem Team, um die
von den Entwicklern erstellten JSF- Inhalte zu überprüfen ?
Wenn Sie für die Fragen mit "Nein" antworten, befinden Sie sich möglicherweise in einer nicht wartbaren Codebasis.
quelle
JSF hat nur einen Nachteil: Bevor Sie mit der "JSF" -Entwicklung beginnen, sollten Sie die Webentwicklung, das Kern-Java und die Front-End-Architektur klar verstehen.
Heutzutage versuchen "neue" JavaScript-Frameworks nur, das komponentenbasierte "JSF" -Modell zu kopieren / einzufügen.
quelle
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äsentationsschicht und komponentenorientierte Technologie. Es ist etwas umständlich und unvollständig im Vergleich zu Lösungen von HybridJava.
quelle