267
Programiranje Programiranje Internet Internet aplikacija aplikacija Java Java Server Faces (JSF) Server Faces (JSF) © SI1P1 2004 1/15

Programiranje Programiranje Internet Internet aplikacija aplikacija

  • Upload
    lenhu

  • View
    325

  • Download
    16

Embed Size (px)

Citation preview

Page 1: Programiranje Programiranje Internet Internet aplikacija aplikacija

ProgramiranjeProgramiranje Internet Internet aplikacijaaplikacijaJava Java Server Faces (JSF)Server Faces (JSF)

© SI1P1 – 2004 1/15

Page 2: Programiranje Programiranje Internet Internet aplikacija aplikacija

Šta je JSF?

Skup Web-baziranih GUI kontrola i povezanihSkup Web-baziranih GUI kontrola i povezanih obrada?– JSF omogućava veliki broj HTML-orijentisanih GUI k t l j d k d k ji b đ j jih d đ jkontrola, zajedno sa kodom koji obrađuje njihove događaje.Nezavisan GUI kontrolni framework?– JSF imaju mogućnost da generišu i grafičke kontrole kojeJSF imaju mogućnost da generišu i grafičke kontrole koje nisu HTML, koje koriste protokole koji nisu HTTPU odnosu na Struts?

Kao i Struts JSF se može koristiti kao MVC framework za– Kao i Struts, JSF se može koristiti kao MVC framework za generisanje HTML formi, validaciju njihovih vrednosti, realizaciju poslovne logike i prikazivanje rezultata.

žKoja od navedenih je najvažnija osobina JSF?– Odgovor zavisi od načina upotrebe, ali razlozi 1 i 3 su najčešći za upotrebu JSF.

© SI1P1 – 2004 2/15

j p

Page 3: Programiranje Programiranje Internet Internet aplikacija aplikacija

Šta je JSF?

Glavna odlika ove tehnologije je da se sastoji od sledećihGlavna odlika ove tehnologije je da se sastoji od sledećih delova:• skup ugrađenih ulazno-izlaznih komponenti• događajima vođen (event driven) programski model, sa opcijama za obradu i

reagovanje na događajeg j g j• model komponenti koji omogućava programerima serverske strane razvoj dodatnih

komponentiNeke od JSF komponenti su jednostavne, kao na primer ulazna polja ili dugmad. Druge su dosta sofisticiranije, na primer p j g g j , ptabele podataka i stabla. JSF sadrži sav potreban kod za obradu događaja i organizaciju komponenti.Aplikativni programeri mogu da zanemare sve nepotrebneAplikativni programeri mogu da zanemare sve nepotrebne detalje i da se usredsrede na sam razvoj aplikacione logike.Takođe, treba napomenuti da je JSF danas deo Java EE standarda, što znači da je uključena u svaki Java EE aplikacioni

