Die Grundidee ist nur eine Erweiterung von Object Oriented Design: Trennen Sie die Anliegen Ihres Programms. Auf die gleiche Weise, wie Sie mehrere verschiedene PERL-Skripte erstellen und sie für die Arbeit aneinander reihen können, werden wir mehrere verschiedene JSF-Komponenten erstellen und sie zusammenreihen, um Arbeit zu leisten.
Nehmen wir ein einfaches Registrierungsformular als Beispiel. Ich möchte Ihren Namen, Ihr Geburtsdatum, Ihre Adresse wissen und dies alles dem Backend vorlegen, um die Arbeit zu erledigen.
Als erstes müssen wir Ihr Formular in logische Stücke zerlegen. Wenn wir wüssten, dass wir dieses genaue Formular an vielen verschiedenen Stellen wiederverwenden würden, wäre diese Form vielleicht ein logisches Stück. In diesem Fall könnten wir eine Komponente erstellen, die das gesamte Formular rendert und an eine Bean wie "Kontakt" bindet. Auf diese Weise könnten Sie jederzeit, wenn Sie das Formular verwenden möchten, es ablegen, an eine Contact-Bean binden (das hängt von Ihrem Framework ab) und von dort aus weitermachen. Aber das wäre ein ziemlich dumpfes Beispiel. :)
Aus meiner Schätzung sehe ich Name, Geburtsdatum und Adresse als drei separate, logische Einheiten. Der Name wäre wahrscheinlich einfach. Nur eine Standard-Texteingabe. Wir können also ein h: inputText-Element oder die bevorzugte Version Ihres Frameworks verwenden und dieses mit dem Namensfeld Ihres Bean verknüpfen.
Zweitens haben wir das Geburtsdatum. Im einfachsten Fall können wir ein h: inputText-Feld erstellen und ein f: converter-Element hinzufügen, so dass, wenn wir es an die Bean binden, ein Datum ausgegeben wird. Sie können dies als vollständig interaktives Kalender-Widget skalieren, komplett mit Java Script und was nicht.Einige gute Beispiele finden Sie in IceFaces und RichFaces. Aber das gleiche Kernkonzept bleibt: Eine einzelne Komponente, die Sie an ein Datumsobjekt binden.
Drittens haben wir die Adresse. Dies ist eine gute Wahl für eine Komponente, weil Sie wahrscheinlich Adressen in vielen verschiedenen Seiten kennen müssen. Es ist auch viel komplexer als eine einzige Eingabe. Sie müssen mehrere Eingaben, Validierungen und Spaß-Ajaxy-Sachen kombinieren, um eine zusammenhängende Einheit zu bilden. Allerdings wird der Entwickler, der es benutzt, hoffentlich nur <foo:address value="#{BarBean.address}"/>
mit vielleicht ein paar anderen Optionen verwenden müssen.
Diese Trennung von Bedenken ist der Kern von nicht nur komponentenbasiertem Webdesign, sondern auch objektorientierter Programmierung. Es gibt viele Tools, um dies auch zu erleichtern! Facelets ist ein großartiges Beispiel. Sie können Ihr Grundlayout in ein eigenes Blatt zerlegen und einfach den nützlichen Inhalt über die Elemente von ui: define einfügen. Sie können Kompositionskomponenten erstellen, mit denen Sie schnell nützliche Komponenten erstellen können, ohne sich in das JSF-Komponentenframework zu vertiefen. Das Adressbeispiel wäre mit einer Facelets-Kompositionskomponente sehr einfach zu machen. IceFaces ist ein weiteres gutes Beispiel. Es verarbeitet alle Arten von AJAXy-Eingaben, Redraws und Updates, ohne dass ich mir Sorgen darüber machen muss, wie alles funktioniert (zum größten Teil;;), sodass ich mich darauf konzentrieren kann, was die Form zu erreichen hat und nicht wie das Formular ausgeführt wird.
Dies kratzt nur die Oberfläche, aber die breitesten Striche sind ähnlich wie bei jedem großen Programm: Identifizieren Sie die kleinsten, logischen Teile und bauen Sie sie, bevor Sie diese verwenden, um größere Teile zu bauen.
Dies ist eine sehr durchdachte Antwort. –