Programmering

Hva er JSF? Vi presenterer JavaServer Faces

JavaServer Faces (JSF) er Java-standardteknologien for å bygge komponentbaserte, hendelsesorienterte nettgrensesnitt. I likhet med JavaServer Pages (JSP) gir JSF tilgang til data og logikk på serversiden. I motsetning til JSP, som egentlig er en HTML-side gjennomsyret med server-side-muligheter, er JSF et XML-dokument som representerer formelle komponenter i et logisk tre. JSF-komponenter støttes av Java-objekter, som er uavhengige av HTML og har hele spekteret av Java-evner, inkludert tilgang til eksterne API-er og databaser.

Hovedideen til et rammeverk som JSF er å kapsle inn (eller pakke inn) teknologier på klientsiden som HTML, CSS og JavaScript, slik at utviklere kan bygge nettgrensesnitt uten mye samhandling med disse teknologiene.

Denne artikkelen presenterer et øyeblikksbilde av JSFs tilnærming til komponentbasert UI-utvikling for Java-webapplikasjoner. Enkle eksempler introduserer JSFs MVC-arkitektur, hendelsesmodell og komponentbibliotek. Eksempler inkluderer nye funksjoner i JSF 2.3, og vi bruker PrimeFaces for komponentbiblioteket vårt.

Utviklende JSF

Lenge populært, JSF har nylig møtt konkurranse fra Java-kompatible nettrammer, inkludert JavaScript-rammer på klientsiden. Likevel forblir JavaServer Faces Java-standarden, spesielt for storstilt Java-forretningsutvikling. JSF-spesifikasjonen har også skapt et vell av rammer og biblioteker, som har holdt tritt med de siste forbedringene på klientsiden. En av disse er PrimeFaces, som vi utforsker i denne opplæringen.

Mens tidsplanen for fremtidig utvikling er uklar, gir JSF 2.3 utviklere mye å jobbe med mens vi venter. JSF 2.3 ble utgitt i mars 2017 og ble med vilje designet for å modernisere JSF. Blant flere hundre små reparasjoner og større oppdateringer avskriver JSF 2.3 administrerte bønne-merknader til fordel for CDI, som jeg introduserer senere i denne opplæringen.

JSF 2.3 i Jakarta EE

I september 2017 kunngjorde Oracle sin intensjon om å overføre Java EE til Eclipse Foundation. Java EE har siden blitt omdøpt til Jakarta EE, og JSF 2.3 (Eclipse Mojarra) er vedtatt for videreføring. Den neste store utgivelsen av JSF-spesifikasjonen vil være Eclipse Mojarra 3.0.

Bygge komponentbaserte nettgrensesnitt i JSF

JSFs kjernidee er å kapsle funksjonalitet i gjenbrukbare komponenter. Dette ligner på de gjenbrukbare kodene som brukes i JSP, men JSF-komponenter er mer formelle.

Mens du kan bruke JSF-sider på JavaServer-sider, er det vanligere å bruke Facelets til å bygge frittstående JSF-sider. Fasetter er XHTML-sider designet for å definere JSF-grensesnitt. Med Facelets bruker du XML-koder for å lage et komponenttrær som blir stillaset for et JSF-brukergrensesnitt.

Oppføring 1 presenterer hoveddelene av en enkel JSF-side skrevet med Facelets. I dette eksemplet får vi tilgang til Java's server-side-funksjoner via en bønne som er plassert i omfang via CDI. Du vil se mer om CDI senere.

Oppføring 1. JSF-eksempelside

    Hei JavaWorld! # {javaBean.content} 

I liste 1 ser vi en standard XHTML-side. En Facelets-visning er bygget på toppen av XHTML. I tillegg til XHTML-navneområdet er det definert og referert til et sekundært navneområde.

De h biblioteket inneholder standardkomponenter for bruk på JSF HTML-sider. De //xmlns.jcp.org/jsf/html biblioteket definerer en samling av JSF-komponenter, i dette tilfellet en samling vanlige HTML-elementer. En av disse komponentene er element.

HTML-komponenter i JSF

Når det gjelder syntaksen, er liste 1 element refererer til jsf / html bibliotek med h prefiks. Den refererer deretter til den spesifikke komponenten i biblioteket, som er hode komponent.

De komponent sender ut HTML-hovedelementet. (Alt den syntaksen kan virke som overkill for et så enkelt formål, men det er god grunn til det, som du snart vil se.)

Hekkende komponenter

Inne i hodet er nestet en standard HTML element. Dette elementet er gitt til komponent, sammen med innholdet underordnede elementer nestet inne i den.

I dokumentets kropp er et JSF-uttrykk inneholdt av #{} syntaks. Dette er nøyaktig analogt med et JSP-uttrykk med ${} format: det gir tilgang til Java-objekter i omfang, og enkle funksjoner.

