JavaServer Faces (JSF) je standardní technologie Java pro vytváření webových rozhraní založených na součástech a událostech. Stejně jako JavaServer Pages (JSP) umožňuje JSF přístup k datům a logice na straně serveru. Na rozdíl od JSP, což je v podstatě stránka HTML naplněná funkcemi na straně serveru, JSF je dokument XML, který představuje formální komponenty v logickém stromu. Komponenty JSF jsou podporovány objekty Java, které jsou nezávislé na HTML a mají celou škálu schopností Java, včetně přístupu ke vzdáleným API a databázím.
Klíčovou myšlenkou rámce jako JSF je zapouzdření (nebo zabalit) technologie na straně klienta, jako je HTML, CSS a JavaScript, které vývojářům umožňují vytvářet webová rozhraní bez velké interakce s těmito technologiemi.
Tento článek představuje snímek přístupu JSF k vývoji uživatelského rozhraní založeného na komponentách pro webové aplikace Java. Jednoduché příklady představují architekturu MVC JSF, model událostí a knihovnu komponent. Mezi příklady patří nové funkce v JSF 2.3 a pro naši knihovnu komponent použijeme PrimeFaces.
Vyvíjející se JSF
Dlouho populární společnost JSF nedávno čelila konkurenci webových rámců kompatibilních s Java, včetně rámců JavaScriptu na straně klienta. Přesto JavaServer Faces zůstává standardem Java, zejména pro rozsáhlý podnikový vývoj Java. Specifikace JSF také vytvořila nepřeberné množství rámců a knihoven, které držely krok s nedávnými vylepšeními na straně klienta. Jedním z nich je PrimeFaces, který prozkoumáme v tomto kurzu.
I když je plán budoucího vývoje nejasný, JSF 2.3 dává vývojářům spoustu práce, zatímco čekáme. Vydáno v březnu 2017, JSF 2.3 byl záměrně navržen tak, aby modernizoval JSF. Mezi několika stovkami drobných oprav a větších aktualizací JSF 2.3 odmítá spravované anotace typu bean ve prospěch CDI, které uvedu dále v tomto tutoriálu.
JSF 2.3 v Jakartě EE
V září 2017 společnost Oracle oznámila svůj záměr převést prostředí Java EE na nadaci Eclipse. Java EE byla od té doby přejmenována na Jakarta EE a pro pokračování byl přijat JSF 2.3 (Eclipse Mojarra). Dalším významným vydáním specifikace JSF bude Eclipse Mojarra 3.0.
Vytváření komponentních webových rozhraní v JSF
Základní myšlenkou JSF je zapouzdřit funkčnost do opakovaně použitelných komponent. Je to podobné jako opakovaně použitelné značky používané v JSP, ale komponenty JSF jsou formálnější.
I když můžete stránky JSF používat v rámci stránek JavaServer, je běžnější používat Facelety k vytváření samostatných stránek JSF. Čelenky jsou stránky XHTML určené k definování rozhraní JSF. U Faceletů pomocí značek XML vytvoříte strom komponent, který se stane scaffoldem pro uživatelské rozhraní JSF.
Výpis 1 představuje hlavní části jednoduché stránky JSF psané pomocí Facelets. V tomto příkladu přistupujeme k možnostem Java na straně serveru prostřednictvím fazole, která byla umístěna do rozsahu prostřednictvím CDI. Později uvidíte více informací o CDI.
Výpis 1. Ukázková stránka JSF
Ahoj JavaWorld! # {javaBean.content}
V seznamu 1 vidíme standardní stránku XHTML. Pohled Facelets je postaven na XHTML. Kromě oboru názvů XHTML je definován a odkazován sekundární obor názvů.
The h
knihovna obsahuje standardní komponenty pro použití na stránkách JSF HTML. The //xmlns.jcp.org/jsf/html
knihovna definuje kolekci komponent JSF, v tomto případě kolekci běžných prvků HTML. Jednou z těchto komponent je živel.
Komponenty HTML v JSF
Pokud jde o syntaxi, seznam 1 prvek odkazuje na
jsf / html
knihovna s h
předpona. Poté odkazuje na konkrétní komponentu v knihovně, kterou je hlava
součástka.
The komponenta vypíše prvek HTML head. (Celá ta syntaxe se může pro takový jednoduchý účel zdát přehnaná, ale je na to dobrý důvod, jak brzy uvidíte.)
Vnořené komponenty
Uvnitř hlavy je vnořený standardní HTML živel. Tento prvek je poskytován
komponenta spolu s podřízenými prvky obsahu vnořenými uvnitř.
V těle dokumentu je výraz JSF obsažen v #{}
syntax. To je přesně analogické výrazu JSP s ${}
formát: umožňuje přístup k objektům Java v rozsahu a jednoduchým funkcím.
Základní vzor pro JSF je jednoduchý: Pomocí Faceletů vytvořte strom XML, který odkazuje na knihovnu komponent nebo knihovny, a pak použijte komponenty v knihovně k vykreslení objektů Java jako HTML.
Používání objektů Java v JSF
Vraťme se zpět do výpisu 1 a všimněte si, že uvnitř výrazu JSF ($ {javaBean.content
) The javaBean
objekt je v rozsahu, když je provedeno toto označení. XHTML Facelets přistupuje k .obsah
majetek na javaBean
objekt. Konečným výstupem je webové rozhraní, které sloučí strukturu zobrazení Facelets s datovými a logickými schopnostmi na straně serveru Java.
Použití výrazu JSF je jen jedním ze způsobů přístupu k datům aplikace Java z uživatelského rozhraní JSF. Nakonec budete chtít prozkoumat další způsoby, jak může komponenta JSF interagovat s back-endem Java - věci jako seznamy dat a mřížky a řada vstupních ovládacích prvků. Prozatím stačí absorbovat, jak JSF používá tagy XML (nebo anotace) k vytvoření stromu komponent, který vydává HTML na základě dat obsažených v objektech Java.
Anotace vs. XML
S JSF 2.3 se stalo možné definovat komponenty JSF s anotacemi a zcela se vyhnout XML metadatům. Je plně možné definovat a nasadit aplikaci JSF bez úpravy jakéhokoli XML.
Struktura aplikace JSF
Podobně jako stránky JavaServer i rozhraní Servlet API vyžaduje JavaServer Faces standardní adresářovou strukturu a metadata. Jsou nasazeny jako .válka soubory.
Struktura souboru .war je podobná aplikaci Servlet nebo JSP. Obsahuje a / webová aplikace
adresář, ve kterém jsou uloženy značkovací soubory aplikace (v tomto případě HTML, JSP a Facelets) a také a / WEB-INF
adresář, který představuje metadata k popisu aplikace.
Slouží JSF
I když můžete spustit JSF v kontejneru Java EE, jako je Glassfish, potřebujete opravdu jednoduchý kontejner servletu. Tomcat je oblíbený kontejner pro JSF a další technologie Java na straně serveru.
JSF 2.3: Specifikace a implementace
Jednou ze silných stránek Javy je, že je založena na standardech a tyto standardy jsou řízeny procesem komunity s otevřeným zdrojovým kódem. Od svého založení dohlížel na vývoj technologie Java proces JCA (Java Community Process). Jakmile je specifikace nebo vylepšení specifikace vyvinuta a schválena JCP, je k dispozici k implementaci více stranami. Až donedávna byly servlety, JSP a JSF vyvíjeny pomocí procesu specifikací otevřeného zdroje JCP.
Nejnovější specifikací JSF od tohoto psaní je JSF 2.3, která byla vydána jako součást Java EE 8 v roce 2017. Oracle (nyní Eclipse) Mojarra je referenční implementace JSF a MyFaces a PrimeFaces jsou populární implementace třetích stran.
Každý z těchto frameworků implementuje jádro JSF, které obsahuje některé standardní komponenty. Prodejci mohou kromě standardu nabídnout i další knihovny komponent. Při hodnocení rámců JSF je dobré zvážit potřeby vaší aplikace a jaké knihovny knihoven jsou k dispozici, aby vám ji pomohly sestavit. V ideálním případě by vás rámec JSF měl dostat co nejblíže k tomu, co potřebujete, hned po vybalení z krabice.
MVC v JSF 2.3
JSF je Rámec MVC, implementující vzor model-pohled-řadič. Ve vzoru MVC je myšlenkou oddělit tři problémy uživatelského rozhraní do diskrétních částí, takže je snadnější je spravovat. Obecně platí, že Pohled je zodpovědný za zobrazení dat v modelu a ovladač je zodpovědný za nastavení modelu a směrování uživatele do správného zobrazení.
V implementaci JSF je zobrazením stránka Facelets se sadou značek XML. Ty definují rozložení uživatelského rozhraní. Druhá polovina používání JSF je na straně serveru, kde třídy Java podporují tyto komponenty uživatelského rozhraní.
Managed beans zastaralé v JSF 2.3
Anotace spravovaných fazolí byly v JSF 2.3 zastaralé a nahrazeny CDI (kontexty a závislostní injekce). S CDI vývojáři definují kontext a vkládají objekty do tohoto kontextu. Ti, kteří znají spravované fazole, najdou syntaxi anotací mírně odlišnou, ale sémantika zůstává přesně stejná.
Kontrolní fazole
V JSF 2.3 poskytují fazole řadiče ovladač část rovnice MVC. Model poskytují normální objekty Java (často nazývané POJO nebo obyčejné staré objekty Java).
Pokud jde o tok procesu, fazole řadiče:
- Rozhodněte se, kam směrovat požadavky uživatelů
- Nastavte POJO pro model
- Pomocí modelu vykreslete pohled Facelets
JSF poté složí strom komponent a model, aby vykreslil výstupní HTML.
Výpis 2 ukazuje, jak byste definovali javaBean
objekt ze seznamu 1 pomocí CDI. Tento seznam předpokládá, že aplikace má ve svých závislostech soubor cdi-api-1.2.jar.
Výpis 2. JavaBean definovaný pomocí CDI
import javax.inject.Named; import javax.enterprise.context.SessionScoped; @Named @ViewScoped veřejná třída JavaBean implementuje Serializable {private String content = „Vítejte v JSF!“ // getters / setters}
JSF 2.3 s PrimeFaces
V dalších částech vám pomocí PrimeFaces ukážeme, jak JSF implementuje vzor MVC, zasílání zpráv řízených událostmi a opakovaně použitelné komponenty. Chcete-li začít, otevřete vitrínu PrimeFaces a klikněte na Data odkaz v levém sloupci a vyberte DataList. Tím se vytáhne demo kód DataList pro PrimeFaces.
Obrázek 1 ukazuje, kde tyto vzorky najdete.

Obrázek 2 ukazuje výstup jednoduché datové tabulky, která je převzata z demo ukázky PrimeFaces DataList.

PrimeFaces DataList: Přístup k datovému modelu
Výpis 3 představuje označení pro toto dataList
Zobrazit. Pokud se posunete do spodní části vitríny PrimeFaces, uvidíte značku v dataList.xhtml
záložka.
Výpis 3. Facelet pro PrimeFaces DataList
Základní # {car.brand}, # {car.year}
V seznamu 3 si všimněte hodnota
majetek dataList
součástka. Vidíte, že toto odkazuje a dataListView
objekt a přistupuje k .cars1
majetek na něm. Komponenta bude používat objekt modelu vrácený tímto polem. Tokeny JSF používají konvenční přístupové objekty k odkazování na vlastnosti objektu, takže .cars1
bude odkazovat na getCars ()
kariérista na objektu.
Dále si všimněte var = "auto"
vlastnictví. To říká dataList
komponenta, jakou proměnnou použít, když iteruje seznam aut vrácených hodnota
pole. Tyto vlastnosti jsou specifické pro dataList
komponenta, ale hodnota
vlastnictví je velmi běžné. The var
atribut je také běžný pro komponenty, které procházejí seznamy.
V těle komponenty v seznamu 3 můžete vidět auto
proměnná je přístupná pomocí výrazů JSF jako #{značka auta}
. Každá iterace dataListView.cars1
instance vypíše značka auta
pole.
Všimněte si, že značka ukazuje schopnost přizpůsobit komponenty tak, jak se budou zobrazovat. V tomto případě je záhlaví definováno jako
Základní
.
Kombinací dat se značkami můžete vidět, jak bude tento výstup řídit Facelets XML. Nyní se podívejme na kód Java za tím.
Komponenty na straně serveru DataList
Výpis 4 ukazuje DataListView
, třída Java, která je používána značkami v Seznamu 3. Brzy uvidíte, jak dataListView
instance je spojena s DataListView
třída.
Výpis 4. Třída DataListView
balíček org.primefaces.showcase.view.data; import java.io.Serializable; import java.util.List; import javax.annotation.PostConstruct; import javax.inject.Named; // Pre JSF 2.3, this was: // import javax.faces.bean.ManagedBean; import javax.inject.Inject; import javax.faces.bean.ViewScoped; importovat org.primefaces.showcase.domain.Car; importovat org.primefaces.showcase.service.CarService; @Named @ViewScoped veřejná třída DataListView implementuje Serializable {private List cars1; soukromé auto selectedCar; @Inject ("# {carService}") soukromá služba CarService; @PostConstruct public void init () {cars1 = service.createCars (10); } public List getCars1 () {návrat vozů1; } public void setService (služba CarService) {this.service = služba; }}
Výpis 4 má několik dalších důležitých prvků, které budeme zvažovat kousek po kousku.
Vkládání závislostí a anotace
Nejprve si všimněte, že DataListView
třída je opatřena poznámkami @ Jmenováno
, které můžete vidět z importu import javax.inject.Named;
je součástí JSF. The @ Jmenováno
anotace říká JSF, že tato fazole je součástí aplikace. The @ZobrazitSkoped
anotace informuje JSF, že fazole bude žít jen po celý život pohledu.
Dále pozorujte, že Autoservis
nemovitost má @Inject
anotace (tzv @ManagedProperty
před JSF 2.3). Toto je další funkce JSF, která umožňuje, aby fazole byly „propojeny dohromady“, což je technika popularizovaná Spring frameworkem a dalšími nástroji pro vkládání závislostí. V podstatě JSF najde autoservis
objekt v rozsahu a automaticky jej přiřadit k servis
pole na DataListView
objekt.