i d ž j d t d d ti W b kserver, i da se može jednostavno dodati na Web servere, kao što je Jakarta Tomcat. Tada je potrebno koristiti i dodatne JSF biblioteke (videti na http://javaserverfaces.dev.java.net

© SI1P1 – 2004 3/15

p //j j

Page 4: Programiranje Programiranje Internet Internet aplikacija aplikacija

Najvažniji servisi koje JSF obezbeđujeMVC arhitektura – sve softverske aplikacije omogućavajuMVC arhitektura sve softverske aplikacije omogućavaju korisnicima da manipulišu sa određenim podacima, ako što su karte za kupovinu, informacije o putovanju, ili bilo koji drugi potrebni podaci za određeni problem. Ovi podaci se nazivaju

d l (M d l) O j k ji ij ft i di l dmodel (Model). Onaj koji razvija softver proizvodi poglede (Views) na dati model podataka. Kod Internet aplikacija, HTML se koristi da bi se dobili traženi pogledi. JSF omogućava konekciju između pogleda i modela. Na primer, komponentakonekciju između pogleda i modela. Na primer, komponenta pogleda se može povezati sa property-ijem Bean-a na sledeći način<h:inputText value="#{korisnik.ime}" />Ovaj kod dovodi do toga da kada korisnik klikne na dato dugme i forma se pošalje na server, JSF implementacija poziva metod check() koji se nalazi u okviru Bean-a korisniik. Ovaj metod može da izvrši validacione akcije i da izvrši promene modelamože da izvrši validacione akcije i da izvrši promene modela, kao i da vrati navigacioni ID koji definiše koja će se stranica sledeća prikazati.

© SI1P1 – 2004 4/15

Page 5: Programiranje Programiranje Internet Internet aplikacija aplikacija

Najvažniji servisi koje JSF obezbeđujeKonverzija podataka – korisnik unosi podatke u okviru forme u oblikuKonverzija podataka korisnik unosi podatke u okviru forme u obliku teksta. Objektima povezanim sa poslovnom logikom potrebni su podaci u obliku brojeva, datuma, ili nekog drugog tipa podataka. JSF omogućava da se na jednostavan način specificiraju i primene potrebna pravila konverzije.

š ćValidacija i obrada grešaka – JSF omogućava jednostavno povezivanje validacionih pravila za sva ulazna polja. Na primer „vrednost u ovo polje je neophodno uneti“, „vrednost ovog polja mora biti broj“,... Takođe. Kada korisnik unese neodgovarajući podatak, potrebno je prikazati odgovarajuću poruku JSF umnogome olakšava ovu potrebuprikazati odgovarajuću poruku. JSF umnogome olakšava ovu potrebu.Internacionalizacija – JSF sadrži razne opcije za kodiranje posebnih karaktera i selekciju pomoćnih resursa koje se koriste.Dodatne komponente – onaj deo tima koji razvija potrebne komponente može veoma kompleksne i složene komponente da pružikomponente može veoma kompleksne i složene komponente da pruži na raspolaganje dizajnerima, koji mogu da ih na jednostavan način prikažu na stranici. Na primer može da se razvije komponenta kalendar sa uobičajenom zvučnom podrškom. Tada se može kodirati na stranici sa<acme:kalendar value="#{let.dolazak}" poecetak="Pon" />

Alternativni prikazi – definisano ponašanje JSF je da generiše tagove za HTML stranice. Ali, veoma je jednostavno nadograditi JSF framework da proizvodi oznake za neki drugi opisni jezik, kao što je

© SI1P1 – 2004 5/15

p g p j , jWML, XUL.

Page 6: Programiranje Programiranje Internet Internet aplikacija aplikacija

Prednosti JSF (u odnosu na standardni MVC)

Ugrađene GUI kontroleUgrađene GUI kontrole– JSF sadrži skup API i povezanih ugrađenih tagova koji omogućavaju kreiranje HTML formi sa kompleksnijim interfejsomObrada događajaObrada događaja– JSF omogućava jednostavno pisanje Java koda koji se poziva kada se forma submituje. Kod može da odgovara određenom dugmetu, promeni određene vrednosti, selekciji korisnika, ...Organizovanje bean-ova– U okviru JSP, može se koristiti property="*" sa jsp:setProperty da bi se automatski popunio bean baziran na request parametrima. JSF vrši

d d j ć ti ć k lik d d t k i ćnadogradnju ove mogućnosti pomoću nekoliko dodataka, i omogućava jednostavno procesiranje request parametara.Expression Language

JSF sadrži koncizan i moćan jezik za pristup bean propertie ijima i– JSF sadrži koncizan i moćan jezik za pristup bean propertie-ijima i elementima kolekcija

© SI1P1 – 2004 6/15

Page 7: Programiranje Programiranje Internet Internet aplikacija aplikacija

Prednosti JSF (u odnosu na standardni MVC)

Konverzija i validacija polja formeKonverzija i validacija polja forme– JSF ima ugrađene opcije za provere da li su vrednosti forme u propisanom formatu i za konvertovanje iz stringa u željeni tip podataka. Ako vrednsot nedostaje ili nije u odgovarajućem formatu forma seAko vrednsot nedostaje ili nije u odgovarajućem formatu, forma se automatski ponovo prikaže sa porukom o grešci i prethodno unetim vrednostimaCentralizovana konfiguracija bazirana na fajlovimaCentralizovana konfiguracija bazirana na fajlovima– Umesto da budu upisane u okviru Java programa, mnoge JSFvrednosti se čuvaju u okviru XML ili property fajlova. Ovakav pristup omogućava izvršavanje promena bez modifikovanja ili ponovnogomogućava izvršavanje promena, bez modifikovanja ili ponovnog kompajliranja Java koda, samo promenama određenog fajla. Takođe, prednost ovakvog pristupa je mogućnost da se Java i Web programeri usredsrede na specifične zadatke, bez razmišljanja o sistemskom layout-usredsrede na specifične zadatke, bez razmišljanja o sistemskom layoutu.Konzistentan pristup– JSF ohrabruje konzistentnu upotrebu MVC pristupa u okviru aplikacije

© SI1P1 – 2004 7/15

JSF ohrabruje konzistentnu upotrebu MVC pristupa u okviru aplikacije.

Page 8: Programiranje Programiranje Internet Internet aplikacija aplikacija

Nedostaci JSF

Potrebno više vremena za učenjePotrebno više vremena za učenje– Da bi se realizovao MVC pristup sa standardnom naredbom RequestDispatcher, potrebno je znati samo t d d i JSP i l t API D bi li MVC i tstandardni JSP i servlet API. Da bi se realizovao MVC pristup

pomoću JSF frameworka, potrebno je znati standardni JSP iservlet API i veliki i složeni framework koji je otprilike jednak

liči i i i t O j d t t k d l i dpo veličini sa osnovnim sistemom. Ovaj nedostatak dolazi do izražaja posebno kod malih projekata, kratkih rokova, i manjeg iskustva razvojnog tima. Moguće je da se provede i t č ći JSF k lik i li ij i tisto vremena učeći JSF koliko i za realizaciju samog sistema.Nedovoljna dokumentacija– U poređenju sa standardnim servlet i JSP API, JSF imaU poređenju sa standardnim servlet i JSP API, JSF ima samo nekoliko online resursa, a mnogi početnici će smatrati da je online Apache dokumentacija konfuzna i loše organizovana. Takođe, mnogo manje knjiga postoji o ovoj

© SI1P1 – 2004 8/15

organizovana. Takođe, mnogo manje knjiga postoji o ovoj tehnologiji, nego o servletima i JSP.

Page 9: Programiranje Programiranje Internet Internet aplikacija aplikacija

Nedostaci JSF

Manje transparentnoManje transparentno– Sa JSF aplikacijama, dosta više stvari se dešava u pozadini, nego kod uobičajenih Java-based Web aplikacija. p , g j p jKao krajni rezultat, JSF aplikacije su:• teže za razumevanje

ž i j i i i ij• teže za testiranje i optimizacijuRigidni pristup

Navedeno je da je jedna od prednosti JSF ohrabrivanje za– Navedeno je da je jedna od prednosti JSF ohrabrivanje za korišćenje MVC pristupa. Iz ovog razloga u okviru JSF je teško koristiti druge pristupe.

© SI1P1 – 2004 9/15

Page 10: Programiranje Programiranje Internet Internet aplikacija aplikacija

Prednosti JSF (u odnosu na Struts)

Ugrađene komponenteUgrađene komponente– U okviru JSF relativno je jednostavno kombinovati kompleksne GUI kontrole u okviru jedne komponente; St t t ij ć tiStruts to nije u mogućnostiPodrška za druge tehnologije razvoja interfejsa– JSF nije limitiran na HTML i HTTP; Struts jesteJSF nije limitiran na HTML i HTTP; Struts jestePristup beanu pomoću imena– JSF dozvoljava da se bean-u dodeli ime, i da se poziva po imenu u okviru formi Struts ima složen proces sa nekolikoimenu u okviru formi. Struts ima složen proces sa nekoliko nivoa direkcije, gde se mora pamtiti koja forma je ulazna za svaku akciju.Expression jezik– JSF expression jezik je više koncizan i moćan nego Struts bean:write tag.

© SI1P1 – 2004 10/15

g

Page 11: Programiranje Programiranje Internet Internet aplikacija aplikacija

Prednosti JSF (u odnosu na Struts)

Jednostavnije definicije kontrolera i bean aJednostavnije definicije kontrolera i bean-a– JSF ne zahteva da klase kontrolera i bean-a nasleđuju određenu parent klasu (n.p., Action) ili da koriste određeni p ( p , )metod (n.p., execute). Struts zahteva.Jednostavniji config fajlovi i struktura sistema

f fi l f jl j j d iji b– faces-config.xml fajl je mnogo jednostavniji za upotrebu nego struts-config.xml file. Generalno, JSF je jednostavniji.Veći razvoj alata za implementacijuVeći razvoj alata za implementaciju– Pristup sa GUI kontrolama i njihovim obradama, otvara mogućnost jednostavnijeg korišćenja drag-and-drop

žrazvojnih okruženja

© SI1P1 – 2004 11/15

Page 12: Programiranje Programiranje Internet Internet aplikacija aplikacija

Nedostaci JSF (u odnosu na Struts)

Ne postoji ekvivalent Tiles tehnologijiNe postoji ekvivalent Tiles tehnologiji– Struts pruža podršku za realizaciju layout-a stranice; JSF ne• Ali se može iskoristiti Tiles deo iz Struts i korisititi u okviru JSFDosta slabija automatska validacija– Struts sadrži validatore za email adrese, brojeve kreditne kartice, regularne izraze, ... JSF sadrži validatore samo za neunete vrednosti,

ždužinu unosa, i da li je broj u datom opsegu• Ali MyFaces sadrže nekoliko moćnih validatoraNedostatak validacije na klijentskoj stranij j j– Struts podržava JavaScript-baziranu validaciju polja formi; JSF ne• Shale validatori dodaju validaciju na klijentskoj strani JSFOtežana instalacijaOtežana instalacija– JSF nema ekvivalnet za struts-blankSamo POST

JSF d ž GET d© SI1P1 – 2004 12/15

– JSF ne podržava GET metod

Page 13: Programiranje Programiranje Internet Internet aplikacija aplikacija

Postupak konfiguracije JSF

JSF aplikacija se instaliraju u obliku WAR fajlaJSF aplikacija se instaliraju u obliku WAR fajla –zapakovane aplikacije sa ekstenzijom war i strukturom direktorijuma sa sledećim standardizovanim rasporedom:

project-nameHTML i JSP straniceHTML i JSP stranice/WEB-INF

konfiguracioni fajlovikonfiguracioni fajlovi/classes

Javine klase/lib

Dodatne biblioteke© SI1P1 – 2004 13/15

Page 14: Programiranje Programiranje Internet Internet aplikacija aplikacija

Postupak konfiguracije JSF

U okviru predložene Javine BluePrints dokumentacijeU okviru predložene Javine BluePrints dokumentacije (http://java.sun.com/blueprints/code/projectconvertions.com) se preporučuje malo promenjena struktura. Preporučuje se da se i sam kod čuva u direktorijumu src/java , p j j j ,a da se JSF stranice i konfiguracioni fajlovi čuvju u web direktorijumu.

project-name/source/java

/com/mojPaket

/korisnikBean.java/webHtml, jsp, …/WEB-INF

/classes© SI1P1 – 2004 14/15/lib

XML fajlovi

Page 15: Programiranje Programiranje Internet Internet aplikacija aplikacija

Postupak konfiguracije JSF

Direktorijum ili fajl Objašnjenje

project-name Direktorijum projekta koji se zove kao i projekatproject name Direktorijum projekta koji se zove kao i projekat

/source Ovde se smeštaju java source klase i .propertiesfajlovi

/web Ovde se nalaze fajlovi web aplikacije koje koristiserver ili servlet container.

/WEB-INF Ovaj folder sadrži fajlove web aplikacije koji sekoriste u runtime-u ali su sakriveni odbrowser-a

/classes Ovde se nalaze kompajlirane java klase kao i.proprties fajlovi iskopirani iz JavaSource-a

© SI1P1 – 2004 15/15/lib Ovde se nalaze biblioteke potrebne za radaplikacije

Page 16: Programiranje Programiranje Internet Internet aplikacija aplikacija

Dokumentacija

API JavadocsAPI Javadocs– http://java.sun.com/j2ee/javaserverfaces/1.1/docs/api/Tag library dokumentaTag library dokumentahttp://java.sun.com/j2ee/javaserverfaces/1.1/docs/tlddocs/http://horstmann.com/corejsf/faces-config.htmlMyFaces Reference– http://myfaces.apache.org/User's Guide, extensions documentation, FAQs, ...Knjige

© SI1P1 – 2004 16/15

Page 17: Programiranje Programiranje Internet Internet aplikacija aplikacija

Razvoj JSF aplikacije

Start sa početnom aplikacijom koja ima sve potrebne ulazeStart sa početnom aplikacijom koja ima sve potrebne ulaze– Potrebno je • JAR files• web.xml ulazi• config fajlovi• properties fajlovip p j– I MyFaces i Sun RI nemaju svoj ekvivalent Struts struts-blank aplikacijiKoristiti ant– MyFaces source distribution koji sadrži ugrađene skriptoveMyFaces source distribution koji sadrži ugrađene skriptove• Nije uključen u osnovni MyFaces download– Sun RI sadrži

i t ll di / l /b ild ti l• install_dir/samples/build.properties.sample• I dalje treba dodati web.xml ulaze

© SI1P1 – 2004 17/15

Page 18: Programiranje Programiranje Internet Internet aplikacija aplikacija

Dodatne mogućnosti

Koristiti primere sa InternetaKoristiti primere sa Interneta– Download sa http://www.coreservlets.com/JSF-Tutorial/Tutorial/– jsf-blank-myfaces• Sadrži sve potrebne ulaze• Sadrži sve potrebne ulaze• Sadrži i JAR fajlove za MyFaces dodatke, portlete,fajl upload, i Tiles

– jsf-blank-myfaces-minimalj y• Sadrži sve potrebne ulaze• Ne sadrži dodatke

j f bl k S RI– jsf-blank-Sun-RI• Sadrži sve potrebne ulaze• Ne sadrži dodatke

© SI1P1 – 2004 18/15

Page 19: Programiranje Programiranje Internet Internet aplikacija aplikacija

Životni ciklus

JSF specifikacija definiše 6 različitih fazaJSF specifikacija definiše 6 različitih faza Faza Restore View vraća stablo komponenti, za stranicu koja je ranije prikazivana, odnosno pravi novo stablo komponenti ako se stranica prikazuje prvi put. Ako je stranica ranije p j p p j jprikazivana, sve komponente se postavljaju na početno stanje. To znači da JSF automatski postavlja informacije o traženoj formi. Na primer kada korisnik unese i pošalje određene nelegalne podatke koji se neće propustiti na dalju obradunelegalne podatke, koji se neće propustiti na dalju obradu tokom njihove provere, ulazni podaci se korisniku ponovo prikazuju, tako da korisnik može da ih ispravi. Ako zahtev ne sadrži ulazne podatke, JSF implementacija prelazi na Render

f d đ k d i ik j iResponse fazu. Ovo se događa kada se stranica prikazuje prvi put.Sledeća faza je Apply Request Values. U okviru ove faze JSF implementacija prolazi kroz objekte komponenti u okviru stablaimplementacija prolazi kroz objekte komponenti u okviru stabla komponenti. Za svaki objekat komponenti se proverava koja mu vrednost pripada i ona mu se dodeljuje. U ovoj fazi se dodaju događaji vezani za dugme ili link u red događaja.

© SI1P1 – 2004 19/15

Page 20: Programiranje Programiranje Internet Internet aplikacija aplikacija

Životni ciklus

U okviru Process Validation poslati stringovi se prvo prebacuju uU okviru Process Validation poslati stringovi se prvo prebacuju u „lokalne“ vrednosti, koji mogu biti objekti bilo kog tipa. Kada se diznira JSF stranica, mogu se za klijentsku stranicu vezati validatori koji izvršavaju proveru korektnosti lokalnih vrednosti. Ako je validacija uspešna, JSF ciklus se nastavlja normalno. Kada se desi greška JSFuspešna, JSF ciklus se nastavlja normalno. Kada se desi greška JSF implementacija poziva Render Response fazu direktno, prikazujući ponovo traženu stranicu, tako da se korisniku omogući korektan unos. Može se prikazati i odgoavarjuća poruka, koja korisniku objašnjava zašto ponovo vidi iste podatkezašto ponovo vidi iste podatke.Kada se izvrše konverzije i validacije, pretpostavlja se da je bezbedno promeniti model podataka. Tokom Update Model Values faze, lokalne vrednosti se koriste da bi se promenile vrednosti u Bean-ovima povezanim sa komponentamapovezanim sa komponentama.U okviru Invoke Application faze izvršava se metod action() dugmeta ili linka koji je doveo do slanja forme. U ovom metodu se mogu izvršiti dodatne aplikacione obrade. Takođe, tu se generiše izlazni string, koji

š lj d l i d i i ij d i š ise šalje delovima odgovornim za navigaciju, gde se izvršava poziv nove stranice.Na kraju, Render Response faza dekodira odgovor i šalje ga klijentu. Kada korisnik sa nove stranice pošalje novu formu, klikne na link ili na

© SI1P1 – 2004 20/15

p j ,drugi način generiše novi zahtev, startuje se novi ciklus

Page 21: Programiranje Programiranje Internet Internet aplikacija aplikacija

Životni ciklus

© SI1P1 – 2004 21/15

Page 22: Programiranje Programiranje Internet Internet aplikacija aplikacija

Životni ciklus

Za realizaciju web aplikacija JSF pojednostavljujeZa realizaciju web aplikacija JSF pojednostavljuje razvojni proces obezbeđujući komponentnocentričan pristup razvoju java web user intreface-a. Glavne komponente JSF-a su:API koji omogućava predstavljanje UI komponenti i manipulisanje njihovim stanjima upravljanjemanipulisanje njihovim stanjima, upravljanje događajima, validacije na strani servera, konverziju podataka, definisanje navigacije između stranica, i t i li ijinternacionalizaciju.Dve JSP tag biblioteke za predstavljanje UI komponenti u okviru JSP strane i za povezivanjekomponenti u okviru JSP strane i za povezivanje komponenti sa serverskim objektima.

© SI1P1 – 2004 22/15

Page 23: Programiranje Programiranje Internet Internet aplikacija aplikacija

Životni ciklus

Korisnički interfejs koji je kreiran pomoću JSF tehnologijeKorisnički interfejs koji je kreiran pomoću JSF tehnologije (myUI ) se izvršava na serveru i renderuje nazad klijentu.

myform.jsp je JSF stranica - JSP stranica koja u sebi sadrži JSF tagove. Ona prikazuje UI komponente koristeći tagove definisane JavaServer Faces tehnologijom. UI za web aplikacijudefinisane JavaServer Faces tehnologijom. UI za web aplikaciju (myUI) manipuliše objektima koje koristi JSP strana. Ovi objekti uključuju:• UI component objekte koji se mapiraju na tag-ove na JSP strani

© SI1P1 – 2004 23/15• Event lintener-e, validator-e, i converter-e koji su registrovani na komponente• Objekte koji enkapsuliraju podatke i funkcionalnosti komponente specifične za

aplikaciju

Page 24: Programiranje Programiranje Internet Internet aplikacija aplikacija

Životni ciklus

JSF framework prati Model-View-Controller (MVC) pattern štoJSF framework prati Model View Controller (MVC) pattern što JSF aplikacije čini dosta prilagodljivijm i pogodnijim za rad -user-interface kod (View) je razdvojen od aplikacionih podataka i logike (Model).JSF servlet (Controller) upravlja svom korisničkom interakcijom sa aplikacijom. On priprema JSF kontekst koji omogućava stranicama pristup aplikacionim podacima kao i zaštitu od neovlašćenog i neadekvatnog pristupa stranicamazaštitu od neovlašćenog i neadekvatnog pristupa stranicama.

© SI1P1 – 2004 24/15

Page 25: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – JSF stranice

Iako JSF prirodno koristi JSP kao prezentacionu tehnologiju -Iako JSF prirodno koristi JSP kao prezentacionu tehnologiju nije ograničen samo na JSP. Kako se JSF API sloj nalazi direktno iznad Servlet API sloja to omogućava de se neka druga prezentaciona tehnologija koristi umesto JSP-a . Da bi mogli da se koriste JSF tagovi svaka JSP strana na vrhuDa bi mogli da se koriste JSF tagovi svaka JSP strana na vrhu mora imati sledeće dve taglib direktive:

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>g p j j p

Prva uključuje html_basic a druga jsf_core tagove. html_basic tag-ovi predstavljaju HTML form kontrole i druge osnovne HTML elemente i prikazuju podatke ili prihvataju podatke od korisnika (column commandButton commandLinkpodatke od korisnika (column, commandButton, commandLink, form, message, outputText, itd.)jsf_core tagovi se koriste za ključne akcije koje su nezavisne od određenog render-a (na primer tagovi za rad sa događajima (actionListener) tagovi za konverziju podataka (converter(actionListener), tagovi za konverziju podataka (converter, convertDateTime, convertNumber), tagovi za validaciju (validator, validateLength), loadBundle, param, subview, view itd.).

© SI1P1 – 2004 25/15

Page 26: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – navigacija

Navigacija je jedna od najbitnijih osobina JSFNavigacija je jedna od najbitnijih osobina JSF paketa. Navigacija za neku aplikaciju se definiše u okviru faces-config.xml konfiguracionog fajla:

<navigation-rule><from-view-id>/pages/inputname.jsp</from-view-id>id>

<navigation-case><from-outcome>greeting</from-outcome><from outcome>greeting</from outcome><to-view-id>/pages/greeting.jsp</to-view-id>

</navigation-case>g</navigation-rule>

© SI1P1 – 2004 26/15

Page 27: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – navigacija

Definisano je kako će se sa strane inputname jsp (definisane uDefinisano je kako će se sa strane inputname.jsp (definisane u okviru from-view-id elementa) preći na stranu greeting.jsp (definisane u okviru to-view-id elementa). navigation-rule može imati proizvoljan broj navigation-case-g p j j gova od kojih svaki definiše koja se strana sledeća učitava bazirano na logičkom ishodu (definisanom u okviru from-outcome). Ishod može biti definisan od strane action atributa UICommandIshod može biti definisan od strane action atributa UICommand komponente koja vrši submit forme:

<h:commandButton action="greeting“ value="#{msg.button text}" />value= #{msg.button_text} /> Ishod se takođe može dobiti kao povratna vrednost akcione metode pratećeg bean-a. Ovaj metod vrši neki proces da bi utvrdio ishod. Npr. metod može da proveri da li je lozinka koju je korisnik uneo ispravna. Ako jeste metod vraća success a u suprotnom slučaju failure. U prvom slučaju korisnik bi bio prebačen na stranicu u okviru sajta a u drugom da se ponovo učita login strana sa porukom o

© SI1P1 – 2004 27/15sajta a u drugom da se ponovo učita login strana sa porukom o grešci.

Page 28: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – navigacija

Ako se pažljivo biraju stringovi moguće je skupiti višestrukaAko se pažljivo biraju stringovi, moguće je skupiti višestruka pravila navigacije na jedno mesto. Ako želimo da se akcija prikaz nalazi u više različitih JSF stranica i da iz svake poziva stranicu prikaz.jsp, tada unosimo sledeće pravilo navigacije:

<navigation-rule><navigation case><navigation-case><from-outcome>logout</from-outcome><to-view-id>/logout.jsp</to-view-id><to view id>/logout.jsp</to view id></navigation-case></navigation-rule>g

Ovo pravilo se odnosi na sve stranice zato što nijedan from-view-id element nije definisan.

© SI1P1 – 2004 28/15

Page 29: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – navigacija

Tehnike koje su prikazane su dovoljne za većinu aplikacijaTehnike koje su prikazane su dovoljne za većinu aplikacija.Ali mogu se primeniti i druga pravila za navigacioneelemente u okviru faces-config.xml fajla.

© SI1P1 – 2004 29/15

Page 30: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine –redirekcija

Ako se unese redirect element posle to-view-id elementa JSF prekidaAko se unese redirect element posle to-view-id elementa, JSF prekida trenutni zahtev i šalje HTTP redirect klijentu, što govori klijentu koji URL da koristi za sledeću stranicu. Preusmerenje stranice je sporije u odnosu na prosleđivanje jer sePreusmerenje stranice je sporije u odnosu na prosleđivanje jer se aktivira još jedan ciklus sa browser-om, ali dopušta browser-u da izmeni vrednost svog adresnog polja.

<navigation-case><navigation-case><from-outcome>success</from-outcome><to-view-id>/success.jsp</to-view-id>

di /<redirect/></navigation-case>

Bez redirekcije, orginalni URL (localhost:8080/javaquiz/index.faces) ostaje nepromenjen kada se sa /index.jsp pređe na stranicu /success.jsp. Sa redirekcijom, browser prikazuje novi URL

© SI1P1 – 2004 30/15(localhost:8080/javaquiz/success.faces).

Page 31: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – validacija

JSF tehnologija podržava mehanizam za validacijuJSF tehnologija podržava mehanizam za validaciju lokalnih podataka koji pripadaju komponentama koje mogu dobijati vrednost (kao npr. text field).Validacija se odigrava pre nego što se u odgovarajući model podataka postavi na lokalnu vrednost. Definisan je standardan skup klasa koje obavljajuDefinisan je standardan skup klasa koje obavljaju uobičajene validacione provere. Osnovna JSF tag biblioteka definiše skup tag-ova g p gkoji odgovaraju standardnim implementacijama Validator interfejsa.

© SI1P1 – 2004 31/15

Page 32: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – validacija

Klasa za validaciju Tag FunkcijaKlasa za validaciju Tag Funkcija

DoubleRangeValidator validateDoubleRange Proverava da li je lokalna vrednost komponente u određenom opsegu. p gVrednost mora biti u pokretnom zarezu ili da može da se konvertuje u pokretni zarez.

LengthValidator validateLength Proverava da li je dužina lokalne vrednosti komponente u određenomodređenom opsegu.Vrednost mora biti String

LongRangeValidator validateLongRange Proverava da li je lokalna vrednost komponente u određenom opsegu. Vrednost može biti bilo koji numerički tip ili

ž© SI1P1 – 2004 32/15

String koji se može konvertovati u long.

Page 33: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine - validacija

Kada se koriste standardne implementacijeKada se koriste standardne implementacije Validator-a ne treba pisati kod koji će da izvrši validaciju. Potrebno je samo unutar tag-a koji predstavlja komponentu tipa UIInput ugnjezditi standardni validacioni tag i obezbediti određene granice ako ih tag zahteva:granice ako ih tag zahteva:

<h:inputText value="#{personBean.personName}" required="true"><f:validateLength minimum="2" maximum="10"/>

</h:inputText> Moguće je takođe napraviti sopstveni validator iMoguće je takođe napraviti sopstveni validator i odgovarajući tag. Postoje dva načina da se to uradi:• Implementirati Validator interfejs koji će da izvede validaciju.

© SI1P1 – 2004 33/15• Implementirati pozadinsku metodu bean-a koja izvodi validaciju.

Page 34: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – bean-ovi

Tipična JSF aplikacija uparuje bean u pozadini saTipična JSF aplikacija uparuje bean u pozadini sa svakom stranicom u aplikaciji. Bean definiše sadržaj i metode koje su pridružene

k j UI k ti k j k i ti t i isvakoj UI komponenti koja se koristi na stranici.Sadržaj samog bean-a može biti povezan ili sa instancom komponente ili sa njenom vrednošću. Metode backing bean-a izvode određene funkcije vezane za komponentu kao što su: validacija podataka komponente, obrada događaja kojepodataka komponente, obrada događaja koje komponenta okida i izvođenje akcija vezanih za navigaciju kada se aktivira komponenta. Atribut value tag-a komponente se koristi da povežeAtribut value tag-a komponente se koristi da poveže sadržaj bean-a sa vrednošću komponente. Atribut binding tag-a komponente se koristi da

ž d ž j b i t k t© SI1P1 – 2004 34/15

poveže sadržaj bean-a sa instancom komponente.

Page 35: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – bean-ovi

public class PersonBean {public class PersonBean {String personName;/*** @return Vraca ime */*/public String getPersonName() {

return personName;}}/*** @param Ime*/public void setPersonName(String name) {public void setPersonName(String name) {

personName = name;}

}Vrednost komponente je povezana sa atributom bean-a na JSP stranici:<h:inputText value="#{personBean.personName}" required="true"><f:validateLength minimum="2" maximum="15"/>

© SI1P1 – 2004 35/15

g /</h:inputText>

Page 36: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovne osobine – bean-ovi

Posle implementacije bean-ova koji će se koristiti u aplikacijiPosle implementacije bean-ova koji će se koristiti u aplikaciji potrebno je konfigurisati ih u faces-config.xml konfiguracionom fajlu. To je potrebno da bi JSF mogao da automatski kreira noveTo je potrebno da bi JSF mogao da automatski kreira nove instance bean-ova kad god se ukaže potreba:

<managed-bean><managed bean name>personBean</managed bean name><managed-bean-name>personBean</managed-bean-name><managed-bean-class>jsfks.PersonBean</managed-bean-

class>d b / d b<managed-bean-scope>request</managed-bean-scope>

<managed-property><property-name>personName</property-name><property-class>java.lang.String</property-class><value>Bosko Nikolic</value>

</managed-property>© SI1P1 – 2004 36/15

</managed property></managed-bean>

Page 37: Programiranje Programiranje Internet Internet aplikacija aplikacija

Realizacija navigacije

JSF kontrola tokaJSF kontrola tokaOsnovni koraci kod upotrebe JSFStatička navigacijaStatička navigacija– Mapiranje u jedan rezultatDinamička navigacija– Mapiranje u više rezultata

© SI1P1 – 2004 37/15

Page 38: Programiranje Programiranje Internet Internet aplikacija aplikacija

JSF kontrola toka (pojednostavljena)

© SI1P1 – 2004 38/15

Page 39: Programiranje Programiranje Internet Internet aplikacija aplikacija

JSF kontrola toka (pojednostavljena)

Forma se prikažeForma se prikaže– Forma koristi f:view i h:formIzvrši se submit forme– Originanil URL i ACTION URL su http://…/blah.facesNapravi se instanca bean-a

Navedeni u managed beans delu faces config xml– Navedeni u managed-beans delu faces-config.xmlPoziva se action controller metod– Naveden kao action atribut h:commandButtonaction metod vraća uslov– String koji se poklapa sa from-outcome u okviru navigacionih pravila u faces config xmlnavigacionih pravila u faces-config.xmlRezultujuća stranica se prikazuje– Stranica je specificirana sa to-view-id u okviru

© SI1P1 – 2004 39/15

j pnavigacionih pravila u faces-config.xml

Page 40: Programiranje Programiranje Internet Internet aplikacija aplikacija

Osnovni koraci upotrebe JSF

1 Kreirati bean sa propertie-ijim za svako polje forme1. Kreirati bean sa propertie-ijim za svako polje forme2. Kreirati početnu formu

• Koristiti f:view, h:form, h:blah, i h:commandButton3. Specificirati action controller metod

• Koristiti action atribut h:commandButton4. Kreirati action controller metod

• U okviru bean-a iz tačke #1. Pregledati podatke sa forme, primeniti poslovnu logiku, smestiti rezultate u bean-ove, i vratiti uslove

5. Promeniti faces-config.xml5. Promeniti faces config.xml• Deklarisati form bean i pravila navigacije

6. Kreirati JSP straniceZa svaki uslov koji se vraća kao rezultat• Za svaki uslov koji se vraća kao rezultat

7. Zaštiti osnovne JSP stranice od pristupa• Koristiti filter ili podešavanja bezbednosti

© SI1P1 – 2004 40/15

Page 41: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer 1

Kopirati jsf blankKopirati jsf-blank– Preinemovati u jsf-test– Identičan rad sa Apache MyFaces i Sun RIIdentičan rad sa Apache MyFaces i Sun RIOriginalni URL:– http://hostname/jsf-test/register1.facesKada se forma submituje:– Statička stranica (result1.jsp) se prikazujeStatički rezultat:– Nema poslovne logike, bean-ova, ili Java kodaGlavni ciljeviGlavni ciljevi– Format originalne forme– Upotreba faces-config xml fajla

© SI1P1 – 2004 41/15

Upotreba faces config.xml fajla

Page 42: Programiranje Programiranje Internet Internet aplikacija aplikacija

Ciljevi primera

Početna forma je u sledećem formatu:j<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>HTML markupp<h:form>HTML markup and h:blah tags</h:form>HTML markupp</f:view>

Deklarišu se mapiranja u faces-config.xml<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE faces-config PUBLIC …>g<faces-config><navigation-rule><from-view-id>/blah.jsp</from-view-id><navigation-case>g<from-outcome>some string</from-outcome><to-view-id>/WEB-INF/results/something.jsp</to-view-id></navigation-case></navigation-rule>

© SI1P1 – 2004 42/15

g</faces-config>

Page 43: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 2: kreiranje početne forme

Osnovni formatOsnovni format<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><f:view>…<BODY>…<h:form>…</h:form></h:form>…</BODY>

/f i</f:view>Poziv stranice– Fajl je blah.jsp

URL j bl h f© SI1P1 – 2004 43/15

– URL je blah.faces

Page 44: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 2: kreiranje početne forme

h:form elementh:form element– ACTION je automatski isti fajl (trenutni URL)– METHOD je automatski POSTElementi unutar h:form– Koristiti specijalne tagove da bi se prikazali ulazni elementi• h:inputText odgovara <INPUT TYPE="TEXT">p g• h:inputSecret odgovara <INPUT TYPE="PASSWORD">• h:commandButton odgovara <INPUT TYPE="SUBMIT">– Kasnije ulazni elementi će se povezivati sa propertie-ijima beanKasnije, ulazni elementi će se povezivati sa propertie-ijima bean– Za statičku navigaciju, specificira se jednostavan string kao akcija za h:commandButton

String mora da odgovara pravilima navigacije iz faces config xml• String mora da odgovara pravilima navigacije iz faces-config.xmlViše informacija o h:blah elementima– http://java.sun.com/j2ee/javaserverfaces/1.1/docs/tlddocs/

© SI1P1 – 2004 44/15

Page 45: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 2: primer koda

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>%@ taglib uri http://java.sun.com/jsf/core prefix f %<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><!DOCTYPE …><HTML><HTML><HEAD>…</HEAD><BODY><CENTER><TABLE BORDER=5><TR><TH CLASS="TITLE">New Account Registration</TH></TR></TABLE><P><P><h:form>Email address: <h:inputText/><BR>Password: <h:inputSecret/><BR><h:commandButton value="Sign Me Up!" action="register"/></h:form></CENTER></BODY></HTML></f:view>

© SI1P1 – 2004 45/15

</f:view>

Page 46: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3: specificirati Action Controller

Koristiti action atribut h:commandButtonKoristiti action atribut h:commandButton• U većini realnih slučajeva, specificira se metod koji se poziva ka da se forma prosledi– Metod vraća različite string-ove, i faces-config.xml mapira stringove u izlazne straniceZa statičku navigaciju, specificira se jednostavanZa statičku navigaciju, specificira se jednostavan string– faces-config.xml mapira string u izlaznu straniceuPrimerPrimer

<h:form>Email address: <h:inputText/><BR>p /Password: <h:inputSecret/><BR><h:commandButton value="Sign Me Up!" action="register"/>

/h f© SI1P1 – 2004 46/15</h:form>

Page 47: Programiranje Programiranje Internet Internet aplikacija aplikacija

Koraci 2 i 3: rezultat

Fajl je tomcat dir/webapps/jsf test/register1 jspFajl je tomcat_dir/webapps/jsf-test/register1.jspURL he http://localhost/jsf-test/register1.faces

© SI1P1 – 2004 47/15

Page 48: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

Osnovni formatOsnovni format<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE faces-config PUBLIC …><faces-config>g…</faces-config>

Specificirati pravila navigacije…<faces-config><navigation-rule><from view id>/the input form jsp</from view id><from-view-id>/the-input-form.jsp</from-view-id><navigation-case><from-outcome>string-from-action</from-outcome><to-view-id>/WEB-INF/ /something jsp</to-view-id><to view id>/WEB INF/…/something.jsp</to view id></navigation-case></navigation-rule></faces-config>

© SI1P1 – 2004 48/15

/faces config

Page 49: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

<?xml version='1 0' encoding='UTF 8'?><?xml version= 1.0 encoding= UTF-8 ?><!DOCTYPE faces-config PUBLIC …><faces-config><faces config><navigation-rule><from-view-id>/register1.jsp</from-view-id><navigation-case><from-outcome>register</from-outcome><to-view-id>/WEB-INF/results/result1.jsp</to-view-

id></navigation-case></navigation-case></navigation-rule></faces-config>

© SI1P1 – 2004 49/15

/ g

Page 50: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreirati izlaznu JSP stranu

Koristi se RequestDispatcher forwardKoristi se RequestDispatcher.forward– Stranica može/treba da bude u WEB-INFPrimer koda:– /jsf-test/WEB-INF/results/result1 jsp– …/jsf-test/WEB-INF/results/result1.jsp

<!DOCTYPE …><HTML><HEAD> </HEAD><HEAD>…</HEAD><BODY><CENTER><TABLE BORDER 5><TABLE BORDER=5><TR><TH CLASS="TITLE">Success</TH></TR></TABLE><H2>Y h i t d f ll <BR><H2>You have registered successfully.<BR>(Version 1)</H2></CENTER>

/BODY /HTML© SI1P1 – 2004 50/15

</BODY></HTML>

Page 51: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 51/15

Page 52: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 7: Zaštititi JSP strane

Veza imena fajlova i URLVeza imena fajlova i URL– Trenutno fajlovi u formi blah.jsp– URL koji se koriste su u formi blah.faces– Treba zabraniti klijentima da direktno pristupaju JSP stranicamaStrategijeStrategije– Ne mogu se smestiti JSP stranice u WEB-INF• Zato što URL mora da direktno odgovara lokaciji fajla– Koristi se filter ili security-constraint u web.xml. Ali:• Nezgrapno• Lako se zaboravi• Lako se zaboravi• Rezultuje u konfuznum porukama o greškamaJedan od najvećih nedostataka JSF dizajna

© SI1P1 – 2004 52/15

j j

Page 53: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 7

<web-app><web app>…<security-constraint><display-name>p yPrevent access to raw JSP pages that are for JSF pages.</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-name><!-- Add url-pattern for EACH raw JSP page --><url-pattern>/welcome.jsp</url-pattern><url pattern>/register1 jsp</url pattern><url-pattern>/register1.jsp</url-pattern>…</web-resource-collection><auth-constraint><auth constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint>

© SI1P1 – 2004 53/15

/security constraint</web-app>

Page 54: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

Tomcat rezultuje u zbunjujućim porukama oTomcat rezultuje u zbunjujućim porukama o greškamaNe može se jednostavno koristiti error-page i error-j p gcode za bolji prikaz– Status kod 500 se koristi i za druge Tomcat greške

© SI1P1 – 2004 54/15

Page 55: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer 2: Dinamička navigacija

Originalni URL:Originalni URL:– http://hostname/jsf-test/signup.faces– Prikupljaju se informacije o korisnikuKada se forma pošalje, jedan od dva rezultat se prikazuje– Korisnik je prihvaćenKorisnik je prihvaćen– Korisnik se odbijaGlavni ciljevi– Specificirati action controller– Kreirati action controller

Koristiti faces config xml za– Koristiti faces-config.xml za• Deklaraciju controller-a• Mapirati rezultat u izlazne stranice

© SI1P1 – 2004 55/15

p

Page 56: Programiranje Programiranje Internet Internet aplikacija aplikacija

Glavni ciljevi

Specificirati controller sa #{controllerName.methodName}Specificirati controller sa #{controllerName.methodName}<h:commandButton value="Sign Me Up!“

action="#{healthPlanController.register}"/>Metod controller-a vraća stringove koji odgovaraju uslovima– Ako se vrati null, forma se ponovo prikazuje– Za razliku od Struts-a, controller ne zahteva da nasledi neku posebnu klasuPomoću faces-config.xml deklarisati controller

<faces config><faces-config><managed-bean><managed-bean-name>controller name</managed-bean-name><managed-bean-class>controller class</managed-bean-class><managed bean class>controller class</managed bean class><managed-bean-scope>request</managed-bean-scope></managed-bean></faces-config>/ g

Dodati više ulaza navigation-rule entries u faces-config.xml– Jedan za svaki mogući string koji vraća controller– Ako se ne pronađe odgovarajuće poklapanje, form se ponovo prikazuje

© SI1P1 – 2004 56/15

Page 57: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 2: kreiranje početne forme

Ista sintaksa kao u Primeru 1Ista sintaksa kao u Primeru 1– Izuzetak akcija kod commandButton

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>…<h:form>First name: <h:inputText/><BR>Last name: <h:inputText/><BR>Last name: <h:inputText/><BR>...<h:commandButton

l " "value="Sign Me Up!"action="#{healthPlanController.signup}"/></h:form>…

© SI1P1 – 2004 57/15</f:view>

Page 58: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3: Specificirati akciju

Koristiti atribut action od h:commandButtonKoristiti atribut action od h:commandButton– Specificirati #{controllerName.methodName}• Dizajnirani metod ne zahteva argumente i vraća kao razultat string faces-config xml mapira stringove u izlaznerazultat string. faces-config.xml mapira stringove u izlazne stranice• Bean koji sadrži metod controller-a mora da bude deklarisan sa ulazom managed-beans entry u faces-deklarisan sa ulazom managed beans entry u facesconfig.xmlPrimer

<h:form><h:form>First name: <h:inputText/><BR>Last name: <h:inputText/><BR>...<h:commandButtonvalue="Sign Me Up!"action="#{healthPlanController.signup}"/>

© SI1P1 – 2004 58/15

{ g p} /</h:form>

Page 59: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3: Specificirati akciju

Fajl je tomcat dir/webapps/jsf test/signup jspFajl je tomcat_dir/webapps/jsf-test/signup.jspURL je http://localhost/jsf-test/signup.faces

© SI1P1 – 2004 59/15

Page 60: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 4: Kreirati akciju

Ne treba nasleđivati nijednu posebnu klasuNe treba nasleđivati nijednu posebnu klasu– Razlika od Struts-aDizajnirani metod ne prihvata argumente i vraćaDizajnirani metod ne prihvata argumente i vraća String kao rezultat– Svaki string mora da odgovara sa pravilom navigacije u f fi lfaces-config.xml– Rezultat null dovodi do ponovnog prikaza iste formeVećina controller a pristupa parametrima request aVećina controller-a pristupa parametrima request-a preko bean-ova– O tome kasnijej– Za sada, poslovna logika će biti nezavisna od ulaznih podataka

© SI1P1 – 2004 60/15

Page 61: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 4: Kreirati akciju

package coreservlets;package coreservlets;public class HealthPlanController {public String signup() {public String signup() {if (Math.random() < 0.2) {return("accepted");} else {return("rejected");}}}}

© SI1P1 – 2004 61/15

Page 62: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

Declarisati action controllerDeclarisati action controller…<faces-config><managed-bean><managed-bean-name>healthPlanController</managed-bean-name><managed-bean-class>coreservlets HealthPlanControllercoreservlets.HealthPlanController</managed-bean-class><managed-bean-scope>request</managed-bean-scope>

/ d b</managed-bean>…</faces-config>

© SI1P1 – 2004 62/15

Page 63: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

Declarisati action controllerDeclarisati action controller…<faces-config><managed-bean><managed-bean-name>healthPlanController</managed-bean-name><managed-bean-class>coreservlets HealthPlanControllercoreservlets.HealthPlanController</managed-bean-class><managed-bean-scope>request</managed-bean-scope>

/ d b</managed-bean>…</faces-config>

© SI1P1 – 2004 63/15

Page 64: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

Specificirati pravila navigacijeSpecificirati pravila navigacije– Moraju se poklapati sa vrednostima koje šalje controller

…<faces-config>g…<navigation-rule><from-view-id>/signup.jsp</from-view-id><navigation-case><from-outcome>accepted</from-outcome><to-view-id>/WEB-INF/results/accepted.jsp</to-view-id></navigation case></navigation-case><navigation-case><from-outcome>rejected</from-outcome><to-view-id>/WEB-INF/results/rejected jsp</to-view-id><to view id>/WEB INF/results/rejected.jsp</to view id></navigation-case></navigation-rule>…

© SI1P1 – 2004 64/15

…</faces-config>

Page 65: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreirati izlaznu JSP stranicu

/jsf-test/WEB-INF/results/accepted jsp…/jsf-test/WEB-INF/results/accepted.jsp<!DOCTYPE …><HTML><HEAD>…</HEAD><BODY><CENTER><CENTER><TABLE BORDER=5><TR><TH CLASS="TITLE">Accepted!</TH></TR>p / /</TABLE><H2>You are accepted into our health plan.</H2>C t l tiCongratulations.</CENTER></BODY></HTML>

© SI1P1 – 2004 65/15

</BODY></HTML>

Page 66: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreirati izlaznu JSP stranicu

/jsf-test/WEB-INF/results/rejected jsp…/jsf-test/WEB-INF/results/rejected.jsp<!DOCTYPE …><HTML><HEAD>…</HEAD><BODY><CENTER><CENTER><TABLE BORDER=5><TR><TH CLASS="TITLE">Rejected!</TH></TR>j / /</TABLE><H2>You are rejected from our health plan.</H2>G t l tGet lost.</CENTER></BODY></HTML>

© SI1P1 – 2004 66/15

</BODY></HTML>

Page 67: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 67/15

Page 68: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 7: Zaštiti JSP stranice

……<web-app>…<security-constraint><display name><display-name>Prevent access to raw JSP pages that are for JSF pages.</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-name><!-- Add url-pattern for EACH raw JSP page --><url-pattern>/welcome.jsp</url-pattern><url-pattern>/register1 jsp</url-pattern><url-pattern>/register1.jsp</url-pattern><url-pattern>/signup.jsp</url-pattern></web-resource-collection><auth-constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint></web-app>

© SI1P1 – 2004 68/15

</web app>

Page 69: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer: Čitanje podataka zahteva

Originalni URL:Originalni URL:– http://hostname/jsf-test/register2.facesKada se forma pošalje, dobije se jedan od triKada se forma pošalje, dobije se jedan od tri rezultata– Poruka o nelegalnoj email adresi– Poruka o nelegalnoj šifri– UspešnoGl i d iGlavni zadaci– Čitanje podataka zahteva u okviru action controller-a• Kasnije jednostavniji pristup koji se primenjuje u praksi• Kasnije, jednostavniji pristup koji se primenjuje u praksi. Ipak, na ovaj način se može pristupiti HttpServletRequest objektu da bi se pročitali cookie-iji, headeri, ...

© SI1P1 – 2004 69/15

Page 70: Programiranje Programiranje Internet Internet aplikacija aplikacija

Glavni zadaci

Većina konkretnih JSF aplikacija koristi form beanVećina konkretnih JSF aplikacija koristi form bean-ove• KasnijejU ovom primeru se čitanje obavlja ručno– Zahteva odrećeni deo Java koda (ExternalContext)– ExternalContext se koristi i u konkretnim JSF stranicama• Za čitanje request header-a

Z čit j ki ij• Za čitanje cookie-ija• Za postavljanje response header-a ili status kodova• Za pristup promenljivama koje nisu povezane sa form• Za pristup promenljivama koje nisu povezane sa form bean-om

© SI1P1 – 2004 70/15

Page 71: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 1: Kreirati bean propertie-ije

Razmatra se u sledećim lekcijamaRazmatra se u sledećim lekcijama– U ovom primeru podaci sa forme se čitaju na stari način: direktnim pozivom request.getParameter.– Da bi to moglo da bude moguće, treba pregledati ExternalContext, k ji ć i t t d d i l t i JSP bj kti ( tkoji omogućava pristup standardnim servlet i JSP objektima (request, response, ServletContext, session, ...)

ExternalContext context =FacesContext.getCurrentInstance().getExternalContext();FacesContext.getCurrentInstance().getExternalContext();HttpServletRequest request =(HttpServletRequest)context.getRequest();String param1 = request.getParameter("name1");g p q g ( );

–ExternalContext ima i metode za pristup parametrima i drugim podacima iz heš tabele• Request data

tR tP t M tR tC ki M– getRequestParameterMap, getRequestCookieMap, getRequestHeaderMap, ...• Promenljive– getRequestMap, getSessionMap, getApplicationMap

© SI1P1 – 2004 71/15

getRequestMap, getSessionMap, getApplicationMap

Page 72: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 2: Kreirati početnu formu

Isto kao u prethodnom primeru osimIsto kao u prethodnom primeru, osim– h:form ima id atribut– h:inputText i h:inputSecret takođe imaju id– Trenutni request parametar je formID:elementIDq p j• Potrebno je samo u slučaju kada se ručno čitaju parametri zahteva!Primer

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>…

h f id "f 2"<h:form id="form2">Email address: <h:inputText id="email"/><BR>Password: <h:inputSecret id="password"/><BR><h:commandButton value="Sign Me Up!"<h:commandButton value= Sign Me Up!action="#{registrationController.register}"/></h:form>…</f:view>

© SI1P1 – 2004 72/15

</f:view>

Page 73: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3: Specificirati akciju

Koristiti action atribut od h:commandButtonKoristiti action atribut od h:commandButton– Specificirati #{controllerName.methodName}– Isto kao u prošlom primeruIsto kao u prošlom primeruPrimer

<h:form id="form2">Email address: <h:inputText id="email"/><BR>Password: <h:inputSecret id="password"/><BR><h:commandButton value="Sign Me Up!"action="#{registrationController.register}"/>

/h f</h:form>

© SI1P1 – 2004 73/15

Page 74: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3: Specificirati akciju

File je tomcat dir/webapps/jsf-test/register2.jspFile je tomcat_dir/webapps/jsf test/register2.jspURL je http://localhost/jsf-test/register2.faces

© SI1P1 – 2004 74/15

Page 75: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 4: Kreirati akciju

Ne treba nasleđivati nijednu posebnu klasuNe treba nasleđivati nijednu posebnu klasu– Razlika od Struts-aDizajnirani metod ne prihvata argumente i vraćaDizajnirani metod ne prihvata argumente i vraća String kao rezultat– Svaki string mora da odgovara sa pravilom navigacije u faces-config.xml– Rezultat null dovodi do ponovnog prikaza iste formeVećina controller a preistupa parametrima request aVećina controller-a preistupa parametrima request-a preko bean-ova– O tome kasnijej– Koristi se pristup preko ExternalContext– ExternalContext se može koristiti za pristup

© SI1P1 – 2004 75/15• Cookies, podacima sesije, request headers, ...

Page 76: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 4: Kreirati akciju

import javax servlet *;import javax.servlet.*;import javax.servlet.http.*;import javax.faces.context.*;public class RegistrationController {public class RegistrationController {public String register() {ExternalContext context =

FacesContext getCurrentInstance() getExternalContext();FacesContext.getCurrentInstance().getExternalContext();HttpServletRequest request = (HttpServletRequest)context.getRequest();String email = request.getParameter("form2:email");String password = request getParameter("form2:password");String password = request.getParameter( form2:password );if ((email == null) || (email.trim().length() < 3) ||

(email.indexOf("@") == -1)) {return("bad address");return("bad-address");

} else if ((password == null) || (password.trim().length() < 6)) {return("bad-password");} l { t (" ") } } }

© SI1P1 – 2004 76/15} else { return("success"); } } }

Page 77: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

Delarisati action controllerDelarisati action controller…<faces-config><managed-bean><managed-bean-name>registrationControllerg</managed-bean-name><managed-bean-class>coreservlets RegistrationControllercoreservlets.RegistrationController</managed-bean-class><managed-bean-scope>request</managed-bean-scope></managed-bean>…</faces-config>

© SI1P1 – 2004 77/15

/ g

Page 78: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

Specifirati pravila navigacijeSpecifirati pravila navigacije…<faces-config>…

i ti l<navigation-rule><from-view-id>/register2.jsp</from-view-id><navigation-case><from-outcome>bad-address</from-outcome>/<to-view-id>/WEB-INF/results/bad-address2.jsp</to-view-id></navigation-case><navigation-case><from outcome>bad password</from outcome><from-outcome>bad-password</from-outcome><to-view-id>/WEB-INF/results/bad-password2.jsp</to-view-id></navigation-case><navigation-case>g<from-outcome>success</from-outcome><to-view-id>/WEB-INF/results/result2.jsp</to-view-id></navigation-case></navigation-rule>

© SI1P1 – 2004 78/15

</navigation-rule></faces-config>

Page 79: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreirati izlazne JSP stranice

/jsf test/WEB INF/results/bad address2 jsp…/jsf-test/WEB-INF/results/bad-address2.jsp<!DOCTYPE …><HTML><HEAD>…</HEAD><BODY><CENTER><TABLE BORDER=5><TR><TH CLASS="TITLE">Illegal Email Address</TH></TR></TABLE></TABLE><P>Address must be of the form [email protected] <A HREF="register2.faces">try again</A>.</CENTER></BODY></HTML>

© SI1P1 – 2004 79/15

/ /

Page 80: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 80/15

Page 81: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreirati izlazne JSP stranice

/jsf test/WEB INF/results/badpassword2 jsp…/jsf-test/WEB-INF/results/badpassword2.jsp<!DOCTYPE …><HTML><HEAD>…</HEAD><BODY><CENTER><TABLE BORDER=5><TR><TH CLASS="TITLE">Illegal Password</TH></TR></TABLE></TABLE><P>Password must contain at least six characters.Please <A HREF="register2.faces">try again</A>.</CENTER></BODY></HTML>

© SI1P1 – 2004 81/15

/ /

Page 82: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreirati izlazne JSP stranice

© SI1P1 – 2004 82/15

Page 83: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreirati izlazne JSP stranice

/jsf test/WEB INF/results/result2 jsp…/jsf-test/WEB-INF/results/result2.jsp<!DOCTYPE …><HTML><HEAD>…</HEAD><BODY><CENTER><CENTER><TABLE BORDER=5><TR><TH CLASS="TITLE">Success</TH></TR>TR TH CLASS TITLE Success /TH /TR</TABLE><H2>You have registered successfully.<BR>( ) /(Version 2)</H2></CENTER></BODY></HTML>

© SI1P1 – 2004 83/15

</BODY></HTML>

Page 84: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreirati izlazne JSP stranice

© SI1P1 – 2004 84/15

Page 85: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 7: Zaštiti JSP stranice

<web-app><web app>…<security-constraint><display-name>P t t JSP th t f JSFPrevent access to raw JSP pages that are for JSF pages.</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-name>g /<!-- Add url-pattern for EACH raw JSP page --><url-pattern>/welcome.jsp</url-pattern><url-pattern>/register1.jsp</url-pattern><url pattern>/signup jsp</url pattern><url-pattern>/signup.jsp</url-pattern><url-pattern>/register2.jsp</url-pattern></web-resource-collection><auth-constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint></web-app>

© SI1P1 – 2004 85/15

</web-app>

Page 86: Programiranje Programiranje Internet Internet aplikacija aplikacija

Koristiti bean-ove

Upotrebiti bean ove za prikazivanje parametaraUpotrebiti bean-ove za prikazivanje parametara zahtevaDeklarisat bean-ove u faces-config.xmlgPrikaz propertie-ija bean-a– Standardni JSF pristup– JSP 2.0 expression jezikKoristiti properties fajlove

S d d i i i/ i i– Standardni upiti/stringovi– Internacionalizacija sadržaja

© SI1P1 – 2004 86/15

Page 87: Programiranje Programiranje Internet Internet aplikacija aplikacija

JSF kontrola toka

© SI1P1 – 2004 87/15

Page 88: Programiranje Programiranje Internet Internet aplikacija aplikacija

JSF kontrola toka

Forma se prikažeForma se prikaže– Forma koristi f:view i h:formForma se pošalje– Originalni URL i ACTION URL su http://…/blah.facesBean se instancira– Navodi se u managed-beans delu faces-config.xmlg g– setter metodi navedeni u h:inputText (...) se izvršavaju• dobijene vrednosti su vrednosti iz tekst polja u trenutku slanjaPoziva se metod action controller aPoziva se metod action controller-a– Navodi se u atrubutu action od h:commandButtonaction metod vraća uslov– String koji se poklapa sa vrednostima from-outcome iz navigacionih pravila faces-config.xmlRezultujuća stranica se prikazuje

© SI1P1 – 2004 88/15– Stranica koristi h:outputText da bi prikazala propertie-ije bean-a

Page 89: Programiranje Programiranje Internet Internet aplikacija aplikacija

Koraci kod upotrebe JSF

1 Kreirati bean sa propertie ijim za svako polje forme1. Kreirati bean sa propertie-ijim za svako polje forme• Par getter/setter metoda za svako polje forme

2. Kreirati početnu formu• Koristiti f:view, h:form, h:blah, i h:commandButton

3. Specificirati action controller metod• Koristiti action atribut h:commandButton

4. Kreirati action controller metod• U okviru bean-a iz tačke #1. Pregledati podatke sa forme, primeniti poslovnu logiku smestiti rezultate u bean-ove i vratiti usloveposlovnu logiku, smestiti rezultate u bean ove, i vratiti uslove

5. Promeniti faces-config.xml• Deklarisati form bean i pravila navigacije

6 K i ti JSP t i6. Kreirati JSP stranice• Za svaki uslov koji se vraća kao rezultat

7. Zaštiti osnovne JSP stranice od pristupa© SI1P1 – 2004 89/15• Koristiti filter ili podešavanja bezbednosti

Page 90: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer 1: Upotreba bean-ova

Isto kao u prethodnom primeruIsto kao u prethodnom primeru– Originalni URL:• http://hostname/jsf-test/register3.faces– Kada se forma pošalje 3 moguća rezultata– Poruka o nelegalnoj email adresi– Poruka o nelegalnoj šifrig j– UspešnoRazlike

Action controller prihvata podatke zahteva pomoćui bean a– Action controller prihvata podatke zahteva pomoćui bean-a– Izlazne stranice pristupaju propertie-ijima bean-aGlavni zadaci– Definisati bean sa propertie-ijima odgovarajućim podacima forme– Deklarisati bean-ove u faces-config.xml– Prikazati propertie-ije bean-a

© SI1P1 – 2004 90/15

p p j

Page 91: Programiranje Programiranje Internet Internet aplikacija aplikacija

Glavni zadaci

Napraviti property-ije bean-a za svaki parametar zahtevaNapraviti property ije bean a za svaki parametar zahtevapublic class MyBean {public String getBlah() {…}public void setBlah(String newValue) {…} …p ( g ) { }}

Koristiti faces-config.xml za deklaraciju bean-a<faces-config><managed-bean><managed-bean-name>beanName</managed-bean-name><managed-bean-class>package.MyBean</managed-bean-class>

d b t / d b<managed-bean-scope>request</managed-bean-scope></managed-bean>…</faces-config>

Koristiti h:inputText za povezivanje tekst polja sa property-Koristiti h:inputText za povezivanje tekst polja sa property-ijem

<h:inputText value="#{beanName.propertyName}"/>Koristiti h:outputText da bi se prikazali property-iji bean-a

© SI1P1 – 2004 91/15

p p p p y j<h:outputText value="#{beanName.propertyName}"/>

Page 92: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 1: Kreiranje bean-a

Po jedan property za svaki parametar zahtevaPo jedan property za svaki parametar zahteva– Ako ulazna forma ima value="#{name.foo}", tada bean treba da ima metode getFoo i setFoo.Dodatne property-ije za svaku izlaznu vrednostPopunjavanje bean-a– Sistem će popuniti vrednosti property-ija automatski– Sistem će popuniti vrednosti property-ija automatski– Stringovi se konvertuju sa jsp:setProperty• Forma se ponovo prikazuje, ako ima grešaka, validacijaAction controller– Metod može direktno pristupiti property-ijima bean-a

ExternalContext je potreban u slučaju kada se pristupa• ExternalContext je potreban u slučaju kada se pristupa request headers, cookies, ...– Metod sadrži i poslovne objekte i čuva ih u okviru

© SI1P1 – 2004 92/15property-ija rezervisanih za izlazne vrednosti

Page 93: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 1: Kreiranje bean-a

Prezentacija parametara zahtevaPrezentacija parametara zahtevapackage coreservlets;public class RegistrationBean {private String email = "user@host";private String email = user@host ;private String password = "";public String getEmail() {return(email);return(email);}public void setEmail(String email) {thi il ilthis.email = email;}public String getPassword() {

( d)return(password);}public void setPassword(String password) {

© SI1P1 – 2004 93/15this.password = password; }

Page 94: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 1: Kreiranje bean-a

Kod za smeštanje rezultata (RegistrationBean )Kod za smeštanje rezultata (RegistrationBean, ...)...private SuggestionBean suggestion;private SuggestionBean suggestion;public SuggestionBean getSuggestion() {return(suggestion);( gg );}

© SI1P1 – 2004 94/15

Page 95: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 1: Kreiranje bean-a

Kod za prikaz rezultataKod za prikaz rezultatapackage coreservlets;public class SuggestionBean {private String email;private String email;private String password;public SuggestionBean(String email, String password) {this email email;this.email = email;this.password = password;}

bli St i tE il() {public String getEmail() {return(email);}

bl S d() {public String getPassword() {return(password);}

© SI1P1 – 2004 95/15}

Page 96: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 1: Kreiranje bean-a

Kod za prikaz rezultataKod za prikaz rezultatapackage coreservlets;public class SuggestionUtils {private static String[] suggestedAddresses =private static String[] suggestedAddresses ={ "[email protected]","[email protected]","palmisano@ibm com""[email protected]","[email protected]" };private static String chars =" b d f hijkl t 0123456789#@$%^&*?!""abcdefghijklmnopqrstuvwxyz0123456789#@$%^&*?!";public static SuggestionBean getSuggestionBean() {String address = randomString(suggestedAddresses);S d d S ( h 8)String password = randomString(chars, 8);return(new SuggestionBean(address, password));}

© SI1P1 – 2004 96/15...

Page 97: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 2: Kreiranje početne forme

Isto kao u prethodnom primeru osimIsto kao u prethodnom primeru, osim– Tagovi h:inputBlah tpomoću vrednosti atributa definišu odgovarajući bean property• Takođe definišu početnu vrednost tekst polja– Nije potrebno definisati id atributPrimer koda

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>%@ t lib i "htt //j /j f/ht l" fi "h" %<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<f:view>…<h:form>Email address:Email address:<h:inputText value="#{registrationBean.email}"/><BR>Password:<h:inputSecret value="#{registrationBean.password}"/><BR><h:inputSecret value #{registrationBean.password} /><BR><h:commandButton value="Sign Me Up!"action="#{registrationBean.register}"/></h:form>…

© SI1P1 – 2004 97/15

/</f:view>

Page 98: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3: definisati akciju

Isto kao u prethodnom primeruIsto kao u prethodnom primeru<h:form>Email address:Email address:<h:inputText value="#{registrationBean.email}"/><BR>Password:<h:inputSecret

value="#{registrationBean.password}"/><BR>h d l "Si "<h:commandButton value="Sign Me Up!"

action="#{registrationBean.register}"/></h:form></h:form>

© SI1P1 – 2004 98/15

Page 99: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3: definisati akciju

File je tomcat dir/webapps/jsf test/register3 jspFile je tomcat_dir/webapps/jsf-test/register3.jspURL je http://localhost/jsf-test/register3.facesVrednost user@host je definisana u okviru bean-aVrednost user@host je definisana u okviru bean a

© SI1P1 – 2004 99/15

Page 100: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 4: kreirati akciju

Moguće je pristupiti property ijima bean a direktnoMoguće je pristupiti property-ijima bean-a direktno– Sistem ih automatski popunjava pre poziva action metoda– Nije potrebno pristupati objektu ExternalContext iliNije potrebno pristupati objektu ExternalContext ili pozivati request.getParameterRezultati se smeštaju u property-ije– Koriste se results-beans kao i kod traditionalnog MVC pristupaI dalje se rezultujući stringovi poklapaju saI dalje se rezultujući stringovi poklapaju sa mogućim izalzima– Kao u prethodnom primerup pObjekat ExternalContext se ponekad koristi– Za pristup cookies, podacima sesije, request headers, ...

© SI1P1 – 2004 100/15

Page 101: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 4: kreirati akciju

public class RegistrationBean {public class RegistrationBean {// Property-iji su prikazani na prethodnim slajdovimapublic String register() {if ((email == null) ||(( ) ||(email.trim().length() < 3) ||(email.indexOf("@") == -1)) {suggestion = SuggestionUtils.getSuggestionBean();return("bad-address");} else if ((password == null) ||(password.trim().length() < 6)) {

ti S ti Util tS ti B ()suggestion = SuggestionUtils.getSuggestionBean();return("bad-password");} else {return("success");return( success );}}}

© SI1P1 – 2004 101/15

}

Page 102: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

Deklarisanje bean aDeklarisanje bean-a…<faces-config><managed-bean><managed-bean-name>registrationBeang</managed-bean-name><managed-bean-class>coreservlets RegistrationBeancoreservlets.RegistrationBean</managed-bean-class><managed-bean-scope>request</managed-bean-scope></managed-bean>…</faces-config>

© SI1P1 – 2004 102/15

/ g

Page 103: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5: Promeniti faces-config.xml

Specificirati pravila navigacijeSpecificirati pravila navigacije…<faces-config>…

i ti l<navigation-rule><from-view-id>/register3.jsp</from-view-id><navigation-case><from-outcome>bad-address</from-outcome>/<to-view-id>/WEB-INF/results/bad-address3.jsp</to-view-id></navigation-case><navigation-case><from outcome>bad password</from outcome><from-outcome>bad-password</from-outcome><to-view-id>/WEB-INF/results/bad-password3.jsp</to-view-id></navigation-case><navigation-case>g<from-outcome>success</from-outcome><to-view-id>/WEB-INF/results/result3.jsp</to-view-id></navigation-case></navigation-rule>

© SI1P1 – 2004 103/15

</navigation-rule></faces-config>

Page 104: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreiranje izlaznih JSP strana

Koristiti h:outputText da bi se pristupilo property ijima bean aKoristiti h:outputText da bi se pristupilo property-ijima bean-a

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><!DOCTYPE …><HTML>…<h:outputText value="#{beanName propertyName}"/><h:outputText value= #{beanName.propertyName} />…</HTML></f:view>

© SI1P1 – 2004 104/15

Page 105: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreiranje izlaznih JSP strana

…/jsf-test/WEB-INF/results/bad-address3.jsp…/jsf test/WEB INF/results/bad address3.jsp<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>

!DOCTYPE<!DOCTYPE …><HTML>…<TABLE BORDER=5><TR><TH CLASS="TITLE">Illegal Email Address</TH></TR></TABLE><P>The addressThe address"<h:outputText value="#{registrationBean.email}"/>"is not of the form username@hostname (e.g.,<h:outputText value="#{ registrationBean.suggestion.email}"/>).g gg<P>Please <A HREF="register3.faces">try again</A>.…</HTML>

© SI1P1 – 2004 105/15

</HTML></f:view>

Page 106: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 106/15

Page 107: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreiranje izlaznih JSP strana

…/jsf-test/WEB-INF/results/bad-password3.jsp…/jsf test/WEB INF/results/bad password3.jsp<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><!DOCTYPE …><!DOCTYPE …><HTML>…<TABLE BORDER=5><TR><TH CLASS="TITLE">Illegal Password</TH></TR><TR><TH CLASS TITLE >Illegal Password</TH></TR></TABLE><P>The password"<h:outputText value="#{registrationBean.password}"/>"output e t a ue { eg st at o ea pass o d} /is too short; it must contain at least six characters.Here is a possible password:<h:outputTextvalue="#{registrationBean.suggestion.password}"/>.{ g gg p } /<P>Please <A HREF="register3.faces">try again</A>.…</HTML>

© SI1P1 – 2004 107/15

/</f:view>

Page 108: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 108/15

Page 109: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6: Kreiranje izlaznih JSP strana

…/jsf-test/WEB-INF/results/result3.jsp…/jsf test/WEB INF/results/result3.jsp<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><!DOCTYPE …><!DOCTYPE …><HTML>…<TABLE BORDER=5><TR><TH CLASS="TITLE">Success</TH></TR><TR><TH CLASS TITLE >Success</TH></TR></TABLE><H2>You have registered successfully.</H2><UL><LI>Email Address:a dd ess<h:outputText value="#{registrationBean.email}"/><LI>Password:<h:outputText value="#{registrationBean.password}"/></UL>/(Version 3)…</HTML></f:view>

© SI1P1 – 2004 109/15

/

Page 110: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 110/15

Page 111: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 7: Zaštita JSP strana

<web-app><web app>…<security-constraint><display-name>P t t JSP th t f JSFPrevent access to raw JSP pages that are for JSF pages.</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-name>g /<!-- Add url-pattern for EACH raw JSP page --><url-pattern>/welcome.jsp</url-pattern><url-pattern>/register1.jsp</url-pattern><url pattern>/register2 jsp</url pattern><url-pattern>/register2.jsp</url-pattern><url-pattern>/register3.jsp</url-pattern></web-resource-collection><auth-constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint></web-app>

© SI1P1 – 2004 111/15

</web-app>

Page 112: Programiranje Programiranje Internet Internet aplikacija aplikacija

Moguće alternative

Koristiti JSP 2 0 ELKoristiti JSP 2.0 EL– Ako izlazne stranice samo prikazuju property-ije bean-a (ne obavljaju operacije sa formom ili koriste elemente ( j j p jforme):• Zašto i f:view i povezana taglib deklaracija?• Zašto koristiti h:outputText i odgovarajuću taglib deklaraciju, kada je upotreba JSP 2.0 EL jednostavnija?– Ako se koristi JSP 2 0 EL mora se koristiti:Ako se koristi JSP 2.0 EL, mora se koristiti:• JSP 2.0 okruženje (na primer, Tomcat 5, a ne Tomcat 4)• Koristiti JSP 2.0 deklaracija u okviru web.xml (kasnije)j ( j )

© SI1P1 – 2004 112/15

Page 113: Programiranje Programiranje Internet Internet aplikacija aplikacija

Upotreba JSP 2.0 EL

Standardni JSF pristupStandardni JSF pristup<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><!DOCTYPE …><!DOCTYPE …><HTML>…<TABLE BORDER=5><TR><TH CLASS="TITLE">Success</TH></TR><TR><TH CLASS TITLE >Success</TH></TR></TABLE><H2>You have registered successfully.</H2><UL><LI>Email Address:a dd ess<h:outputText value="#{registrationBean.email}"/><LI>Password:<h:outputText value="#{registrationBean.password}"/></UL>/(Version 3)…</HTML></f:view>

© SI1P1 – 2004 113/15

/

Page 114: Programiranje Programiranje Internet Internet aplikacija aplikacija

Upotreba JSP 2.0 EL

JSP 2 0 pristupJSP 2.0 pristup– Izbegava se taglib deklaracija i f:view tagovi– Kraći izrazi koji prikazuju property-ije bean-a

<!DOCTYPE …><HTML>…<TABLE BORDER=5><TR><TH CLASS="TITLE">Success</TH></TR></TABLE><H2>You have registered successfully.</H2><UL><UL><LI>Email Address: ${registrationBean.email}<LI>Password: ${registrationBean.password}</UL></UL>(Version 3)…</HTML>

© SI1P1 – 2004 114/15

</HTML>

Page 115: Programiranje Programiranje Internet Internet aplikacija aplikacija

Prednosti upotrebe JSP 2.0 EL

Skraćena notacija za property ije bean aSkraćena notacija za property-ije bean-a.– Da bi se pristupilo property-iju companyName (rezultat metoda getCompanyName) odgovarajuće promenljive g p y ) g j p jcompany (objekat smešten u okviru zahteva, sesije ili aplikacije) dovoljno je koristiti #{company.companyName}. Da bi se prisupilo property-iju firstName koji je definisan uDa bi se prisupilo property-iju firstName, koji je definisan u okviru property-ija president promenljive company, koristi se #{company.president.firstName}.Jednostavan pristup elementima kolekcije.– Da bi se pristupilo elementu niza, liste ili mape, koristi se #{variable[indexOrKey]}#{variable[indexOrKey]}.

© SI1P1 – 2004 115/15

Page 116: Programiranje Programiranje Internet Internet aplikacija aplikacija

Prednosti upotrebe JSP 2.0 EL

Jednostavan pristup parametrima zahteva cooky ijima iJednostavan pristup parametrima zahteva, cooky-ijima, i drugim podacima zahteva.– Za pristup standardnim tipovima podataka zahteva, može se koristiti jedan od nekoliko predefinisanih implicitnih objekatajedan od nekoliko predefinisanih implicitnih objekata.Mali, ali koristan skup jednostavnih operatora.– ZA obradu objekata pomoću EL izraza, može se koristiti neki od

k lik it tičkih l i ih l ičkih ili d ih tnekoliko aritmetičkih, relacionih, logičkih, ili drugih operatora.Uslovni izlaz.– Za izbor između više izlaznih opcija, ne moraju se koristiti Java scripleti, već #{test ? option1 : option2}.Automatska konverzija tipova.– EL uklanja potrebu za konverziju tipova.j p j pPrazna vrednost umesto poruke o grešci.– U većini slučajeva, greška ili NullPointerExceptions daju prazan string, a ne izuzetak

© SI1P1 – 2004 116/15

a ne izuzetak

Page 117: Programiranje Programiranje Internet Internet aplikacija aplikacija

Prednosti upotrebe JSP 2.0 EL

JSF EL JSP 2 0 ELJSF ELMože se koristiti samo u okviru atributa JSF tagova

JSP 2.0 ELMogu se koristiti bilo gde u okviru JSP straniceNe zahtevaju taglib

Zahtevaju taglib deklaracijuKoriste se na serverima koji podržavaju JSP 1.2+

Ne zahtevaju taglib deklaracijuKoriste se na serverima koji podržavaju JSP 2.0

W bL i 9 T t 5–WebLogic 8.1, Tomcat 4, ...Koriste #{blah}Mogu da prikažu poslate

–WebLogic 9, Tomcat 5, ...Koriste ${blah}Prikazuju samo izlazne vrednostiMogu da prikažu poslate

podatke i izlazne vrednostiPristupaju bean-ovima definisanim u okviru zahteva,

vrednostiPristupaju bean-ovima definisanim u okviru zahteva, sesije ili aplikacije

definisanim u okviru zahteva, sesije, aplikacije ili posebno definisanim

© SI1P1 – 2004 117/15

Page 118: Programiranje Programiranje Internet Internet aplikacija aplikacija

Prikaz property-ija bean-a

#{varName propertyName}#{varName.propertyName}– Rezultat je pretraga objekata HttpServletRequest, HttpSession, ServletContext, u datom poretku, i prikaz odgovarajućeg property-ija bean abean-a– Mora se koristiti kao atribut u okviru JSF tagaEkvivalentne forme– <h:outputText value="#{customer.firstName}"/>• Moguće je u okviru svih JSF verzija. – ${customer.firstName}${ }• Moguće je samo u okviru JSP 2.– <%@ page import="coreservlets.NameBean" %><% NameBean person =<% NameBean person = (NameBean)pageContext.findAttribute("customer"); %><%= person.getFirstName() %>

N č j EL ij© SI1P1 – 2004 118/15

• Ne preporučuje se pre-EL verzija.

Page 119: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer TestBean

© SI1P1 – 2004 119/15

Page 120: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer faces-config.xml

<?xml version='1 0' encoding='UTF 8'?><?xml version= 1.0 encoding= UTF-8 ?><!DOCTYPE ...><faces-config>g<managed-bean><managed-bean-name>testBean</managed-bean-

name>name><managed-bean-class>coreservlets.TestBean</managed-bean-class><managed-bean-scope>request</managed-bean-

scope>scope></managed-bean>...

© SI1P1 – 2004 120/15</faces-config>

Page 121: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer bean-properties.jsp

<%@ taglib uri="http://java sun com/jsf/core" prefix="f" %><%@ taglib uri= http://java.sun.com/jsf/core prefix= f %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>...<BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Accessing Bean Properties</TH></TR></TABLE><UL><LI>Creation time:<h t tT t l "#{t tB ti Ti }"/><h:outputText value="#{testBean.creationTime}"/><LI>Greeting:<h:outputText value="#{testBean.greeting}"/><LI>Random number:<LI>Random number:<h:outputText value="#{testBean.randomNumber}"/></UL></BODY></HTML>

© SI1P1 – 2004 121/15

/ /</f:view>

Page 122: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer web.xml

<?xml version="1.0" encoding="ISO-8859-1"?><?xml version 1.0 encoding ISO 8859 1 ?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"...version="2.4">...<security-constraint><display-name>Prevent access to raw JSP pages that are for JSF pages.p g p g</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-name><url pattern>/bean properties jsp</url pattern><url-pattern>/bean-properties.jsp</url-pattern>...</web-resource-collection><auth-constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint></web-app>

© SI1P1 – 2004 122/15

</web-app>

Page 123: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer rezultat

© SI1P1 – 2004 123/15

Page 124: Programiranje Programiranje Internet Internet aplikacija aplikacija

Ugnežđeni property-iji bean-a

#{varName prop1 prop2}#{varName.prop1.prop2}– Prvo se izvršava pretraga za odgovarajuću definiciju bean-a po imenu varNamep– Tada se pristupa property-iju prop1 (poziva se metod getProp1)– Tada se pristupa property-iju prop2 dobijenog rezultata (poziva se metod objekta koji je dobijen sa getProp1)

© SI1P1 – 2004 124/15

Page 125: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer NameBean

© SI1P1 – 2004 125/15

Page 126: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer CompanyBean

© SI1P1 – 2004 126/15

Page 127: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer EmployeeBean

© SI1P1 – 2004 127/15

Page 128: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer faces-config.xml

<faces config><faces-config>...<managed-bean><managed bean><managed-bean-name>employee</managed-bean-name><managed-bean-class>gcoreservlets.EmployeeBean</managed-bean-class><managed-bean-scope>request</managed-bean-scope></managed-bean>...</faces-config>

© SI1P1 – 2004 128/15

Page 129: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer nested-properties.jsp

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri http://java.sun.com/jsf/core prefix f %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>...

BODY<BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Using Nested Bean Properties</TH></TR></TABLE>/<UL><LI>Employee's first name:<h:outputText value="#{employee.name.firstName}"/><LI>Employee's last name:<LI>Employee's last name:<h:outputText value="#{employee.name.lastName}"/><LI>Name of employee's company:<h:outputText value="#{employee.company.companyName}"/><LI>Business area of employee's company:<h:outputText value="#{employee.company.business}"/></UL></BODY></HTML>

© SI1P1 – 2004 129/15

</BODY></HTML></f:view>

Page 130: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer web.xml

<?xml version="1.0" encoding="ISO-8859-1"?><?xml version 1.0 encoding ISO 8859 1 ?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"...version="2.4">...<security-constraint><display-name>Prevent access to raw JSP pages that are for JSF pages.p g p g</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-name><url pattern>/nested properties jsp</url pattern><url-pattern>/nested-properties.jsp</url-pattern>...</web-resource-collection><auth-constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint></web-app>

© SI1P1 – 2004 130/15

</web-app>

Page 131: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer rezultat

© SI1P1 – 2004 131/15

Page 132: Programiranje Programiranje Internet Internet aplikacija aplikacija

Tri značenja #{...}

Dizajn izlaznih vrednostiDizajn izlaznih vrednosti– #{varName.propertyName} prikazuje vrednost property-ija date promenljive

h t tT t l "#{ l dd }"/– <h:outputText value="#{employee.address}"/>• Bilo kada da se pristupa, podrazumeva izalzni tekst– <h:inputText value="#{employee.address}"/>• Kada se forma inicijalno prikazuje, prikazuje se predefinisana vrednostDizajn vrednosti koja se šalje– <h:inputText value="#{employee address}"/><h:inputText value #{employee.address} />• Kada se forma šalje, definiše se gde se smešta vrednostDizajn poziva metoda kod slanja

h dB tt l "B tt L b l“– <h:commandButton value="Button Label“ action="#{employee.processEmployee}"/>• Kada se forma šalje, definiše se određena akcija

© SI1P1 – 2004 132/15

Page 133: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer EmployeeBean

package coreservlets;package coreservlets;public class EmployeeBean {private NameBean name;p ;private CompanyBean company;...

bli St i E l () {public String processEmployee() {if (Math.random() < 0.5) {return("accept");return( accept );} else {return("reject");}}}}

© SI1P1 – 2004 133/15

}

Page 134: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer faces-config.xml

<faces-config><faces config>...<managed-bean><managed-bean-name>employee</managed-bean-name><managed-bean-class><managed bean class>coreservlets.EmployeeBean</managed-bean-class><managed-bean-scope>request</managed-bean-scope></managed-bean></managed bean>...<navigation-rule><from-view-id>/submitting-properties.jsp</from-view-id><navigation-case>a gat o case<from-outcome>accept</from-outcome><to-view-id>/WEB-INF/results/accept.jsp</to-view-id></navigation-case><navigation-case>g<from-outcome>reject</from-outcome><to-view-id>/WEB-INF/results/reject.jsp</to-view-id></navigation-case></navigation-rule>

© SI1P1 – 2004 134/15

/ g</faces-config>

Page 135: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer web.xml

<?xml version="1.0" encoding="ISO-8859-1"?><?xml version 1.0 encoding ISO 8859 1 ?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"...version="2.4">...<security-constraint><display-name>Prevent access to raw JSP pages that are for JSF pages.p g p g</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-name><url pattern>/submitting properties jsp</url pattern><url-pattern>/submitting-properties.jsp</url-pattern>...</web-resource-collection><auth-constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint></web-app>

© SI1P1 – 2004 135/15

</web-app>

Page 136: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer web.xml

© SI1P1 – 2004 136/15

Page 137: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer accept.jsp (JSF verzija)

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri http://java.sun.com/jsf/core prefix f %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>...<BODY><BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Employee Accepted</TH></TR></TABLE><UL><UL><LI>Employee's first name:<h:outputText value="#{employee.name.firstName}"/><LI>Employee's last name:<h:outputText value="#{employee.name.lastName}"/>output e t a ue {e p oyee a e ast a e} /<LI>Name of employee's company:<h:outputText value="#{employee.company.companyName}"/><LI>Business area of employee's company:<h:outputText value="#{employee.company.business}"/>p { p y p y } /</UL>Congratulations.</BODY></HTML></f:view>

© SI1P1 – 2004 137/15

/

Page 138: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer accept.jsp (JSP verzija)

...<BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Employee Accepted</TH></TR>p y p / /</TABLE><UL><LI>Employee's first name:${employee.name.firstName}<LI>Employee's last name:${employee.name.lastName}<LI>N f l '<LI>Name of employee's company:${employee.company.companyName}<LI>Business area of employee's company:${employee company business}${employee.company.business}</UL>Congratulations.</BODY></HTML>

© SI1P1 – 2004 138/15

</BODY></HTML>

Page 139: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer reject.jsp (JSF verzija)

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri http://java.sun.com/jsf/core prefix f %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>...<BODY><BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Employee Rejected</TH></TR></TABLE><UL><UL><LI>Employee's first name:<h:outputText value="#{employee.name.firstName}"/><LI>Employee's last name:<h:outputText value="#{employee.name.lastName}"/>output e t a ue {e p oyee a e ast a e} /<LI>Name of employee's company:<h:outputText value="#{employee.company.companyName}"/><LI>Business area of employee's company:<h:outputText value="#{employee.company.business}"/>p { p y p y } /</UL>Congratulations.</BODY></HTML></f:view>

© SI1P1 – 2004 139/15

/

Page 140: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer reject.jsp (JSP verzija)

...<BODY><TABLE BORDER=5 ALIGN="CENTER"><TR><TH CLASS="TITLE">Employee Rejected</TH></TR>p y j / /</TABLE><UL><LI>Employee's first name:${employee.name.firstName}<LI>Employee's last name:${employee.name.lastName}<LI>N f l '<LI>Name of employee's company:${employee.company.companyName}<LI>Business area of employee's company:${employee company business}${employee.company.business}</UL>Congratulations.</BODY></HTML>

© SI1P1 – 2004 140/15

</BODY></HTML>

Page 141: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer rezultat

© SI1P1 – 2004 141/15

Page 142: Programiranje Programiranje Internet Internet aplikacija aplikacija

Pristup kolekcijama

Ekvivalentne formeEkvivalentne forme– #{name.property}– #{name["property"]}#{name[ property ]}Razlozi za upotrebu notacije nizova– Za pristup nizovima, listama, i drugim kolekcijamap p , , g j– Da bi se izračunalo ime property-ija u trenutku zahteva.• #{name1[name2]} (nema navodnika oko name2)– Da bi se koristila imena koja su nelegalna kao imena Java promenljivih• #{foo["bar baz"]}• #{foo[ bar-baz ]}• #{foo["bar.baz"]}

© SI1P1 – 2004 142/15

Page 143: Programiranje Programiranje Internet Internet aplikacija aplikacija

Pristup kolekcijama

#{attributeName[entryName]}#{attributeName[entryName]}Moguće je sa– Nizovima. Ekvivalentno sa• theArray[index]– Listama. Ekvivalentno sa

th Li t t(i d ) ili th Li t t(i d b itt d l)• theList.get(index) ili theList.set(index, submitted-val)– Mapama. Ekvivalentno sa• theMap.get(key) ili theMap.put(key, submitted-val) theMap.get(key) ili theMap.put(key, submitted val)Ekvivalentne forme (za HashMap)– #{stateCapitals["maryland"]}

{ l l d}– #{stateCapitals.maryland}– Ali sledeći izraz nije dozvoljen, jer 2 nije legalno ime za promenljivu

© SI1P1 – 2004 143/15

p j• #{listVar.2}

Page 144: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer PurchaseBean

© SI1P1 – 2004 144/15

Page 145: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer PurchaseBean

public String purchaseItems() {public String purchaseItems() {isEverythingOK = Utils.doBusinessLogic(this);isEverythingOK = Utils doDataAccessLogic(this);isEverythingOK = Utils.doDataAccessLogic(this);if (isEverythingOK) {return("success");( );} else {return("failure");}}}}

© SI1P1 – 2004 145/15

Page 146: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer Utils

public class Utils {public class Utils {public static boolean doBusinessLogic(PurchaseBean bean) {(PurchaseBean bean) {// Business logic omittedreturn(Math.random() > 0.1);( () );}public static boolean doDataAccessLogic(PurchaseBean bean) {// Database access omitted

t (M th d () 0 1)return(Math.random() > 0.1);}}

© SI1P1 – 2004 146/15}

Page 147: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer faces-config.xml

<faces-config><faces config>...<managed-bean><managed-bean-name>purchases</managed-bean-name><managed-bean-class><managed bean class>coreservlets.PurchaseBean</managed-bean-class><managed-bean-scope>request</managed-bean-scope></managed-bean></managed bean>...<navigation-rule><from-view-id>/using-collections.jsp</from-view-id><navigation-case>a gat o case<from-outcome>success</from-outcome><to-view-id>/WEB-INF/results/success.jsp</to-view-id></navigation-case><navigation-case>g<from-outcome>failure</from-outcome><to-view-id>/WEB-INF/results/failure.jsp</to-view-id></navigation-case></navigation-rule>

© SI1P1 – 2004 147/15

/ g</faces-config>

Page 148: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer using-collections.jsp

......<h:form><UL><LI><B>Cheap Items</B><OL><OL><LI><h:inputTextvalue="#{purchases.cheapItems[0]}"/><LI><h:inputTextvalue="#{purchases.cheapItems[1]}"/>value #{purchases.cheapItems[1]} /><LI><h:inputTextvalue="#{purchases.cheapItems[2]}"/></OL><LI><B>Medium Items</B>ed u te s /<OL><LI><h:inputTextvalue="#{purchases.mediumItems[0]}"/><LI><h:inputTextpvalue="#{purchases.mediumItems[1]}"/><LI><h:inputTextvalue="#{purchases.mediumItems[2]}"/></OL>

© SI1P1 – 2004 148/15

/

Page 149: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer using-collections.jsp

<LI><B>Valuable Items</B><LI><B>Valuable Items</B><UL><LI>Low:<h:inputTextpvalue='#{purchases.valuableItems["low"]}'/><LI>Medium:<h:inputTextvalue='#{purchases.valuableItems["medium"]}'/><LI>High:<h:inputText

l '#{ h l bl It ["hi h"]}'/>value='#{purchases.valuableItems["high"]}'/></UL></UL><h:commandButton value="Purchase"<h:commandButton value= Purchaseaction="#{purchases.purchaseItems}"/></h:form>...

© SI1P1 – 2004 149/15

...

Page 150: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer web.xml

<?xml version="1.0" encoding="ISO-8859-1"?><?xml version 1.0 encoding ISO 8859 1 ?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"...version="2.4">...<security-constraint><display-name>Prevent access to raw JSP pages that are for JSF pages.p g p g</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-name><url pattern>/using collections jsp</url pattern><url-pattern>/using-collections.jsp</url-pattern>...</web-resource-collection><auth-constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint></web-app>

© SI1P1 – 2004 150/15

</web-app>

Page 151: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer rezultat

© SI1P1 – 2004 151/15

Page 152: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer success.jsp (JSF verzija)

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>@ g p //j /j / p<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>...<UL><LI><B>Cheap Items</B><OL><OL><LI><h:outputTextvalue="#{purchases.cheapItems[0]}"/><LI><h:outputTextvalue="#{purchases.cheapItems[1]}"/><LI><h:outputTextvalue="#{purchases.cheapItems[2]}"/></OL><LI><B>Medium Items</B><OL><OL><LI><h:outputTextvalue="#{purchases.mediumItems[0]}"/><LI><h:outputTextvalue="#{purchases.mediumItems[1]}"/>

LI h T<LI><h:outputTextvalue="#{purchases.mediumItems[2]}"/></OL>...</f:view>

© SI1P1 – 2004 152/15

Page 153: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer success.jsp (JSP verzija)

...<UL><LI><B>Cheap Items</B><OL><LI>${purchases.cheapItems[0]}<LI>${purchases.cheapItems[1]}${p p [ ]}<LI>${purchases.cheapItems[2]}</OL><LI><B>Medium Items</B><LI><B>Medium Items</B><OL><LI>${purchases.mediumItems[0]}<LI>${purchases.mediumItems[1]}<LI>${purchases.mediumItems[2]}</OL>

© SI1P1 – 2004 153/15

/...

Page 154: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer rezultat

© SI1P1 – 2004 154/15

Page 155: Programiranje Programiranje Internet Internet aplikacija aplikacija

Implicitni objekti

<!DOCTYPE ><!DOCTYPE …>…<P><UL><LI><B>test Request Parameter:</B>${param.test}${p }<LI><B>User-Agent Header:</B>${header["User-Agent"]}<LI><B>JSESSIONID Cookie Value:</B><LI><B>JSESSIONID Cookie Value:</B>${cookie.JSESSIONID.value}<LI><B>Server:</B>${pageContext.servletContext.serverInfo}</UL></BODY></HTML>

© SI1P1 – 2004 155/15

/ /

Page 156: Programiranje Programiranje Internet Internet aplikacija aplikacija

Operatori

…<TABLE BORDER=1 ALIGN="CENTER"><TR><TH CLASS="COLORED" COLSPAN=2>Arithmetic Operators<TH CLASS="COLORED" COLSPAN=2>Relational Operatorsp<TR><TH>Expression<TH>Result<TH>Expression<TH>Result<TR ALIGN="CENTER"><TD>\${3+2-1}<TD>${3+2-1}<TD>\${1&lt;2}<TD>${1<2}<TR ALIGN="CENTER"><TD>\${"1"+2}<TD>${"1"+2}<TD>\${" "&lt "b"}<TD>${" "<"b"}<TD>\${"a"&lt;"b"}<TD>${"a"<"b"}<TR ALIGN="CENTER"><TD>\${1 + 2*3 + 3/4}<TD>${1 + 2*3 + 3/4}<TD>\${2/3 &gt;= 3/2}<TD>${2/3 >= 3/2}<TD>\${2/3 &gt;= 3/2}<TD>${2/3 >= 3/2}<TR ALIGN="CENTER"><TD>\${3%2}<TD>${3%2}<TD>\${3/4 == 0.75}<TD>${3/4 == 0.75}

© SI1P1 – 2004 156/15

<TD>\${3/4 0.75}<TD>${3/4 0.75}

Page 157: Programiranje Programiranje Internet Internet aplikacija aplikacija

Properties fajlovi – fiksni stringovi

1 Kreirati properties fajl u okviru WEB INF/classes1. Kreirati .properties fajl u okviru WEB-INF/classes– Sadrži jednostavne parove keyName=value2. Učitati fajl pomoću f:loadBundlej p– basename definiše osnovno ime fajla– var definiše promenljivu (Map) koja će sadržati rezultat

R l ti d WEB INF/ l ti• Relativno u odnosu na WEB-INF/classes, .properties se podrazumeva• Za WEB-INF/classes/messages.properties<f:loadBundle basename="messages" var="msgs"/>• Za WEB-INF/classes/package1/test.properties<f:loadBundle basename "package1 test" var "msgs"/><f:loadBundle basename="package1.test" var="msgs"/>3. Izlazne poruke koruste uobičajene EL konstrukcije

© SI1P1 – 2004 157/15– #{msgs.keyName}

Page 158: Programiranje Programiranje Internet Internet aplikacija aplikacija

WEB-INF/classes/messages1.properties

title=Registrationtext=Please enter your first name last nametext=Please enter your first name, last name,and email address.firstNamePrompt=Enter first nameplastNamePrompt=Enter last nameemailAddressPrompt=Enter email addressbuttonLabel=Register Me

© SI1P1 – 2004 158/15

Page 159: Programiranje Programiranje Internet Internet aplikacija aplikacija

signup1.jsp (.faces)

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><f:loadBundle basename="messages1" var="msgs"/><f:loadBundle basename messages1 var msgs /><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE><h:outputText value="#{msgs.title}"/><h:outputText value #{msgs.title} /></TITLE><LINK REL="STYLESHEET"HREF="./css/styles.css"TYPE="text/css">te t/css</HEAD><BODY><CENTER><TABLE BORDER=5><TR><TH CLASS="TITLE"><h:outputText value="#{msgs.title}"/></TH></TR></TABLE><BR>

© SI1P1 – 2004 159/15<h:outputText value="#{msgs.text}"/><P>

Page 160: Programiranje Programiranje Internet Internet aplikacija aplikacija

signup1.jsp (.faces)

<h:form><h:outputText value="#{msgs.firstNamePrompt}"/>:<h:inputText value="#{person.firstName}"/><BR><h:outputText value="#{msgs.lastNamePrompt}"/>:p { g p } /<h:inputText value="#{person.lastName}"/><BR><h:outputText value="#{msgs emailAddressPrompt}"/>:<h:outputText value= #{msgs.emailAddressPrompt} />:<h:inputText value="#{person.emailAddress}"/><BR><h:commandButtonvalue="#{msgs.buttonLabel}"action="#{person.doRegistration}"/>

© SI1P1 – 2004 160/15

{p g } /</h:form></CENTER></BODY></HTML>

Page 161: Programiranje Programiranje Internet Internet aplikacija aplikacija

Stringovi sa parametrima

1 K i ti f jl k i WEB INF/ l1. Kreira se .properties fajl u okviru WEB-INF/classes– Vrednosti sadrže {0}, {1}, {2}, ...– N.p., nekoIme=blah {0} blah {1}N.p., nekoIme blah {0} blah {1}2. Učitati fajl sa f:loadBundle kao i ranije– basename definiše osnovno ime fajla– var definiše promenljivu koja će sadržati rezultat 3. Izlazne poruke koriste h:outputFormat– vrednost definiše osnovnu poruku– vrednost definiše osnovnu poruku– ugnežđene f:param daju vrednosti za zamenu– N.p.:

<h:outputFormat value="#{msgs.someName}"><f:param value="value for 0th entry"/><f:param value "value for 1st entry"/>

© SI1P1 – 2004 161/15<f:param value= value for 1st entry /></h:outputFormat>

Page 162: Programiranje Programiranje Internet Internet aplikacija aplikacija

messages2.properties

title=RegistrationfirstName=first namelastName=last namelastName=last nameemailAddress=email addresstext=Please enter your {0}, {1}, and {2}.text=Please enter your {0}, {1}, and {2}.prompt=Enter {0}buttonLabel=Register Meg

© SI1P1 – 2004 162/15

Page 163: Programiranje Programiranje Internet Internet aplikacija aplikacija

signup2.jsp (.faces)<%@ taglib uri="http://java sun com/jsf/html" prefix="h" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view locale="#{facesContext.externalContext.request.locale}"><f:loadBundle basename="messages2" var="msgs"/>...<TABLE BORDER=5><TR><TH CLASS="TITLE"><h:outputText value="#{msgs.title}"/></TH></TR></TABLE></TABLE><BR><h:outputFormat value="#{msgs.text}"><f:param value="#{msgs.firstName}"/><f:param value="#{msgs.lastName}"/><f:param value="#{msgs.emailAddress}"/></h:outputFormat><P><P><h:form><h:outputFormat value="#{msgs.prompt}"><f:param value="#{msgs.firstName}"/>

/h t tF t© SI1P1 – 2004 163/15

</h:outputFormat>:<h:inputText value="#{person.firstName}"/>

Page 164: Programiranje Programiranje Internet Internet aplikacija aplikacija

signup2.jsp (.faces)BR<BR>

<h:outputFormat value="#{msgs.prompt}"><f:param value="#{msgs.lastName}"/>

/h</h:outputFormat>:<h:inputText value="#{person.lastName}"/><BR><h:outputFormat value="#{msgs.prompt}"><f:param value="#{msgs.emailAddress}"/></h:outputFormat>:<h:inputText value="#{person.emailAddress}"/><BR><h:commandButtonvalue="#{msgs.buttonLabel}"action="#{person.doRegistration}"/></h:form>

© SI1P1 – 2004 164/15

/</CENTER></BODY></HTML></f:view>

Page 165: Programiranje Programiranje Internet Internet aplikacija aplikacija

Obrada događaja

P t j d ij t d đ j k j išiPostoje dve varijante događaja koje generiši korisnici– Događaji koji strartuju neki back-end procesg j j j p– Događaji koji utiču samo na format korisničkog interfejsaJSF izvršava podelu koda koji izvršava ove operacije na action controllers i event listenersna action controllers i event listeners– Action controllers obrađuju slanje glavne forme• Okidaju se posle popunjavanja bean-ovaj p p p j j• Okidaju se posle validacione logike• Vraća stringove koji utiču na dalju navigaciju

E ent listene s ob ađ j la no i la ne događaje– Event listeners obrađuju ulazno izlazne događaje• Uobičajeno je da se okidaju pre popunjavanja bean-ova• Uobičajeno je da izbegavaju validacionu logiku

© SI1P1 – 2004 165/15

Uob aj o j da b ga aju a da o u og u• Nikada direktno ne utiču na navigaciju

Page 166: Programiranje Programiranje Internet Internet aplikacija aplikacija

Tipovi event listener-a

A ti Li tActionListener– Poziva se pomoću submit dugmeta, slika, i linkova sa

odgovarajućim JavaScript kodomg j p• <h:commandButton value="..." .../>• <h:commandButton image="..." .../>

h dLi k /• <h:commandLink .../>– Automatski submit-uju formu

ValueChangeListenerValueChangeListener– Poziva se pomoću combo boxes, checkboxes, radio

dugmadi, tekst polja, ...<h selectOneMen />• <h:selectOneMenu .../>

• <h:selectBooleanCheckbox.../>• <h:selectOneRadio .../>

© SI1P1 – 2004 166/15

O ad o /• <h:inputText .../>

– Ne submit-uju formu automatski

Page 167: Programiranje Programiranje Internet Internet aplikacija aplikacija

Upotreba ActionListener-a

šNeko dugme treba da pošalje formu i pokrene backend procese– Koristi se <h:commandButton action=" " >Koristi se <h:commandButton action= ... ...>Druga vrsta utiče samo na UI– Koristi se <h:commandButton actionListener="..." .../>/– Uobičajeno je da se ovaj proces izvršava pre nego što se popune bean-ovi i posebno pre validacije

ć• Većina formi je nekompletno popunjeno kada se UI podešava– Zato se korsiti atribut "immediate" da bi se naznačiloZato se korsiti atribut immediate da bi se naznačilo izvršavanje pre navedenih operacija

<h:commandButton actionListener="...“ © SI1P1 – 2004 167/15immediate="true" .../>

Page 168: Programiranje Programiranje Internet Internet aplikacija aplikacija

Upotreba ActionListener-a

Li t i bič f b kl iListeneri su obično u form bean klasi– Mogu biti i u odvojenoj klasi ako se koristi FacesContext da bi se dobio request ili session objekat i potražio formq j p

bean eksplicitno• Definišu ActionEvent kao argument

N ć j lt t ( ij St i k k d ti– Nema vraćanja rezultata (nije String kao kod action controllers)– ActionEvent je u javax.faces.eventj j– ActionEvent ima getComponent metod koji definiše UIComponent reference• Iz UIComponent može se dobiti component ID renderer• Iz UIComponent, može se dobiti component ID, renderer, i druge informacije niskog nivoa

public void someMethod(ActionEvent event) {© SI1P1 – 2004 168/15doSomeSideEffects();

}

Page 169: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer

S k UI k t l i "di bl d" t k ji jSvaka UI kontrola ima "disabled" property koji je podefault falseTreba koristiti button za koji će biti vezan jActionListener da bi se zabranila ili odobrila upotreba određene kontrolePrimerPrimer– Prihvata promenljive name i job title da bi ih prikazao– Kreira polja za potvrdu da bi korisnik selektovao f d i b k d b jforeground i background boje<h:selectOneMenu value="..." disabled="..." ...>

<f:selectItems value="..."/><f:selectItems value ... /></h:selectOneMenu>• Vrednost za f:selectItems mora da bude SelectItem niz

© SI1P1 – 2004 169/15– Postaviće se dugme koje zabranjuje ili dozvoljava rad sa poljima za potvrdu

Page 170: Programiranje Programiranje Internet Internet aplikacija aplikacija

Koraci kod formiranja JSF strana

1 Kreira se bean sa property-ijima za podatke sa forme1. Kreira se bean sa property-ijima za podatke sa forme• Par getter/setter metoda za svako polje forme

2. Kreira se ulazna forma• Kreira se f:view, h:form, h:blah, i h:commandButton

3. Specificirati action controller metod• Koristi se action atribut h:commandButton

4. Kreira se action controller i action listener metode• U okviru bean-a iz tačke #1.

5 Promeniti faces-config xml5. Promeniti faces-config.xml• Deklarisati form bean i pravila navigacije

6. Kreirati JSP stranicek k l• Svaku za svaki return uslov

7. Zaštiti pristup JSP stranicama• Koristiti podešavanja filtera ili bezbednosti

© SI1P1 – 2004 170/15

Page 171: Programiranje Programiranje Internet Internet aplikacija aplikacija

I korak

© SI1P1 – 2004 171/15

Page 172: Programiranje Programiranje Internet Internet aplikacija aplikacija

I korak

...private String name = "";private String jobTitle = "";private String jobTitle ;...public String getName() { return(name); }public void setName(String name) {this.name = name;}public String getJobTitle() { return(jobTitle); }public void setJobTitle(String jobTitle) {public void setJobTitle(String jobTitle) {this.jobTitle = jobTitle;}

© SI1P1 – 2004 172/15

}

Page 173: Programiranje Programiranje Internet Internet aplikacija aplikacija

II korak

Nove mogućnostiNove mogućnosti– Koristiti h:selectOneMenu da bi se formirao combobox– Koristiti f:selectItems da bi se popunila listaKoristiti f:selectItems da bi se popunila lista– Koristiti h:commandButton sa actionListener -om• Napisati event listener kod koji se izvršava kada se klikne na

dugme– Promenit labelu (vrednost) dugmeta u zavisnosti od toga šta

dugme radidugme radiPrimer koda

<h:commandButton<h:commandButtonvalue="#{someBean.buttonLabel}"actionListener="#{someBean.doSideEffect}"

© SI1P1 – 2004 173/15immediate="true"/>

Page 174: Programiranje Programiranje Internet Internet aplikacija aplikacija

II korak

<h:form>h:form...Foreground color:<h:selectOneMenu value="#{resumeBean.fgColor}"disabled "#{!resumeBean colorSupported}">disabled="#{!resumeBean.colorSupported}"><f:selectItems value="#{resumeBean.availableColors}"/></h:selectOneMenu><BR>Background color:<h:selectOneMenu value="#{resumeBean.bgColor}"disabled="#{!resumeBean.colorSupported}"><f:selectItems value="#{resumeBean availableColors}"/><f:selectItems value= #{resumeBean.availableColors} /></h:selectOneMenu><BR><h:commandButtonvalue="#{resumeBean.colorSupportLabel}"actionListener="#{resumeBean.toggleColorSupport}"immediate="true"/>...</h:form>

© SI1P1 – 2004 174/15

</h:form>

Page 175: Programiranje Programiranje Internet Internet aplikacija aplikacija

III korak

<h:form><h:form>...<h:commandButton<h:commandButtonvalue="#{resumeBean.colorSupportLabel}"actionListener="#{resumeBean.toggleColorSupport}"immediate="true"/>...</h:form>

© SI1P1 – 2004 175/15

Page 176: Programiranje Programiranje Internet Internet aplikacija aplikacija

III korak

Isti pristup kao i u prethodnom primeruIsti pristup kao i u prethodnom primeru<h:form>......Name:<h:inputText value="#{resumeBean.name}"/><BR>Job Title:<h:inputText value="#{resumeBean.jobTitle}"/><P><h:commandButton value="Show Preview"action="#{resumeBean.showPreview}"/></h:form></h:form>

© SI1P1 – 2004 176/15

Page 177: Programiranje Programiranje Internet Internet aplikacija aplikacija

IV korak

Bočni efektiBočni efekti– Logički flag povezan sa dugmetom se postavlja ako je boja

podržana, ali i deaktivira oba combobox-ap ,

...public void toggleColorSupport(ActionEvent event) {isColorSupported = !isColorSupported;}}

© SI1P1 – 2004 177/15

Page 178: Programiranje Programiranje Internet Internet aplikacija aplikacija

IV korak

Isti pristup kao u prethodnom primeruIsti pristup kao u prethodnom primeru– Kod za kontrolu je unutar form bean-a (ResumeBean)– Proverava se da li su unete boje različiteProverava se da li su unete boje različite...public String showPreview() {if (isColorSupported && fgColor.equals(bgColor)) {return("same-color");} else {return("success");}}}

© SI1P1 – 2004 178/15

Page 179: Programiranje Programiranje Internet Internet aplikacija aplikacija

Početni rezultat

© SI1P1 – 2004 179/15

Page 180: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5

Deklarisanje bean-aDeklarisanje bean-a…<faces-config><managed-bean><managed-bean-name>resumeBean</managed-

bean-name>bean name><managed-bean-class>coreservlets.ResumeBean</managed-bean-class><managed-bean-scope>session</managed-bean-

scope>scope></managed-bean>…

© SI1P1 – 2004 180/15</faces-config>

Page 181: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5

Specificiranje pravila navigacijeSpecificiranje pravila navigacije…<faces-config>…<navigation-rule><from-view-id>/customize.jsp</from-view-id><navigation case><navigation-case><from-outcome>same-color</from-outcome><to-view-id>/WEB-INF/results/same-color.jsp</to-view-id></navigation case></navigation-case><navigation-case><from-outcome>success</from-outcome><t i id>/WEB INF/ lt / h i j </t i id><to-view-id>/WEB-INF/results/show-preview.jsp</to-view-id></navigation-case></navigation-rule>

/f fi© SI1P1 – 2004 181/15

</faces-config>

Page 182: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6

WEB-INF/results/same-color jspWEB INF/results/same color.jsp<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><f:view><!DOCTYPE …><HTML>…You chose"<h:outputText value="#{resumeBean.fgColor}"/>"as both the foreground and background coloras both the foreground and background color.<P>You don't deserve to get a job, but I suppose

ill l t <A HREF " t i f ">t i </A>we will let you <A HREF="customize.faces">try again</A>.…</HTML>

/f i© SI1P1 – 2004 182/15

</f:view>

Page 183: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6

WEB-INF/results/show-preview.jspWEB INF/results/show preview.jsp<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><!DOCTYPE ><!DOCTYPE …><HTML>…<BODY TEXT="<h:outputText value="#{resumeBean.fgColor}"/>"p { g }BGCOLOR="<h:outputText value="#{resumeBean.bgColor}"/>"><H1 ALIGN="CENTER"><h:outputText value="#{resumeBean.name}"/><BR><SMALL><h:outputText value="#{resumeBean jobTitle}"/><SMALL><h:outputText value= #{resumeBean.jobTitle} /></SMALL></H1>Experienced <h:outputText value="#{resumeBean.jobTitle}"/>seeks challenging position doing something.<H2>Employment History</H2>Blah, blah, blah, blah. Yadda, yadda, yadda, yadda.…</HTML>

© SI1P1 – 2004 183/15

</HTML></f:view>

Page 184: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6

© SI1P1 – 2004 184/15

Page 185: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 7

<web-app><web app>…<security-constraint><display-name>p yPrevent access to raw JSP pages that are for JSF pages.</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-

name><!-- Add url-pattern for EACH raw JSP page --><url-pattern>/customize jsp</url-pattern><url-pattern>/customize.jsp</url-pattern></web-resource-collection><auth-constraint><description>No roles, so no direct access</description><description>No roles, so no direct access</description></auth-constraint></security-constraint></web-app>

© SI1P1 – 2004 185/15

Page 186: Programiranje Programiranje Internet Internet aplikacija aplikacija

Upotreba ValueChangeListener-a u JSP

ActionListener je vezan za dugmeActionListener je vezan za dugme– Forma se automatski šalje kada se dugme pritisneValueChangeListener je povezan za combobox,ValueChangeListener je povezan za combobox, listbox, radio button, checkbox, textfield, ...– Forma se šalje automatski– Potrebno je dodati JavaScript da bi se forma poslalaonclick="submit()" or onchange="submit()"

P t ji i k tibil t i đ N t i IE– Postoji i nekompatibilnost između Netscape i IE• Netscape, Mozilla, i Opera okidaju onchange događaj kada se promeni selekcija combobox-a, kada je radio buttonse promeni selekcija combobox a, kada je radio button selektovan, ili kada checkbox promeni vrednost• Internet Explorer okida događaj nakon promene selekcije, li k d k d GUI k t l ih ti f k© SI1P1 – 2004 186/15ali samo kada neka druga GUI kontrola prihvati fokus

Page 187: Programiranje Programiranje Internet Internet aplikacija aplikacija

Upotreba ValueChangeListener-a u JSP

Listener je obično u klasi form bean-aListener je obično u klasi form bean a– Diskutovano ranijePrihvata ValueChangeEvent kao argument– Postoje korisni ValueChangeEvent metodij g• getComponent ()• getOldValue (prethodna vrednost GUI elementa)• getNewValue (trenutna vrednost GUI elementa)

ž š– Potrebno dok bean možda još nije popunjen– Vrednost za checkbox je tipa Boolean– Vrednost za radio button ili tekstualno polje je povezano sa parametrima zahtevaparametrima zahteva– Primer

public void someMethod(ValueChangeEvent event) {boolean flag =g((Boolean)event.getNewValue()).booleanValue();takeActionBasedOn(flag);}

© SI1P1 – 2004 187/15

Page 188: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer: promena boje

h:selectOneMenu koristi f:selectItems da bi dobioh:selectOneMenu koristi f:selectItems da bi dobio listu combobox ulazaKoristi se checkbox da bi se pozvao pValueChangeListenerPostoje dve definisane liste

b j– Imena boja– RGB vrednosti

© SI1P1 – 2004 188/15

Page 189: Programiranje Programiranje Internet Internet aplikacija aplikacija

JSF koraci

1 Kreira se bean sa property ijima za podatke sa1. Kreira se bean sa property-ijima za podatke sa forme

2. Kreira se ulazna forma pomoću f:view i h:formp3. Specificirati action controller metod pomoću action

atributa od h:commandButtoni j i ll i i d i i i4. Kreiraju se action controller-i i drugi tipovi event

listener-a5. Promeniti faces-config.xml da bi se deklarisali form5. Promeniti faces config.xml da bi se deklarisali form

bean i pravila navigacije6. Kreirati JSP stranice za svaki return uslov7. Zaštiti pristup JSP stranicama

© SI1P1 – 2004 189/15

Page 190: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 1

© SI1P1 – 2004 190/15

Page 191: Programiranje Programiranje Internet Internet aplikacija aplikacija

Koraci 2 i 3

Nove mogućnostiNove mogućnosti– Koristiti h:selectBooleanCheckbox da bi se kreirao checkbox– Koristiti valueChangeListener za realizaciju event listenerKoristiti valueChangeListener za realizaciju event listener

koda– Koristiti onclick da bi se automatski slala fomra kada

h kb j d icheckbox menja vrednosti• Primer<h:selectBooleanCheckbox<h:selectBooleanCheckboxvalueChangeListener="#{resumeBean.changeColorMo

de}"}onclick="submit()"immediate="true"/>

© SI1P1 – 2004 191/15

Page 192: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 4

Kada je checkbox selektovan menjaju se izbori bojaKada je checkbox selektovan, menjaju se izbori boja da bi se dobile RGB vrednosti umesto imena boja

public void changeColorMode(ValueChangeEvent event) {

b l flboolean flag =((Boolean)event.getNewValue()).booleanValue();setUsingColorNames(!flag);setUsingColorNames(!flag);}

© SI1P1 – 2004 192/15

Page 193: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultati

© SI1P1 – 2004 193/15

Page 194: Programiranje Programiranje Internet Internet aplikacija aplikacija

Zajednička upotreba action listener-a i actioncontroller-a

Obično action listener i i action controller i suObično, action listener-i i action controller-i su povezani sa različitim objektimaNekada je potrebno koristiti obaj p– Action listener-i imaju pristup do niskog nivoa detalja GUI objekata

jč šći i iNajčešći primeri:Mape slika na serverskoj strani

h:commandButton sa slikom umesto vrednosti rezultuje u– h:commandButton sa slikom umesto vrednosti rezultuje u mapi slike– Trenutna dolazeća imena parametara zahteva su pclientID.x i clientID.ySamo listener može otkriti ID klijenta

© SI1P1 – 2004 194/15

Page 195: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer: izbor pozadine sa mape slike Prikazati paletu boja korisnikuPrikazati paletu boja korisnikuDozvoiliti mu da klikne na željenu boju za pozadinuNaći odgovarajuću RGB vrednostNaći odgovarajuću RGB vrednost– Pročitati clientID.x vrednost– Normalizovati je na 0-256 u zavisnosti od širine slike– Prikazati izlaz kao hex cifre unutar #RRGGBB stringa– Uraditi sve u okviru action listener-aProslediti JSP stranici– Uraditi u okviru action controller

© SI1P1 – 2004 195/15

Page 196: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 1 package coreservlets;package coreservlets;...public class ColorBean {public class ColorBean {private String bgColor = "WHITE";public String getBgColor() { return(bgColor); }public void setBgColor(String bgColor) {this.bgColor = bgColor;}

© SI1P1 – 2004 196/15

Page 197: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 2Koristiti h:commandButton sa slikom umestoKoristiti h:commandButton sa slikom umesto vrednosti– Rezultat je mapa slike na sereverskoj stranij p jKod

<h:commandButtonimage="images/GrayBar.gif"

ti Li t "#{ l B l tG L l}"actionListener="#{colorBean.selectGrayLevel}"action="#{colorBean.showPreview}"/>

© SI1P1 – 2004 197/15

Page 198: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 2

© SI1P1 – 2004 198/15

Page 199: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3Koristiti i actionListener i action u okviru istogKoristiti i actionListener i action u okviru istog dugmeta

<h:form>...<h:commandButtonimage="images/GrayBar.gif"

ti Li t "#{ l B l tG L l}"actionListener="#{colorBean.selectGrayLevel}"action="#{colorBean.showPreview}"/></h:form></h:form>

© SI1P1 – 2004 199/15

Page 200: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 3Listener traži x vrednost i kreira bojuListener traži x vrednost i kreira boju

public void selectGrayLevel(ActionEvent event) {FacesContext context = FacesContext.getCurrentInstance();String clientId = event.getComponent().getClientId(context);HttpServletRequest requestHttpServletRequest request =(HttpServletRequest)context.getExternalContext().getRequest();String grayLevelString = request.getParameter(clientId + ".x");int grayLevel = 220;g y ;try {grayLevel = Integer.parseInt(grayLevelString);} catch(NumberFormatException nfe) {}// Image is 440 pixels so scale// Image is 440 pixels, so scale.grayLevel = (256 * grayLevel) / 440;String rVal = Integer.toString(grayLevel, 16);setBgColor("#" + rVal + rVal + rVal);}

Controller definiše izlaznu stranupublic String showPreview() {return("success");

© SI1P1 – 2004 200/15

return( success );}

Page 201: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5Declarisanje bean-aDeclarisanje bean-a

…<faces-config>...<managed-bean><managed-bean-name>colorBean</managed-bean-name>g g<managed-bean-class>coreservlets.ColorBean</managed-bean-class></managed-bean-class><managed-bean-scope>request</managed-bean-scope></managed-bean>…</faces-config>

© SI1P1 – 2004 201/15

Page 202: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 5Specifikacija pravila navigacijeSpecifikacija pravila navigacije

…<faces-config>…<navigation-rule><from-view-id>/customize-bg.jsp</from-view-id>g j p<navigation-case><from-outcome>success</from-outcome><to-view-id><to-view-id>/WEB-INF/results/show-preview2.jsp</to-view-id>

/ i i</navigation-case></navigation-rule></faces-config>

© SI1P1 – 2004 202/15

Page 203: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 6WEB-INF/results/show-preview2.jspWEB INF/results/show preview2.jsp

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view><!DOCTYPE ...><HTML><HEAD><TITLE>Preview of Background

Color</TITLE></HEAD>Color</TITLE></HEAD><BODY BGCOLOR="<h:outputText

value="#{colorBean.bgColor}"/>"><H1 ALIGN="CENTER">Preview of Background Color</H1><H1 ALIGN CENTER >Preview of Background Color</H1>Experienced employeeseeks challenging position doing something.<H2>Employment History</H2>Blah, blah, blah, blah. Yadda, yadda, yadda, yadda.…</HTML>

/f i© SI1P1 – 2004 203/15

</f:view>

Page 204: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 204/15

Page 205: Programiranje Programiranje Internet Internet aplikacija aplikacija

Korak 7<web-app><web app>…<security-constraint><display-name>p yPrevent access to raw JSP pages that are for JSF pages.</display-name><web-resource-collection><web-resource-name>Raw-JSF-JSP-Pages</web-resource-

name><!-- Add url-pattern for EACH raw JSP page --><url-pattern>/customize jsp</url-pattern><url-pattern>/customize.jsp</url-pattern><url-pattern>/customize-bg.jsp</url-pattern></web-resource-collection><auth-constraint><auth constraint><description>No roles, so no direct access</description></auth-constraint></security-constraint>

© SI1P1 – 2004 205/15</web-app>

Page 206: Programiranje Programiranje Internet Internet aplikacija aplikacija

h bibliotekah:formh:form– Ne specificira se ACTION specified– Mora da se koristi POST!h:inputText– NAME se generise automatski

VALUE je u formi #{beanName propertyName}– VALUE je u formi #{beanName.propertyName}h:inputSecret– NAME se generise automatskig– VALUE se primenjuje samo na izlaz, ne na ulazh:commandButton

Ak ij d t ib t ACTION t f– Akcija odgovara atributu ACTION taga formeh:outputText– Prikazuju se property-iji bean-a

© SI1P1 – 2004 206/15

Prikazuju se property iji bean a

Page 207: Programiranje Programiranje Internet Internet aplikacija aplikacija

h bibliotekaDeljeni atributiDeljeni atributi– Ove atribute je moguće koristiti u skoro svim h:blah elementima– Neće se ponavljati prilikom opisa svakog elementaNajviše korišćeni deljeni atributi– id Identifikator; koristi se da bi se dodelilo ime elementuid. Identifikator; koristi se da bi se dodelilo ime elementu, tako da može da mu se pristupi kasnije (n.p., za validaciju)– onclick, ondblclick, ... JavaScript obrada događaja.

b ž l k l l l k• Obratiti pažnju na velika i mala slova, onClick nije ispravno.– styleClass. CSS ime stila.y• Očekivani atributi– Ovi atributi su oni koji odgovaraju određenom HTML elementu n p size i maxlength za tekst polje

© SI1P1 – 2004 207/15elementu, n.p. size i maxlength za tekst polje

Page 208: Programiranje Programiranje Internet Internet aplikacija aplikacija

h:form

Odgovarajući HTML elementOdgovarajući HTML element– <FORM …>MogućnostiMogućnosti– Ne specificira se akcijaAtribut– enctype - Tip kodiranja.• application/x-www-form-urlencoded (default)• multipart/form-data– target. Frame deo u kome se prikazuje rezultat

onsubmit JavaScript kod koji se izvršava pre slanja– onsubmit. JavaScript kod koji se izvršava pre slanja forme• Može da se izvrši validacija polja na klijentskoj strani

© SI1P1 – 2004 208/15

j p j j j

Page 209: Programiranje Programiranje Internet Internet aplikacija aplikacija

h:inputText

Odgovarajući HTML elementOdgovarajući HTML element– <INPUT TYPE="TEXT" …>Atributi

ć– value – Odgovarajuća vrednost bean-a.• value="#{beanName.propertyName}"• Koristi se i za inicijalnu vrednost i pri slanju serverskoj komponentij p j j p– valueChangeListener. Koji se metod izvršava kada se šalje forma i vrednost ztekst polja je promenjena.– onchange. JavaScript koji se izvršava pri promeni vrednostionchange. JavaScript koji se izvršava pri promeni vrednosti– immediate. Koristi se da pozove validaciju listener-a– required. Flag koji definiše da li korisnik mora da unese vrednost.

Kao je ne unese forma se ponovo prikazuje i prikazuje se poruka o• Kao je ne unese, forma se ponovo prikazuje i prikazuje se poruka o grešci.– validator. Metod koji izvršava validaciju.

© SI1P1 – 2004 209/15

Page 210: Programiranje Programiranje Internet Internet aplikacija aplikacija

h:inputSecret

Odgovarajući HTML elementOdgovarajući HTML element– <INPUT TYPE="PASSWORD" …>Atributi

ć– value. Odgovarajuća vrednost bean-a.• value="#{beanName.propertyName}"• Koristi se samo za slanje podatakaj p– valueChangeListener. Koji se metod izvršava kada se šalje forma i vrednost ztekst polja je promenjena.– onchange. JavaScript koji se izvršava pri promeni vrednostionchange. JavaScript koji se izvršava pri promeni vrednosti– immediate. Koristi se da pozove validaciju listener-a– required. Flag koji definiše da li korisnik mora da unese vrednost.

Kao je ne unese forma se ponovo prikazuje i prikazuje se poruka o• Kao je ne unese, forma se ponovo prikazuje i prikazuje se poruka o grešci.– converter, validator. Metodi koji izvršavaju konverziju stringa i validaciju podataka

© SI1P1 – 2004 210/15validaciju podataka.

Page 211: Programiranje Programiranje Internet Internet aplikacija aplikacija

h:commandButton

Odgovarajući HTML elementOdgovarajući HTML element– <INPUT TYPE="SUBMIT" …>AtributiAtributi– value. Natpis na dugmetu. Često je statički string, ali se može dinamički menjati– action. Metod action controller-a koji se izvršava kada se šalje forma. Izvršava se kada svi listener-i završe svoj posaoposao.– actionListener. Metod listener-a koji se izvršava kada se šalje forma. Izvršava se pre action controller-a.

© SI1P1 – 2004 211/15

Page 212: Programiranje Programiranje Internet Internet aplikacija aplikacija

h:commandButton (sa slikom)

Odgovarajući HTML elementOdgovarajući HTML element– <INPUT TYPE="IMAGE" …>• Slika na serverskoj strani Slika na serverskoj straniAtributi– Isti kao na prethodnom slajdu, samo što je actionListener neophodan• Sami listener može pristupiti ID klijenta

ID klij t j t b d bi d bil i l k ij• ID klijenta nam je potreban da bi se dobile x i y lokacije

© SI1P1 – 2004 212/15

Page 213: Programiranje Programiranje Internet Internet aplikacija aplikacija

h:commandLink

Odgovarajući HTML elementOdgovarajući HTML element– <A HREF="..."> sa povezanim JavaScript kodom koji šalje formu kada se link aktivira– JavaScript se ubacuje automatski pomoću JSF• Atributi– value Tekst linka Često je statički string ali se moževalue. Tekst linka. Često je statički string, ali se može dinamički menjati– action. Metod action controller-a koji se izvršava kada se šalje forma Izvršava se kada svi listener i završe svojšalje forma. Izvršava se kada svi listener-i završe svoj posao.– actionListener. Metod listener-a koji se izvršava kada se š ššalje forma. Izvršava se pre action controller-a. • Napomena– Mora da se navede u okviru h:form (u ranijim verzijama

© SI1P1 – 2004 213/15

Mora da se navede u okviru h:form (u ranijim verzijama MyFaces se javljala greška)

Page 214: Programiranje Programiranje Internet Internet aplikacija aplikacija

Elementi sa valueChangeListener atributima

Check boxesCheck boxes– h:selectBooleanCheckbox

• Vrednost se dodeljuje na osnovu logičke bean property. Vrednost se postavlja na true ili falseComboboxes

– h:selectOneMenuh:selectOneMenu– h:selectManyMenu

List boxes– h:selectOneListbox– h:selectManyListbox

Radio ButtonsRadio Buttons– h:selectOneRadio

Textfields© SI1P1 – 2004 214/15– h:inputText

Page 215: Programiranje Programiranje Internet Internet aplikacija aplikacija

Checkbox i list box

Specificira jedna opcija u Specificira se početna listaSpecificira jedna opcija u jednom trenutku

<h:selectOneMenu ...><f:selectItem itemValue " "

Specificira se početna lista<h:selectOneMenu ...><f:selectItems value="..."/>

<f:selectItem itemValue="..."itemLabel="..."/><f:selectItem itemValue="..."

</h:selectOneMenu>

itemLabel="..."/><f:selectItem itemValue="..."itemLabel="..."/>itemLabel ... /></h:selectOneMenu>

© SI1P1 – 2004 215/15

Page 216: Programiranje Programiranje Internet Internet aplikacija aplikacija

Checkbox i list box

Vrednost za f:selectItems mora biti List ili nizVrednost za f:selectItems mora biti List ili niz elemenata tipa java.faces.model.SelectItemSelectItem ima dva glavna konstruktorag– Jedan samo specificira String• Vrednost koja se prikazuje i vrednost koja se šalje setter

d b i imetodu bean-a su isti– Drugi specificira Java objekat i String• String se prikazuje ali se Java objekat kao vrednost šalje• String se prikazuje, ali se Java objekat kao vrednost šalje setter metodu bean-a (mapiranje se izvršava automatski pomoću JSF)

SelectItem[] listboxItems ={ new SelectItem(realValue1, "Choice 1"),

S l tIt ( lV l 2 "Ch i 2")© SI1P1 – 2004 216/15new SelectItem(realValue2, "Choice 2"), ...

Page 217: Programiranje Programiranje Internet Internet aplikacija aplikacija

Mogućnosti prikaza

h:outputTexth:outputText– Prikazuje se bean property ili element kolekcije• Vrednosti iz properties fajla se upisuju u kolekciju pomoću Vrednosti iz properties fajla se upisuju u kolekciju pomoću f:loadBundle– Slično bean:write iz Struts-a– Atributi• styleClass ili style: rezultat je SPAN element

d t f l j k išć j filt i• escape: vrednost false je ne korišćenje filtera za < i >• h:outputFormat– Prikazuje poruke o grešci sa paramtrima– Prikazuje poruke o grešci sa paramtrima– Parametri se prosleđuju sa f:param

© SI1P1 – 2004 217/15

Page 218: Programiranje Programiranje Internet Internet aplikacija aplikacija

ValidacijaRučna validacijaRučna validacija

– Koriste se string property-iji za bean– Sprovede se validacija u setter metodama i/ili action controller-ima– Vraća se null da bi se ponovo prikazala forma– Vraća se null da bi se ponovo prikazala forma– Kreiraju se odgovarjuće poruke o greškama

Implicitna automatska validacijaKoriste se int double bean property iji Ili required– Koriste se int, double, ... bean property-iji. Ili required.

– Sistem ponovo prikazuje formu, ako postoji greška prilikom konverzije– Koristi se h:message da se prikaže poruka za određeno polje

Eksplicitna validacijaEksplicitna validacija– Koriste se f:convertNumber, f:convertDateTime, f:validateLength,f:validateDoubleRange, ili f:validateLongRange

Si t ik j f l č j šk t h– Sistem ponovo prikazuje forma u slučaju greške; opet h:messageKreiranje sopstvenih metoda validacijaKreiranje uobičajenih validacija

K i F M k i V lid E i h© SI1P1 – 2004 218/15

– Kreira se FacesMessage, u okviru ValidatorException, throw

Page 219: Programiranje Programiranje Internet Internet aplikacija aplikacija

Ručna validacija

Setter metodi konvertuju iz stringovaSetter metodi konvertuju iz stringova– Koriste se try/catch blokovi– Koristi se logika specifična za aplikacijuKoristi se logika specifična za aplikacijuAction controller proverava vrednosti– Ako su vrednosti u redu, vraća se uobičajeni izlaz– Ako vrednosti nedostaju ili su nelegalne, smešta se poruka o grešci u bean i vraća se nullP č t fPočetna forma– Prikazuje poruke o grešci• Poruke su prazni stringovi po defaultu• Poruke su prazni stringovi po defaultu• u okviru h:outputText, treba koristiti escape="false" ako poruka sadrži HTML tagove

© SI1P1 – 2004 219/15

Page 220: Programiranje Programiranje Internet Internet aplikacija aplikacija

Ručna validacija - primer

IdejaIdeja– Skupljaju se cene za ključne reči na search engine sajtuAtributi– UserID• Ne može da nedostaje

Keyword– Keyword• Ne može da nedostaje– Cena• Mora da bude legalan racionalni broj• Mora da bude najmanje 0.10

T j j– Trajanje• Mora da bude legalan int• Mora dabude najmanje 15

© SI1P1 – 2004 220/15

Mora dabude najmanje 15

Page 221: Programiranje Programiranje Internet Internet aplikacija aplikacija

Bean kodpackage coreservlets;package coreservlets;import java.util.ArrayList;public class BidBean1 {private String userID = "";p g ;private String keyword = "";private String bidAmount;private double numericBidAmount = 0;private String bidDuration;private int numericBidDuration = 0;private ArrayList errorMessages = new ArrayList();public String getUserID() { return(userID); }public String getUserID() { return(userID); }

public void setUserID(String userID) {this.userID = userID.trim();

}}public String getKeyword() { return(keyword); }public void setKeyword(String keyword) {

this.keyword = keyword.trim();© SI1P1 – 2004 221/15

this.keyword keyword.trim();}

Page 222: Programiranje Programiranje Internet Internet aplikacija aplikacija

Bean kodpublic String getBidAmount() { return(bidAmount); }public String getBidAmount() { return(bidAmount); }public void setBidAmount(String bidAmount) {this.bidAmount = bidAmount;try {numericBidAmount Double parseDouble(bidAmount);numericBidAmount = Double.parseDouble(bidAmount);} catch(NumberFormatException nfe) {}}public double getNumericBidAmount() {p g () {return(numericBidAmount);}public String getBidDuration() { return(bidDuration); }public void setBidDuration(String bidDuration) {public void setBidDuration(String bidDuration) {this.bidDuration = bidDuration;try {numericBidDuration = Integer.parseInt(bidDuration);} catch(NumberFormatException nfe) {}}public int getNumericBidDuration() {return(numericBidDuration);

© SI1P1 – 2004 222/15

return(numericBidDuration);}

Page 223: Programiranje Programiranje Internet Internet aplikacija aplikacija

Bean kod – Action Controllerpublic String doBid() {public String doBid() {errorMessages = new ArrayList();if (getUserID().equals("")) {

errorMessages.add("UserID required");}}if (getKeyword().equals("")) {

errorMessages.add("Keyword required");}}if (getNumericBidAmount() <= 0.10) {

errorMessages.add("Bid amount must be at least $0.10.");}if (getNumericBidDuration() < 15) {if (getNumericBidDuration() < 15) {

errorMessages.add("Duration must be at least 15 days.");}if (errorMessages.size() > 0) {

return(null);} else {return("success");}

© SI1P1 – 2004 223/15

}}

Page 224: Programiranje Programiranje Internet Internet aplikacija aplikacija

Bean kod – Error message

public String getErrorMessages() {public String getErrorMessages() {String message;if (errorMessages.size() == 0) {

message = "";} else {message = "<FONT COLOR=RED><B><UL>\n";gfor(int i=0; i<errorMessages.size(); i++) {message = message + "<LI>" +(String)errorMessages get(i) + "\n";(String)errorMessages.get(i) + \n ;}message = message + "</UL></B></FONT>\n";}}return(message);}

© SI1P1 – 2004 224/15

Page 225: Programiranje Programiranje Internet Internet aplikacija aplikacija

bid1.jsp<h:form>h:form<h:outputText value="#{bidBean1.errorMessages}“ escape="false"/><TABLE><TR><TD>User ID:<TD>User ID:<h:inputText value="#{bidBean1.userID}"/></TD></TR><TR><TD>Keyword:y<h:inputText value="#{bidBean1.keyword}"/></TD></TR><TR><TD>Bid Amount:$<h:inputText value="#{bidBean1 bidAmount}"/></TD></TR>$<h:inputText value= #{bidBean1.bidAmount} /></TD></TR><TR><TD>Duration:<h:inputText value="#{bidBean1.bidDuration}"/></TD></TR><TR><TH><h:commandButton value="Send Bid!"action="#{bidBean1.doBid}"/></TH></TR></TABLE>

© SI1P1 – 2004 225/15

</TABLE></h:form>

Page 226: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 226/15

Page 227: Programiranje Programiranje Internet Internet aplikacija aplikacija

JSF pojednostavljena kontrola toka

© SI1P1 – 2004 227/15

Page 228: Programiranje Programiranje Internet Internet aplikacija aplikacija

Implicitna automatska validacija

Definišu se bean property-iji na standardne tipove podatakaDefinišu se bean property-iji na standardne tipove podataka– int, long, double, boolean, char, ...Sistem pokušava da izvrši automatsku konverziju, kao kod jsp:setPropertyjsp:setProperty– Integer.parseInt, Double.parseDouble, ...Ako postoji greška, forma se ponovo prikazuje– I smešta se poruka o grešciMože se dodati atribut required za svaki ulazni element, da bi se specificiralo da prazne vrednosti predstavljaju greškuj j g• Koristi se h:message da bi se prikazale poruke i greškama– h:message vraća prazan string ako nema poruke– h:message prihvata styleClass za CSS ime stilah:message prihvata styleClass za CSS ime stilaDodaje se atribut immediate da bi se preskočila validacija– Na primer za h:commandButton sa logout ili cancel operacijama

© SI1P1 – 2004 228/15

Page 229: Programiranje Programiranje Internet Internet aplikacija aplikacija

Implicitna automatska validacija - primer

Promena BidBean property ijaPromena BidBean property-ija– bidAmount je double– bidDuration je intbidDuration je intPromena BidBean action controller– Uklanja se sva validaciona logika.• Treba primeniti da se specifična vrednost za cenu i trajanja više ne proveravaP l fPromena ulazne forme– Dodaje se atribut required za userID i keyword polja– Dodaje se atribut id za svako polje– Dodaje se atribut id za svako polje– Dodaje se h:message (sa odgovarajućim id) za svako ulazno polje

© SI1P1 – 2004 229/15

Page 230: Programiranje Programiranje Internet Internet aplikacija aplikacija

Bean kod

package coreservlets;package coreservlets;public class BidBean2 {private String userID;private String keyword;private double bidAmount;private int bidDuration;p…public double getBidAmount() { return(bidAmount); }public void setBidAmount(double bidAmount) {public void setBidAmount(double bidAmount) {this.bidAmount = bidAmount;}

bli i id i () { (bid i ) }public int getBidDuration() { return(bidDuration); }public void setBidDuration(int bidDuration) {this.bidDuration = bidDuration;

© SI1P1 – 2004 230/15}

Page 231: Programiranje Programiranje Internet Internet aplikacija aplikacija

Bean kod – Action Controller

public String doBid() {public String doBid() {return("success");

}}

© SI1P1 – 2004 231/15

Page 232: Programiranje Programiranje Internet Internet aplikacija aplikacija

Ulazna forma<h:form>h:form<TABLE><TR><TD>User ID: <h:inputText value="#{bidBean2.userID}"required "true“ id "userID"/></TD>required="true“ id="userID"/></TD><TD><h:message for="userID" styleClass="RED"/></TD></TR><TR><TD>Keyword: <h:inputText value="#{bidBean2.keyword}"y p { y }required="true“ id="keyword"/></TD><TD><h:message for="keyword" styleClass="RED"/></TD></TR><TR><TD>Bid Amount: $<h:inputText value="#{bidBean2 bidAmount}"<TD>Bid Amount: $<h:inputText value= #{bidBean2.bidAmount}id="amount"/></TD><TD><h:message for="amount" styleClass="RED"/></TD></TR><TR><TD>Duration: <h:inputText value="#{bidBean2.bidDuration}"id="duration"/></TD><TD><h:message for="duration" styleClass="RED"/></TD></TR>…</TABLE>…</h:form>

© SI1P1 – 2004 232/15

…</TABLE>…</h:form>

Page 233: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 233/15

Page 234: Programiranje Programiranje Internet Internet aplikacija aplikacija

JSF kontola toka

© SI1P1 – 2004 234/15

Page 235: Programiranje Programiranje Internet Internet aplikacija aplikacija

Eksplicitna validacija

Definisati bean property-ije na proste tipove podatakaDefinisati bean property-ije na proste tipove podataka– int, long, double, boolean, char, ...Dodaje se f:validateBlah ili f:convertBlah elementima• Sistem proverava da li polja odgovaraju pravilima– f:validateBlah atributi dozvoljavaju da se kontroliše formatAko postoji greška prilikom validacije, forma se ponovo p j g p j pprikazuje– I smešta se poruka o grešciOstale mogućnosti su isteOstale mogućnosti su iste– I dalje se može dodati atribut required za bilo koji ulazni element– I dalje se sa use h:message prikazuju poruke

h:message vraća prazan string ako nema poruke• h:message vraća prazan string ako nema poruke– I dalje se dodaje atribut immediate attribute da bi se izbegla validacija

© SI1P1 – 2004 235/15

Page 236: Programiranje Programiranje Internet Internet aplikacija aplikacija

Eksplicitna validacija primer

BidBean ostaje nepromenjen u odnosu na prethodniBidBean ostaje nepromenjen u odnosu na prethodni primerPromena ulazne forme

– Pretpostaviti da userID mora biti 5 ili 6 karaktera– Pretpostaviti da keyword mora biti 3 ili više karaktera– Pretpostaviti da bid amount mora biti najmanje 10 centi– Pretpostaviti da bid duration mora biti najmanje 15 dana

© SI1P1 – 2004 236/15

Page 237: Programiranje Programiranje Internet Internet aplikacija aplikacija

Početna forma

<h:form><h:form><TABLE><TR><TD>User ID:<h:inputText value="#{bidBean2.userID}“ id="userID"><f:validateLength minimum="5" maximum="6"/>g</h:inputText></TD><TD><h:message for="userID" tyleClass="RED"/></TD></TR><TR><TR><TD>Keyword:<h:inputText value="#{bidBean2.keyword}“ id="keyword">

f lid h i i "3"/<f:validateLength minimum="3"/></h:inputText></TD><TD><h:message for="keyword"

© SI1P1 – 2004 237/15styleClass="RED"/></TD></TR>

Page 238: Programiranje Programiranje Internet Internet aplikacija aplikacija

Početna forma<TR><TR><TD>Bid Amount:$<h:inputText value="#{bidBean2.bidAmount}“ id="amount"><f:validateDoubleRange minimum="0.10"/>g</h:inputText></TD><TD><h:message for="amount"

styleClass="RED"/></TD></TR><TR><TR><TD>Duration:<h:inputText value="#{bidBean2.bidDuration}“ id="duration"><f:validateLongRange minimum="15"/><f:validateLongRange minimum= 15 /></h:inputText></TD><TD><h:message for="duration" styleClass="RED"/>

</TD></TR><TR><TH COLSPAN=2><h:commandButton value="Send Bid!“

action="#{bidBean2.doBid}"/></TH></TR></TABLE>

© SI1P1 – 2004 238/15</TABLE>

Page 239: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 239/15

Page 240: Programiranje Programiranje Internet Internet aplikacija aplikacija

Konverzija vs validacija

I f:convertBlah i f:validateBlah proveravaju format iI f:convertBlah i f:validateBlah proveravaju format i prikazuju ponovo formu u slučaju greške– Ali f:convertBlah takođe i menja format u kome se polje j p jprikazuje– f:validateBlah ima smisla samo sa h:inputText

f l h i i l k i i i i h i i– f:convertBlah ima smisla koristiti i sa h:inputText i sa h:outputTextPrimerPrimer

<h:inputText value="#{orderBean.discountCode}"><f:convertNumber maxFractionDigits="2"/>g

</h:inputText>– Prikazuje 0.75 a ne 0.749

© SI1P1 – 2004 240/15

Page 241: Programiranje Programiranje Internet Internet aplikacija aplikacija

Atributi

f:convertNumber f:validateLengthf:convertNumber– currencyCode, currencySymbol– groupingUsed– integerOnly

f:validateLength– minimum– maximum

• f:validateLongRangeg y– locale– max(min)FractionDigits– max(min)IntegerDigits

g g– minimum– maximum

• f:validateDoubleRange– pattern (ala DecimalFormat)– type• number, currency, percentage

f:convertDateTime

– minimum– maximum

f:convertDateTime– type• date, time, both– dateStyle timeStyledateStyle, timeStyle• default, short, medium, long,full– pattern (ala SimpleDateFormat)– locale

© SI1P1 – 2004 241/15– timeZone

Page 242: Programiranje Programiranje Internet Internet aplikacija aplikacija

Uobičajene poruke o greškama

Kreira se i učita globalni properties fajlKreira se i učita globalni properties fajl<application>

<message-bundle>...</message-bundle><message bundle>...</message bundle></application>

Koristiti eksplicitna imena property-ija kao što su navedena u Messages.properties– javax.faces.component.UIInput.CONVERSION

j f t UII t REQUIRED– javax.faces.component.UIInput.REQUIREDPrimer

javax faces component UIInput CONVERSION=Illegaljavax.faces.component.UIInput.CONVERSION=Illegal format!

javax.faces.component.UIInput.REQUIRED=Missing © SI1P1 – 2004 242/15value!

Page 243: Programiranje Programiranje Internet Internet aplikacija aplikacija

Pisanje sopstvenih metoda validacijeJSPJSP– Za ulaznu komponentu eksplicitno specificirati ime metoda

<h:inputText id="someID“ validator="#{someBean.someMethod}"/>– Koristi se h:message kao i ranije– Koristi se h:message kao i ranije

<h:message for="someID"/>Java

Pomoću ValidatorException sa FacesMessage ako validacija nije– Pomoću ValidatorException sa FacesMessage ako validacija nije uspela.- Ništa ne raditi ako je validacija uspela.– Argumenti metoda:Argumenti metoda:• FacesContext– Sadržaj• UIComponent• UIComponent– Nad komponentom će se izvršiti validacija• Object

Poslata vrednost (primitive koriste omotače)© SI1P1 – 2004 243/15

– Poslata vrednost (primitive koriste omotače)

Page 244: Programiranje Programiranje Internet Internet aplikacija aplikacija

Pisanje sopstvenih metoda validacije - JSP

...<TR><TD>Bid Amount:<TD>Bid Amount:$<h:inputText value="#{bidBean2.bidAmount}"id="amount" required="true"validator="#{bidBean2.validateBidAmount}"/></TD><TD><h:message for="amount"

styleClass="RED"/></TD></TR>...

© SI1P1 – 2004 244/15

Page 245: Programiranje Programiranje Internet Internet aplikacija aplikacija

Pisanje sopstvenih metoda validacije - Javapublic void validateBidAmount(FacesContext contextpublic void validateBidAmount(FacesContext context,UIComponent componentToValidate,Object value)throws ValidatorException {throws ValidatorException {double bidAmount = ((Double)value).doubleValue();double previousHighestBid = currentHighestBid();if (bidAmount <= previousHighestBid) {if (bidAmount <= previousHighestBid) {FacesMessage message =new FacesMessage("Bid must be higher than current" +"highest bid ($" +previousHighestBid + ") ");"highest bid ($" +previousHighestBid + ").");throw new ValidatorException(message);}}}public double currentHighestBid() {return(0.23); // Get from database in real life}

© SI1P1 – 2004 245/15}

Page 246: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 246/15

Page 247: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rad sa podacima nepoznate dužine

UpotrebaUpotreba– Šta se dešava ako se na serverskoj strani kreira rezultat sa nepoznatim brojem elemenata? Kako prikazati taj rezultat

JSP t i i b š j MVC d l ?na JSP stranici, bez rušenja MVC modela?Alternative– Bez petljiBez petlji

<h:outputText value="#{bankCustomer.depositTable}"/><mytags:showDepositTable custID="..." month="..." styleClasses " "/>styleClasses="..."/>– Petlje

<% for(...) { ... %>( ) {HTML kod

<% } %>JSTL© SI1P1 – 2004 247/15• JSTL

Page 248: Programiranje Programiranje Internet Internet aplikacija aplikacija

Kreiranje HTML tabeleNekada je potrebno koristiti HTML tagove pa nije mogućeNekada je potrebno koristiti HTML tagove, pa nije moguće koristiti rešenja bez petlji– Upotrebu JSP skripleta smo već ranije eliminisali– Upotreba JSTL u okviru petlji je opcija, ali i dalje složenaUpotreba JSTL u okviru petlji je opcija, ali i dalje složenaJSF omogućava h:dataTable– Navodi se definicija za jedan red, i JSF ponavlja

<h:dataTable value="#{someBean.someCollection}“<h:dataTable value= #{someBean.someCollection} var="rowVar“ border="1">

<h:column><h:outputText value="#{rowVar.col1Data}"/><h:outputText value #{rowVar.col1Data} /></h:column><h:column><h:outputText value="#{rowVar.col2Data}"/><h:outputText value= #{rowVar.col2Data} /></h:column>...</h:dataTable>

© SI1P1 – 2004 248/15

</h:dataTable>

Page 249: Programiranje Programiranje Internet Internet aplikacija aplikacija

h:dataTable

value: kolekcija podataka (obično lista bean-ova) Legalnivalue: kolekcija podataka (obično lista bean-ova). Legalni tipovi kolekcija:

– ArrayList (A a List LinkedList)– List (ArrayList, LinkedList)

– ResultSet– Result (omotač ResultSet iz JSTL)– DataModel (u javax.faces.model)

var: okružuje svaki ulaz kolekcije– Ovja ulaz treba da bude nešto što JSF EL može da prikažeOvja ulaz treba da bude nešto što JSF EL može da prikaže• Bean, Array, List, MapDrugi atributi

Standardni TABLE atributi– Standardni TABLE atributi• border, bgcolor, width, cellpadding, cellspacing, frame, ...– Style sheet

© SI1P1 – 2004 249/15• rowClasses, headerClass, footerClass

Page 250: Programiranje Programiranje Internet Internet aplikacija aplikacija

h:column

Obično okružuju h:outputText elementeObično okružuju h:outputText elemente<h:column>

<h:outputText value="#{rowVar.colData}"/><h:outputText value #{rowVar.colData} /></h:column>

Mogu okruživati druge h:Xxxx elemente–h:inputText, ili bilo koje druge elementeRegularni HTML sadržaj mora biti u okviru f:verbatim

<h:column><f:verbatim>First Name: </f:verbatim><h:outputText value "#{rowVar firstName}"/><h:outputText value="#{rowVar.firstName}"/>

</h:column>Heading i footer tabele se specificira pomoću f:facet

© SI1P1 – 2004 250/15

Heading i footer tabele se specificira pomoću f:facet

Page 251: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer

Prikaz tabele prodaje baziranoj na podacima tipaPrikaz tabele prodaje baziranoj na podacima tipa ArrayKlasa SalesBean prezentuje prodaju jabuka i p j p j jpomorandži Niz SalesBean objekata prezentuje kvartalnu prodaju u godiniprodaju u godiniSve vrednosti će se prikazati u okviru HTML tabele

© SI1P1 – 2004 251/15

Page 252: Programiranje Programiranje Internet Internet aplikacija aplikacija

SalesBean

© SI1P1 – 2004 252/15

Page 253: Programiranje Programiranje Internet Internet aplikacija aplikacija

SalesBean

public SalesBean[] getYearlySales() {public SalesBean[] getYearlySales() {SalesBean[] yearlySales ={ new SalesBean(100.22, 200.32),{ new SalesBean(100.22, 200.32),new SalesBean(300.44, 400.55),new SalesBean(500.66, 600.77),new SalesBean(700.88, 800.99) };return(yearlySales);}

© SI1P1 – 2004 253/15

Page 254: Programiranje Programiranje Internet Internet aplikacija aplikacija

faces-config.xml

...<faces-config><managed-bean><managed bean><managed-bean-name>salesBean</managed-bean-

name><managed-bean-class>coreservlets.SalesBean

/ d b l</managed-bean-class><managed-bean-scope>session</managed-bean-

scope>scope></managed-bean>...

© SI1P1 – 2004 254/15</faces-config>

Page 255: Programiranje Programiranje Internet Internet aplikacija aplikacija

Jsp strana

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri http://java.sun.com/jsf/core prefix f %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><f:view>...<H2>Apples and Oranges</H2><h:dataTable value="#{salesBean.yearlySales}“ var="quarterlySales"border="1"><h:column><f:verbatim>$</f:verbatim><h:outputText value="#{quarterlySales.apples}"/></h:column></h:column><h:column><f:verbatim>$</f:verbatim><h:outputText value="#{quarterlySales.oranges}"/><h:outputText value= #{quarterlySales.oranges} /></h:column></h:dataTable>...

© SI1P1 – 2004 255/15</f:view>

Page 256: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 256/15

Page 257: Programiranje Programiranje Internet Internet aplikacija aplikacija

Header i footer

HeaderHeader– Koristi se f:facet sa name="header"– Vrednost može da bude f:verbatim ili h:outputText– I dalje je potrebno h:outputText za ne-heading vrednostiFooter– Koristi se f:facet sa name="footer"– Vrednost može da bude f:verbatim ili h:outputTextPrimer koda

<h:column><h:column><f:facet name="header"><f:verbatim>...</f:verbatim>

/f f</f:facet><h:outputText value="#{rowVar.colVal}"/></h:column>

© SI1P1 – 2004 257/15

Page 258: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer: prikaz mesečne prodaje

Klasa MonthlySalesBean predstavlja ime meseca iKlasa MonthlySalesBean predstavlja ime meseca i SalesBean za prodaju jabuka (pomorandži) za taj mesecArrayList predstavlja prodaju od Januara do DecembraHeadings treba da budu "Month" "Apples" iHeadings treba da budu "Month", "Apples", i "Oranges"Takođe treba koristiti tekst polja da bi se prikazali p j prezultati prodaje i da mogu da se promene

– Primer ilustruje da tabele mogu da sadrže i ulazne elemente– U primeru se ne prikazuje backend kod koji dovodi do

rezultata

© SI1P1 – 2004 258/15

Page 259: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer: bean

© SI1P1 – 2004 259/15

Page 260: Programiranje Programiranje Internet Internet aplikacija aplikacija

Primer: bean

public ArrayList getYearlySales() {public ArrayList getYearlySales() {ArrayList yearlySales = new ArrayList();yearlySales.add(new MonthlySalesBean("January", 101.11, 501.11));yearlySales.add(new MonthlySalesBean("February", 102.22, 502.22));( y ( y ))yearlySales.add(new MonthlySalesBean("March", 103.33, 503.33));...yearlySales.add(new MonthlySalesBean("November", 111.11, 511.11));

l l ddyearlySales.add(new MonthlySalesBean("December", 112.22, 512.22));return(yearlySales);

© SI1P1 – 2004 260/15}

Page 261: Programiranje Programiranje Internet Internet aplikacija aplikacija

faces-config.xml

...<faces-config><managed-bean><managed-bean-name>monthlySalesBean</managed bean name></managed-bean-name><managed-bean-class>coreservlets.MonthlySalesBeany</managed-bean-class><managed-bean-scope>session</managed-bean-

scope>scope></managed-bean>...

© SI1P1 – 2004 261/15</faces-config>

Page 262: Programiranje Programiranje Internet Internet aplikacija aplikacija

Jsp strana

<h:form><h:form><h:dataTable value="#{monthlySalesBean.yearlySales}"var="monthlySales“ border="1"><h:column><f:facet name="header"><f:verbatim>Month</f:verbatim></f:facet><h:outputText value="#{monthlySales.month}"/></h:column><h:column><f:facet name "header"><f:facet name="header"><f:verbatim>Apples</f:verbatim></f:facet><f:verbatim>$</f:verbatim><f:verbatim>$</f:verbatim><h:inputText value="#{monthlySales.salesBean.apples}"/></h:column>... Oranges ...

© SI1P1 – 2004 262/15

... Oranges ...</h:dataTable>

Page 263: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 263/15

Page 264: Programiranje Programiranje Internet Internet aplikacija aplikacija

CSS

HEADING {.HEADING {font-family: Arial, Helvetica, sans-serif;font-weight: bold;font weight: bold;font-size: 20px;color: black;background-color: silver;text-align: center;}

© SI1P1 – 2004 264/15

Page 265: Programiranje Programiranje Internet Internet aplikacija aplikacija

CSS

ROW1 {.ROW1 {font-family: Arial, Helvetica, sans-serif;font-size: 18px;color: black;background-color: white;text-indent: 20px;p}.ROW2 {font-family: Arial Helvetica sans-serif;font-family: Arial, Helvetica, sans-serif;font-size: 18px;color: white;b k d l bl kbackground-color: black;text-indent: 20px;}

© SI1P1 – 2004 265/15

Page 266: Programiranje Programiranje Internet Internet aplikacija aplikacija

JSP

<h:dataTable value="#{monthlySalesBean yearlySales}"<h:dataTable value= #{monthlySalesBean.yearlySales}var="monthlySales“ border="1"headerClass="HEADING“ rowClasses="ROW1,ROW2"><h:column><h:column><f:facet name=“header"><f:verbatim>Month</f:verbatim></f:facet></f:facet><h:outputText value="#{monthlySales.month}"/></h:column><h:column><h:column>... Apples ...</h:column><h l ><h:column>... Oranges ...</h:column>

/h d T bl© SI1P1 – 2004 266/15

</h:dataTable>

Page 267: Programiranje Programiranje Internet Internet aplikacija aplikacija

Rezultat

© SI1P1 – 2004 267/15