Det grunnleggende mønsteret for JSF er enkelt: Bruk Facelets til å bygge et XML-tre som refererer til et komponentbibliotek eller biblioteker, og bruk deretter komponenter i biblioteket til å gjengi Java-objekter som HTML.

Bruke Java-objekter i JSF

Gå tilbake til oppføring 1, legg merke til at inne i JSF-uttrykket ($ {javaBean.content) Den javaBean objektet er i omfang når denne markeringen utføres. XHTML of Facelets får tilgang til .innhold eiendom på javaBean gjenstand. Den endelige utgangen er et webgrensesnitt som smelter Facelets-visningsstrukturen med Java's data- og logikkfunksjoner på serversiden.

Å bruke et JSF-uttrykk er bare en måte å få tilgang til Java-applikasjonsdata fra et JSF-brukergrensesnitt. Til slutt vil du utforske andre måter en JSF-komponent kan samhandle med Java-backend - ting som datalister og rutenett og en rekke inngangskontroller. For nå er det nok å absorbere hvordan JSF bruker XML-koder (eller merknader) for å lage et tre av komponenter som sender ut HTML basert på dataene i Java-objekter.

Kommentarer mot XML

Med JSF 2.3 har det blitt mulig å definere JSF-komponenter med merknader, og helt unngå XML-metadata. Det er fullt mulig å definere og distribuere en JSF-app uten å redigere XML.

Struktur av en JSF-applikasjon

I likhet med JavaServer Pages og Servlet API, krever JavaServer Faces en standard katalogstruktur og metadata. Disse distribueres som .krig filer.

Strukturen til en .war-fil ligner på et Servlet- eller JSP-program. Den inneholder en / web-app katalog, som inneholder applikasjonens markeringsfiler (i dette tilfellet HTML, JSP og Facelets), samt en / WEB-INF katalog, som presenterer metadataene for å beskrive applikasjonen.

Serverer JSF

Mens du kan kjøre JSF i en Java EE-container som Glassfish, er en enkel servlet-container alt du virkelig trenger. Tomcat er en populær container for JSF og andre Java-teknologier på serversiden.

JSF 2.3: Spesifikasjoner og implementeringer

En av Java's styrker er at den er standardbasert, og disse standardene styres av en åpen kildekode-fellesskapsprosess. Siden starten har Java Community Process (JCP) overvåket utviklingen av Java-teknologi. Når en spesifikasjon eller spesifikasjonsforbedring er utviklet og godkjent av JCP, er den tilgjengelig for implementering av flere parter. Inntil nylig ble Servlets, JSP og JSF alle utviklet ved hjelp av JCPs prosess for åpen kildekode-spesifikasjon.

Den siste JSF-spesifikasjonen med dette skrivet er JSF 2.3, utgitt som en del av Java EE 8 i 2017. Oracle (nå Eclipse) Mojarra er JSF-referanseimplementering, og MyFaces og PrimeFaces er populære tredjepartsimplementeringer.

Hver av disse rammene implementerer JSF-kjernen, som inkluderer noen standardkomponenter. Leverandører kan også tilby ekstra komponentbiblioteker på toppen av standarden. Når du vurderer JSF-rammeverk, er det en god idé å vurdere behovene til applikasjonen din og hvilke komponentbiblioteker som er tilgjengelige for å hjelpe deg med å bygge den. Ideelt sett bør JSF-rammeverket ditt komme deg så nært som mulig det du trenger, rett ut av esken.

MVC i JSF 2.3

JSF er en MVC-rammeverk, implementering av modell-visning-kontroller mønster. I MVC-mønsteret er ideen å skille de tre bekymringene til et brukergrensesnitt i diskrete deler, slik at de er lettere å administrere. Generelt sett utsikt er ansvarlig for å vise data i modellen, og kontrolleren er ansvarlig for å sette opp modellen og dirigere brukeren til riktig visning.

I en JSF-implementering er visningen Facelets-siden med sitt sett med XML-koder. Disse definerer utformingen av brukergrensesnittet. Den andre halvdelen av å bruke JSF er serversiden, der Java klasser tilbake disse UI-komponentene.

Administrerte bønner avskrevet i JSF 2.3

Administrerte bønneannotasjoner er avskrevet i JSF 2.3, og erstattet av CDI (Contexts and Dependency Injection). Med CDI definerer utviklere en kontekst og injiserer objekter til den konteksten. De som er kjent med administrerte bønner, vil finne merknadssyntaksen litt annerledes, men semantikken forblir nøyaktig den samme.

Kontrollbønner

I JSF 2.3 gir controller bønner den kontrolleren del av MVC-ligningen. Normale Java-objekter (ofte kalt POJO-er, eller vanlige gamle Java-objekter) gir modellen.

Når det gjelder prosessflyt, kontrollerer bønner:

  1. Bestem hvor brukerforespørsler skal rettes
  2. Sett opp POJO-er for modellen
  3. Bruk modellen til å gjengi Facelets-visningen

JSF bretter deretter komponenttreet og modellen for å gjengi utdata HTML.

Oppføring 2 viser hvordan du vil definere javaBean objekt fra liste 1 ved bruk av CDI. Denne oppføringen forutsetter at applikasjonen har cdi-api-1.2.jar i sine avhengigheter.

Oppføring 2. En JavaBean definert ved bruk av CDI

 importere javax.inject.Named; importere javax.enterprise.context.SessionScoped; @Named @ViewScoped offentlig klasse JavaBean implementerer serialiserbar {privat strenginnhold = ìVelkommen til JSF! Î // getters / setters} 

JSF 2.3 med PrimeFaces

I de neste avsnittene vil jeg bruke PrimeFaces for å vise deg hvordan JSF implementerer MVC-mønsteret, hendelsesdrevet meldinger og gjenbrukbare komponenter. For å starte, åpne PrimeFaces Showcase, klikk på Data lenke i kolonnen til venstre, og velg Dataliste. Dette vil trekke opp DataList-demokoden for PrimeFaces.

Figur 1 viser deg hvor du finner disse prøvene.

Matthew Tyson

Figur 2 viser utdataene fra en enkel datatabell, som er hentet fra PrimeFaces DataList-demoen.

Matthew Tyson

PrimeFaces DataList: Få tilgang til datamodellen

Oppføring 3 presenterer markeringen for dette dataliste vise. Hvis du blar til bunnen av PrimeFaces-utstillingsvinduet, kan du se merkingen i dataList.xhtml fanen.

Oppføring 3. Fasett for PrimeFaces DataList

   Grunnleggende # {car.brand}, # {car.year} 

Merk deg i Listing 3 verdi eiendommen til dataliste komponent. Du kan se at dette refererer til a dataListView objekt, og får tilgang til .biler1 eiendom på den. Komponenten skal bruke modellobjektet som returneres av det feltet. JSF-tokens bruker konvensjonelle aksessorer for å referere til objektegenskaper, så .biler1 vil referere til getCars () getter på objektet.

Legg deretter merke til var = "bil" eiendom. Dette forteller dataliste komponent hvilken variabel du skal bruke når den går over listen over biler som returneres av verdi felt. Disse egenskapene er spesifikke for dataliste komponent, men verdi eiendom er veldig vanlig. De var attributt er også konvensjonelt for komponenter som gjentas over lister.

I hoveddelen av komponenten i Listing 3 kan du se bil variabelen er tilgjengelig via JSF-uttrykk som #{bilmerke}. Hver iterasjon av dataListView.cars1 forekomst vil sende ut bilmerke felt.

Legg merke til at tag demonstrerer muligheten til å tilpasse komponenter for hvordan de skal vises. I dette tilfellet er toppteksten definert som Grunnleggende.

Du kan se hvordan Facelets XML vil drive denne utgangen ved å kombinere dataene med markeringen. La oss nå se på Java-koden bak den.

DataLists server-side komponenter

Oppføring 4 viser DataListView, Java-klassen som brukes av markeringen i Listing 3. Du ser snart hvordan dataListView forekomst er assosiert med DataListView klasse.

Oppføring 4. DataListView-klasse

 pakke org.primefaces.showcase.view.data; importere java.io.Serializable; importere java.util.List; importere javax.annotation.PostConstruct; importere javax.inject.Named; // Pre JSF 2.3, dette var: // import javax.faces.bean.ManagedBean; importere javax.inject.Inject; importere javax.faces.bean.ViewScoped; importer org.primefaces.showcase.domain.Car; importer org.primefaces.showcase.service.CarService; @Named @ViewScoped offentlig klasse DataListView implementerer Serializable {private List cars1; privat bil valgtBil; @Inject ("# {carService}") privat CarService-tjeneste; @PostConstruct public void init () {cars1 = service.createCars (10); } offentlig liste getCars1 () {retur biler1; } offentlig ugyldig setService (CarService-tjeneste) {this.service = service; }} 

Oppføring 4 har noen få andre viktige elementer, som vi vil vurdere stykke for stykke.

Avhengighetsinjeksjon og merknader

Legg først merke til at DataListView klasse er kommentert med @Named, som du kan se fra importen importere javax.inject.Named; er en del av JSF. De @Named kommentar forteller JSF at denne bønnen er en del av appen. De @ViewScoped kommentar informerer JSF om at bønnen vil leve hele livet.

Neste, observer at Bilservice eiendommen har @Injiser kommentar (kalt @ManagedProperty før JSF 2.3). Dette er en annen JSF-funksjon som gjør at bønner kan "kobles sammen", en teknikk som er populært av Spring-rammeverket og andre verktøy for avhengighetsinjeksjon. I hovedsak vil JSF finne Bilservice objekt i omfang og knytte det automatisk til service felt på DataListView gjenstand.

$config[zx-auto] not found$config[zx-overlay] not found