Prin obiecte custom intelegem convertori, validatori sau componete custom. Un convertor custom este aplicat unei componente prin una dintre urmatoarele modalitati: Referim convertorul prin atributul converter al tag-ului componenta Inseram un tag converter in interiorul tag-ului componenta si referim custom convertorul printr-unul dintre atributele tagului convertor Un validator custom este aplicat unei componente intr-unul dintre urmatoarele moduri: Inseram un tag validator in tag-ul componenta si referim custom validatorul din el Inseram un tag validator custom in tagul componenta Pentru a utiliza o componenta custom adaugam tag-ul asociat componentei la paginia. Fisierele TL sunt stocate in directorul WEB-INF, in subdirectorul fisierului !"R, in directorul META-INF sau intr-un subdirector a unei bibiloteci de tag-uri impac#etate in fisierul $"R. Legarea unui component value de o proprietate %e face specificand numele bean-ului si al proprietatii folosind atributul value. "ceasta inseamna ca numele beanului din &L trebuie sa se potriveasca elementului managed-bean- name al declaratiei managed beanului, din prima parte a e'presiei (pina la punct). *ea de-a doua parte a e'presiei trebuie sa coincida cu elementul property-name corespunzator, din fisierul de configuratie al aplicatiei. "tributul value poate fi legat si de un obiect implicit, spre e'emplu obiectul e sesiune (sessionScope). +biectele implicite la care poate referi atributul sunt prezentate in tabelul urmator. Toate obiectele, e'ceptandu-le pe cele scope sunt read-onl, si de aceea nu pot fi utilizate de componente UIInput. Legarea unei instante a componentei de o proprietate a beanului %e face prin atributul binding. "cest mod de legare este recomandat atunci cand beanul trebuie sa sc#imbe dinamic atributului componetei. Facelet-uri Componente compuse Termenul de facelet se refera la un limba- de vie. folosit de catre $%F. In versiunile anterioare $%F (inainte de /.0) $%P era folosit pentru prezentare, dar acesta nu suporta toate facilitatile din $%F /.0. Facelet utilizeaza stilul de lucru al template-urilor 1T2L. Facilitatile facelet include: Utilizeaza 31T2L pentru a crea pagini .eb %uport pentru librariile de tag-uri facelet alaturi de taguri faces si $%TL %uport pentru &L Folosirea sabloanelor (template-urilor) pentru componente si pagini "vanta-ele folosirii facelet-urilor: Reutilizarea codului prin folosirea template-urilor si a componentelor compuse (composite components) &'tensibilitatea componentelor prin customizare Timp de compilare redus 4alidarea &L la compilare Renderizare de inalta performanta Fisierele facelet au e'tensia .!tml si folosesc 32L namespace declarations. Tag-urile suportate de facelet sunt date in tabelul de mai -os. "plicatiile $/&& sufereau de e'cesive configurari 32L. $/&& 5 a redus considerabil aceste configurari. In $/&& 6 reducerea s-a facut si mai mult facand fisierul de configurare "aces- con"ig.ml optional. 2anaged bean-urile pot fi configurate prin anotatia #ManagedBean, fara a mai folosi "aces- con"ig.ml. e asemenea, pentru navigare e'ista o conventie: daca valoarea atributului action a unui command lin7 sau command button este numele unui facelet (mai putin e'tensia), atunci, prin conventie, aplicatia va naviga catre acea pagina. $%F / introduce o localizare standard a resurselor. Resursele reprezinta artifact-e pe care o pagina sau o componenta $%F le foloseste pentru a fi redate corect. %pre e'emplu: fisiere *%%, fisiere $ava%cript sau imagini. In $%F / resursele pot fi plasate intr-un subdirector numit resources fie la radacina fisierului !"R, fie sub 2&T"-I8F. Prin conventie, componentele $%F stiu ca trebuie sa-si ia resursele din una dintre aceste locatii. 2ai mult, pentru a organiza resursele directorul resources va fi impartit in subdirectoare. Un subdirector va fi referit in atributul library al componentei $%F. %pre e'emplu, vom plasa fisierul de stiluri style.css in resources$css$. In pagina $%F putem obtine fisierul prin tagul: %!&outputStyles!eet library()css) name()style.css)$*. In mod asemanator cream subdirectoarele images sau scripts. Una dintre facilitatile importante ale $%F / este furnizarea de instrumente pentru implementarea unor interfete usor de e'tins si reutilizat. Template-urile ne permit sa creem 9baze: pentru alte pagini din aplicatie. Template-urile ne a-uta sa mentinem un loo7 and feel standard intr-o aplicatie cu un numar mare de pagini. Tagurile Facelet utilizate la template-uri sunt prezentate in tabelul urmator: Tag-ul principal al bibliotecii Facelet este ui&insert. + pagina template ce a fost creata cu acest tag ne permite sa definim o structura predefinita pentru o pagina si este folosita ca sablon pentru alte pagini, denumite frecvent pagini client. Fie urmatorul e'emplu: %+,-.T/0E !tml 0UB1I. )-$$W2.$$,T, 34TM1 5.6 Transitional$$EN) )!ttp&$$777.72.org$T8$!tml5$,T,$!tml5-transitional.dtd)* %!tml mlns("http://www.w3.org/1999/xhtml" mlns&ui("http://java.sun.com/jsf/facelets"* %!ead* %title* %ui&insert name("title"* titlu %$ui&insert* %$title* %$!ead* %body* %div id("header"* %ui&insert name("header"* %ui&include src("header.xhtml"$* %$ui&insert* %$div* %div id("content"* %ui&insert name("content"* %$ui&insert* %$div* %div id("footer"* %ui&insert name("footer"* %ui&include src("footer.xhtml"$* %$ui&insert* %$div* %$body* %$!tml* Fisierul precedent, basicTemplate.!tml este salvat in directorul WEB-INF$template. Pagina este impartita in trei sectiuni: #eader, content si footer ce formeaza o structura ce poate fi reutilizata de alte pagini ale aplicatiei. Fisierele !eader.!tml si "ooter.!tml sunt situate in acelasi director: %9ml version("1.0" encoding("IS!""#9!1" 9* %+,-.T/0E !tml 0UB1I. )-$$W2.$$,T, 34TM1 5.6 Transitional$$EN) )!ttp&$$777.72.org$T8$!tml5$,T,$!tml5-transitional.dtd)* %!tml mlns("http://www.w3.org/1999/xhtml"* %body* %div style("width:100$%font!si&e:3'px%line! height:("px%)ac*ground!color:nav+%color:white"* primul !eader %$div* %$body* %$!tml* Respectiv: %9ml version("1.0" encoding("IS!""#9!1" 9* %+,-.T/0E !tml 0UB1I. )-$$W2.$$,T, 34TM1 5.6 Transitional$$EN) )!ttp&$$777.72.org$T8$!tml5$,T,$!tml5-transitional.dtd)* %!tml mlns("http://www.w3.org/1999/xhtml"* %body* %div style(")ac*ground!color:nav+%width:100$%color:white"* %br $* %$div* %$body* %$!tml* Pagina client invoca template-ul prin tag-ul ui&composition. In e'emplul nostru vom crea o pagina, login.!tml, ce foloseste template-ul anterior creat: %+,-.T/0E !tml 0UB1I. )-$$W2.$$,T, 34TM1 5.6 Transitional$$EN) )!ttp&$$777.72.org$T8$!tml5$,T,$!tml5-transitional.dtd)* %!tml mlns("http://www.w3.org/1999/xhtml" mlns&ui("http://java.sun.com/jsf/facelets" mlns&!("http://java.sun.com/jsf/html" mlns&"("http://java.sun.com/jsf/core"* %ui&composition template("/,-.!I/0/template/)asic1emplate.xhtml"* %ui&de"ine name("content"* %!&"orm* %!&grap!icImage library("images" name("du*e.gif"*%$!&grap!icImage* %!:* 4ei; sunt ,u<e+ Ma gandesc la un numar intre =>userNumberBean.minimum? si =>userNumberBean.maimum?. 0oti sa-l g!icesti9 %$!:* %!&inputTet id("user/o" value("23user/um)er.ean.user/um)er4"* %"&validate1ong8ange minimum("23user/um)er.ean.minimum4" maimum("23user/um)er.ean.maximum4"$* %$!&inputTet* %!&commandButton id("su)mit" value("1rimite" action("response.xhtml"$* %!&message s!o7Summary("true" s!o7,etail("false" style("color: red% font!famil+: 6/ew 7entur+ School)oo*68 serif% font!st+le: o)li9ue% text! decoration: overline" id("errors1" "or("user/o"$* %$!&"orm* %$ui&de"ine* %$ui&composition* %$!tml* ;eanul ce controleaza aplicatia este: pac<age beans@ import Aava.util.8andom@ import Aava."aces.bean.ManagedBean@ import Aava."aces.bean.SessionScoped@ #ManagedBean #SessionScoped public class UserNumberBean > Integer randomInt ( null@ Integer userNumber ( null@ String response ( null@ private long maimum(56@ private long minimum(6@ public UserNumberBeanBC > 8andom randomD8 ( ne7 8andomBC@ randomInt ( ne7 IntegerBrandomD8.netIntB56CC@ System.out.printlnB)Numarul lui ,u<e este& ) E randomIntC@ ? public void setUserNumberBInteger userFnumberC > userNumber ( userFnumber@ ? public Integer getUserNumberBC > return userNumber@ ? public String get8esponseBC > i" BBuserNumber +( nullC GG BuserNumber.compareToBrandomIntC (( 6CC > return )Asta-i+)@ ? i" BuserNumber (( nullC > return null@ ? else > return )ScuHe; ) E userNumber E ) este incorect+)@ ? ? public long getMaimumBC > return Bt!is.maimumC@ ? public void setMaimumBlong maimumC > t!is.maimum ( maimum@ ? public long getMinimumBC > return Bt!is.minimumC@ ? public void setMinimumBlong minimumC > t!is.minimum ( minimum@ ? ? $%F / ofera conceptul de componenta compusa. + componenta compusa este un tip special de template ce actioneaza ca o componenta. + componenta compusa consta dintr-o colectie de taguri. *omponenta aceasta, creata de utilizator si reutilizabila are o functionalitate definita si poate contine validatori, convertori sau listeneri atasate. Folosind facilitatile de identificare a resurselor componentele compuse pot fi stocate in biblioteci disponibile aplicatiei. *ateva dintre cele mai utilizate taguri pentru gestionarea componentelor compuse sunt date intr-un tabel mai -os. In e'emplul urmator prezentam o componenta compusa: %+,-.T/0E !tml 0UB1I. )-$$W2.$$,T, 34TM1 5.6 Transitional$$EN) )!ttp&$$777.72.org$T8$!tml5$,T,$!tml5-transitional.dtd)* %!tml mlns("http://www.w3.org/1999/xhtml" mlns&composite("http://java.sun.com/jsf/composite" mlns&!("http://java.sun.com/jsf/html"* %!&!ead* %title*T!is content 7ill not be displayed%$title* %$!&!ead* %!&body* %composite&inter"ace* %composite&attribute name("name:rompt" de"ault("username"$* %composite&attribute name("password:rompt" de"ault("password"$* %composite&attribute name("login.utton1ext" de"ault("login"$* %composite&attribute name("login;ction" met!od- signature("java.lang.String action<="$* %$composite&inter"ace* %composite&implementation* %!&"orm id("form"* %!&messages style("color: red%"*%$!&messages* %!&panelDrid columns(">"* =>cc.attrs.name0rompt? %!&inputTet id("name" value("23cc.attrs.m+login.name4" reIuired("true"$* =>cc.attrs.pass7ord0rompt? %!&inputSecret id("password" value("23cc.attrs.m+login.password4" reIuired("true"$* %$!&panelDrid* %p* %!&commandButton id("login.utton" value("23cc.attrs.login.utton1ext4" action("23cc.attrs.login;ction4"$* %$p* %$!&"orm* %$composite&implementation* %$!&body* %$!tml* In aplicatie avem mai multe valori date de &L sub forma =>cc.attrs.numeAtribut?. cc in $%F este un cuvant rezervat pentru componente compuse. &'presia anterioara este utilizata pentru a accesa atributele definite de interfata componentei compuse. In cazul general al discutie atributul accesat este numeAtribut. Fisierul anterior, email.!tml, este salvat in directorul resources$emcomp. irectorul este considerat o biblioteca a $%F si o componenta poate fi accesta dintr-o astfel de biblioteca. Pagina .eb ce utilizeaza aceasta aceasta componenta este numita using page. Pagina trebuie sa includa o referinta la componenta compusa in spatiul declaratiilor de nume 'ml, mlns&eH("http://java.sun.com/jsf/composite/emcomp/. *omponenta in sine este accesata prin tagul eH&email. %+,-.T/0E !tml 0UB1I. )-$$W2.$$,T, 34TM1 5.6 Transitional$$EN) )!ttp&$$777.72.org$T8$!tml5$,T,$!tml5-transitional.dtd)* %!tml mlns("http://www.w3.org/1999/xhtml" mlns&!("http://java.sun.com/jsf/html" mlns&eH("http://java.sun.com/jsf/composite/emcomp/"* %!&!ead* %title*.omponenta compusa%$title* %$!&!ead* %body* %div id("compositecomponent"* %eH&email mylogin("23m+login.ean4" loginAction("23m+login.ean.login4"* %$eH&email* %$div* %$body* %$!tml* Atributele unei componente compuse Putem defini un atribut al unei componente compuse prin utilizarea tag-ului composite&attribute. "tributele cele mai utilizate ale acestui tag sunt: Invocarea unui bacing bean Pentru a permite unei componente sa manipuleze date stocate pe server putem invoca un bac7ing bean prin una dintre urmatoarele modalitati: Trimitem referinta managed beanului componentei compuse Folosim direct proprietatile managed beanului $%F furnizeaza urmatoarele tag-uri pentru validarea valorilor componentelor de intrare. "ceste taguri pot fi folosite cu tagurile composite&Jalue4older sau composite&EditableJalue4older. Urmatoarele taguri de validare sunt frecvent folosite: In cazul e'emplului managed beanul este: pac<age beans@ import Aava."aces.bean.ManagedBean@ import Aava."aces.bean.8eIuestScoped@ #ManagedBean #8eIuestScoped public class MyloginBean > private String name@ private String pass7ord@ public MyloginBeanBC > t!is.name ( ))@ t!is.pass7ord ( ))@ ? public MyloginBeanBString name; String pass7ordC > t!is.name ( name@ t!is.pass7ord ( pass7ord@ ? public String get0ass7ordBC > return pass7ord@ ? public void set0ass7ordBString ne7JalueC > pass7ord ( ne7Jalue@ ? public String getNameBC > return name@ ? public void setNameBString ne7JalueC > name ( ne7Jalue@ ? public String loginBC > String msg ( )Numele de utiliHator& ) E getNameBC E ) parola& ) E get0ass7ordBC@ System.out.printlnB)MesaA& )EmsgC@ return msg@ ? ? *omponenta compusa creata in e'emplu accepta un username si o parola. *omponenta interactioneaza cu un managed bean, care stoc#eaza cele doua valori si trimite datele de la bean, afisandu-le in pagina 1ogin. 8oi, in e'emplu, nu am afisat pagina, dar am trimis in server.log mesa-ele preluate de pe using page. *omponenta compusa este stocata intr-un fisier '#tml. "re o sectiune composite:interface ce declara etic#ete username, parola si un buton de logare. e asemenea, declara un managed bean ale carui proprietati au fost folosite pentru interactiunea cu campurile username si parola.