550 likes | 820 Views
Java Server Faces. Facilit ăţi JSF. Java Server Faces este un framework de dezvoltare Web Java care permite respectarea modelului arhitectural MVC pe partea de prezentare. JSF se sprijina pe tehnologiile precedente: Servlet, JSP Caracteristici:
E N D
Facilităţi JSF Java Server Faces este un framework de dezvoltare Web Java care permite respectarea modelului arhitectural MVC pe partea de prezentare. JSF se sprijina pe tehnologiile precedente: Servlet, JSP Caracteristici: - separarea stratului de prezentare de celelalte elemente - mapare între HTML şi obiecte din clase Java - oferă un ansamblu de componente reutilizabile şi extensibile - crează o legătură simplă între acţiunile pe partea de client şi cele pe partea de server • dă posibilitatea extinderii spre noi componente grafice • acces facil la obiecte Beans în expresii - simplificare pe partea de configurare şi de definire
Tratarea unui formular - construirea formularului in pagină JSP utilizând taguri JSF - dezvoltarea unor obiecte Bean care efectuează mapări pe valori (expresii) din cadrul formularului - furnizarea unor convertori şi validatori pentru tratarea datelor din formular - parametrizarea fişierului faces-config.xml prin declararea claselor Bean şi a regulilor de navigare - crearea paginilor JSP corespunzătoare fiecărei condiţii de retur - protejarea paginilor JSP utilizate prin contextul JSF pentru a evita accesarea acestora directa
Configurări specifice la nivelul fisierului Web.xml • tagul <contex-param> este utilizat pentru diverse configurari de functionare a JSF. Exemplu: <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> specifica statusul aplicatiei: Development, UnitTest, SystemTest, Production. Pentru Development sunt incluse, de exemplu, informatii de depanare in timp ce pentru Production, nu. • Identificarea servletului principal: <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup>//startare servlet la startup si inaintea altor servleturi </servlet>
Specificarea fisierului de configurare al aplicatiei: • parametru: javax.faces.application.CONFIG_FILES • Exemplu: /WEB-INF/faces-config.xml • Locul in care se salveaza starea curenta a interfetei aplicaţiei • Nume parametru: javax.faces.STATE_SAVING_METHOD • Valori posibile: clientsau server • Accesarea servletului central: <servlet-mapping>// prin prefixare <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet-mapping>// prin sufix <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping>
identificarea formularului de start <welcome-file-list> <welcome-file>faces/index.xhtml</welcome-file> </welcome-file-list>
Configurarea aplicatiei prin fisierul faces-config.xml • gestiunea obiectelor Bean: <managed-bean> • stabilirea regulilor de navigare: <navigation-rule> • configurarea validatorilor şi convertorilor:<validator> <converter> • gestiunea mesajelor: <message-bundle> • gestiunea resurselor: <resource-bundle>
Taguri personalizate JSF CORE - pentru gestiunea componentelor vizuale HTML - pentru componente JSF Linkuri: • http://java.sun.com/javaee/javaserverfaces/1.2_MR1/docs/tlddocs • http://www.horstmann.com/corejsf/jsf-tags.html <%@taglib uri="http://java.sun.com/jsf/core" prefix="core" %> <%@taglib uri="http://java.sun.com/jsf/html" prefix="html" %> ... <core:view> ... Utilizare componente vizuale </core:view>
Gestiunea obiectelor Bean Utilizarea obiectelor Bean in paginile JSP permite: • afisarea datelor provenind din stratul de prezentare • stocarea valorilor dintr-un formular • validarea datelor • transmiterea mesajelor pentru navigare Gestiunea obiectelor Bean se realizeaza prin fisierul de configurare faces-config.xml: - ciclul de viata al obiectului Bean (scope) - initializarea proprietatilor Clasele Bean sunt stocate in directorul WEB-INF/classes
Gestiunea Bean-urilor Declararea Bean-ului in faces-config.xml: <managed-bean> Proprietati </managed-bean> Proprietati: - numele <managed-bean-name>NumeBean</managed-bean-name> - numele clasei <managed-bean-class>pachet.ClasaBean</managed-bean-class> - durata de viata: none, application, session, request <managed-bean-scope>session</managed-bean-scope>
Gestiunea Bean-urilor. Expresii • Expresiile sunt utilizate pentru a accesa elemente ale obiectelor Bean in paginile JSP • Forma: "#{expresie}" • Expresiile sunt evaluate la momentul prezentarii paginii • Accesarea unei proprietati: "#{numeBean.proprietate}" unde proprietate este o proprietate a obiectului Bean pentru care exista metoda getProprietate() • Obiecte implicite care pot fi utilizate in expresii: • param - parametrii cererii HTTP • cookies - elemente definite in cookie-uri • facesContext - instante ale claselor FacesContext • View - instante ale claselor de componente grafice
Initializarea proprietatilor unui Bean Posibilitati de initializare: • in interiorul Bean-ului • prin intermediul faces-config.xml Initializare prin faces-config.xml: <managed-property> proprietati </managed-property> Tipuri de proprietati: • List - defineste o proprietate de tip lista • Map - defineste o proprietate de tip Map (cheie-valoare) • Value - defineste o proprietate de tip valoare
Initializarea proprietatilor • List: <managed-property> <property-name>numeProprietate</property-name> <list-entries> <value-class>numeClasa</value-class> <value>valoare_1</value> … <value>valoare_n</value> </list-entries> </managed-property>
Initializarea proprietatilor • Map: <managed-property> <property-name>numeProprietate</property-name> <map-entries> <key-class>numeClasaCheie</key-class> <value-class>numeClasaValoare</value-class> <map-entry> <key>cheie</key> <value>valoare</value> </map-entry> </map-entries> </managed-property>
Reguli de navigare • Fisierul de configurare faces-config.xml joaca rolul de controller – stabileste resursa care trebuie apelata ca urmare a primirii unui mesaj. • Mesajele sunt transmise sub forma de siruri de caractere • Se utilizeaza tagul <navigation-rule> pentru stabilirea regulilor de navigare • Tagul <from-view-id> indica formularul sursa in care este facuta cererea • Pentru fiecare valoare a mesajului este indicata o pagina de indirectare prin tagul <navigation-case>: • <from-outcome> : valoarea mesajului • <to-view-id> : formularul destinatie • Tipuri de navigare: • Statica • Dinamica
Reguli de navigare • Navigarea statica presupune cunoasterea valorii outcome la momentul scrierii JSP-ului de raspuns • Navigarea dinamica presupune identificarea valorii outcome in mod dinamic printr-un Bean
Componentele grafice JSF O componenta grafica JSF este construita pornind de la: - clase care implementeaza comportamentul si starea - clase responsabile cu redarea, care "traduc" reprezentarea grafica HTML - clase care gestioneaza relatia dintre JSP-uri si clasele Java - clase care relizeaza gestiunea evenimentelor - clase care implementeaza convertori si validatori http://java.sun.com/javaee/javaserverfaces/1.2/docs/tlddocs
Componente grafice - tagul CORE Sub tagul CORE se adauga functionalitati componentelor JSF Componente ale bibliotecii CORE: • view, subview - defineste un container pentru componetele grafice • attribute, param : adauga un atribut sau parametru la componenta • selectionitem,selectionitems : defineste unul sau mai multe elemente • convertDataTime,convertNumber : conversie de date • validator, validateDoubleRange, … : adaugare de validatori • actionListener, valueChangeListener : defineste ascultatori de evenimente
Componente grafice - tagul HTML Contine elemente de descriere a interfetei grafice a unei componente JSF Categorii de componente in biblioteca HTML: • Componente pentru citire date (input - I) • inputHiden, inputSecret, inputText, inputTextArea • selectBooleanCheckbox, selectManyCheckbox • selectManyListbox, selectManyMenu • selectOneListbox, selectOneMenu, selectOneRadio • Componente pentru scriere (output - O) • dataTable, column • message, messages • outputText, outputFormat, outputLink • graphicImage
Componente grafice - HTML • Componente de comanda si control (C) • commandButton • commandLink • Componete de grupare (R) • form • panelGroup • panelGrid
Componente grafice - HTML • In general atributele prezente in tagul HTML sunt de descriere, de prezentare si de comportament sau dinamica • Atribute de baza pentru descriere: • id : identificator de componenta • binding : stabilirea unei legaturi dintre componenta si un obiect Bean • rendered : true - componenta afisata, false componenta ascunsa • styleClass : precizeaza numele unui CSS aplicat componentei • value : valoarea componentei • valueChangeListener : asociere cu o metoda pentru schimbarea valorii • converter : nume de clasa pentru conversie • validator : nume de clasa pentru validator
Componente grafice - HTML • Atribute de baza pentru aspect si prezentare: • alt : text alternativ in cazul cand componenta nu se afiseaza • border : margine pentru componenta • disabled : dezactivarea unei componente de citire sau a unui buton • maxlength : maximul de caractere pentru o componenta text • readonly : modul de lectura • size : marimea unui camp text • style : informatii de stil • target : numele formularului in care documentul este deschis
Componente grafice - HTML Atribute de comportament si dinamica (DHTML): • onblur : pierderea focusului • onClick, ondblClick : click sau dublu clik asupra elementului • onfocus : obtinerea focusului • onkeydown, onkeyup, onkeypress : tastare • onmousedown, onmouseup : click • onmouseout, onmouseover : intrare/iesire zona • onreset : formularul este initializat • onselect : text selectat intr-un camp text • onsubmit : formularul este trimis
<html:panelGrid> • organizarea de tip grila a componentelor • componentele sunt adaugate la rand conform grilei • Atribute: • columns : numarul de coloane al grilei • bgcolor : culoarea de fond • cellpading, cellspacing : spatii intre celule • border : bordura din jurul grilei • Poate tine taguri <html:panelGroup> pentru gruparea mai multor componente intr-o celula
<html:dataTable> • Se utilizeaza cand numarul de elemente nu se cunoaste dinainte • Datele sunt furnizate de obiectele Bean • Atribute: • value : o colectie de date (List, ResultSet, …) • var : nume dat variabilei prin care se furnizeaza liniile • border, bgcolor, width : atribute de afisare • rowClasses, headerClass : atribute gestionate prin stiluri CSS • Pentru fiecare coloana se trece un tag <html:column> • Tratarea diferita a elementelor header si footer se face prin inserarea tagului <core:facet> • Componenta poate avea si date de intrare (exp: inputText)
<h:dataTable value="#{bean.listaObiecte}" var=“beanObiect" border="2"> <h:column> <f:facet name="header"> <h:outputText value="TitluColoana1"/> </f:facet> <h:outputText value="#{beanObiect.expresieColoana1}"/> </h:column> ... </h:dataTable>
Componente de tip selectie • Contin tagurile: <core:selectItem>, <core:selectItems> - sunt utilizate pentru specificarea unuia sau tuturor elementelor • Atribute <core:selectItem>: • value - referinta la o valoare de tip SelectItem furnizata printr-un obiect Bean • itemValue - valoarea afisata • Atributul value al tagului <core:selectItems> contine referinta la structura de tip SelectItem furnizata printr-un obiect Bean (colectie, tablou)
Componente grafice - API JSF • Componentele grafice fac parte dintr-o ierarhie care are ca radacina clasa UIComponent • Implementarile de baza sunt realizate in UIComponentBase • Servicii furnizate prin UIComponentBase: • API pentru gestiunea ciclului de viata al componentelor • API pentru redarea grafica
FacesContext • FacesContext permite accesul la toate informatiile contextuale asociate cererii si raspunsului • FacesContext este definit printr-o clasa abstracta a carei instantiere se poate face face de la inceputul ciclului de viata a unei cereri JSF • La incheierea procesului de tratare a cererii, obiectul FacesContext elibereaza resursele alocate, instanta la obiect fiind conservata • La fiecare noua cerere instanta FacesContext este reutilizata • Facilitati FacesContext: • accesul la elemente ale cererii si raspunsului • stocarea mesajelor • acces la radacina arborelui de componente • modificarea ciclului de viata a cererii
Gestiunea mesajelor • API-ul JSF furnizează obiecteFacesMessage pentru crearea de mesaje care pot fi afisate intr-o pagina JSP • Un obiet FacesMessage este caracterizat prin: • Tip: SEVERITY_INFO, SEVERITY_WARN, SEVERITY_ERROR si SEVERIRY_FATAL • Descriere : text scurt pentru descriere • Detalii : text pentru descrierea mai detaliata • Metode de acces: • setSeverity(FacesMessage.Severity) / getSeverity() • setSummary(String) / getSummary() • setDetail(String) / getDetail()
Pentru exploatarea mesajelor intr-o pagina JSP ele trebuie transmise prin contextul curent JSF (FacesContext): • addMessage(String id, FacesMessage message); // adauga un mesaj la o componenta definita prin id. daca id este null mesajul nu este asociat niciunei componente Exemplu: FacesMessage myFacesMessage = new FacesMessage(); myFacesMessage.setSeverity(FacesMessage.SEVERITY_INFO); myFacesMessage.setSummary("Un scurt mesaj"); myFacesMessage.setDetail("Mai multe detalii"); // Transmitere FacesContext myFacesContext = FacesContext.getCurrentInstance(); myFacesContext.addMessage(null, myFacesMessage);
Biblioteca HTML propune doua taguri pentru afisarea mesajelor: • <html:messages> : afisarea tuturor mesajelor • <html:message> : afisarea mesajelor asociate unui id de componenta • Tagurile contin atributele urmatoare: • for : indica id-ul componentei (unic pe mesaj) • showDetail : boolean care precizeaza daca mesajul este detaliat • showSummary : boolean care precizeaza daca mesajul este scurt • tooltip : boolean care precizeaza daca este afisat un text de ajutor • layout : precizeaza maniera de afisare a mesajelor. Valori posibile: table sau list (implicit) Exemplu: <core:view> <html:form> <html:messages showDetail="true" layout="table" showSummary="true"/><br> ... </html:form> </core:view>
Convertori • convertorii asigura conversia datelor de la sir de caractere la tipurile de date din obiectele Bean • Pentru a utiliza un convertor : • fie se utilizeaza standardele furnizate de biblioteca JSF intr-o pagina JSP • fie le definim programatic (intr-un Bean) si le utilizam in JSP-uri • Convertorii standard ai bibliotecii JSF : • core:convertDateTime : pentru conversia de date • core:convertNumber : pentru conversia de numar
tagul core:convertNumber permite conversia de la sir de caractere la valori numerice • se utilizeaza in corpul unui tag JSF • Atribute disponibile: • type : tip de valoare (numar, currency, procent) • pattern : sablon de formatare • (max/min)FractionDigits : (int) numar maxim/minim de zecimale • (max/min)IntegerDigits : (int) numar maxim/minim la partea intreaga • integerOnly : (boolean) se tine cont doar de partea intreaga • groupingUsed : (boolean) precizeaza utilizarea caractarelor de grupare (exemple : « , », « ; », « : », … ) • locale : defineste conversii pentru locale • currencyCode : codul monedei • currencySymbol : caractere pentru currencyCode
Exemplu <f:view> <h:form> <h:outputText value="#{beanConverter1.pret}"> <f:convertNumber type="currency" currencyCode="RON" minFractionDigits="4" /> </h:outputText> </h:form> </f:view> public class BeanConverter1 { private double pret; public BeanConverter1() { this.pret = 50.50; } public double getPret() { return pret; } public void setPret(double pret) { this.pret = pret; } }
tagul core:convertDateTime permite conversia de la sir de caractere la valori de tip data • Atribute disponibile: type : tipul de valoare (date, time, both) dateStyle : stilul de data (short, medium, long, full) timeStyle : stilul utilizat pentru ora (short, medium, long, full) Pattern : sablonul utilizat pentru data Locale : informatia de tip locale
<f:view> <h:form> <h:outputText value="Nume : " /> <h:inputText value="#{beanConverter2.nume}" /><br> <h:outputText value="Numar de tichete: " /> <h:inputText value="#{beanConverter2.tichete}" > <f:convertNumber type="number" integerOnly="true" /> </h:inputText><br> <h:outputText value="Data : " /> <h:inputText value="#{beanConverter2.data}"> <f:convertDateTime type="date" dateStyle="medium" /> </h:inputText> <h:commandButton value="Validare" /> </h:form> </f:view>
import java.util.*; public class BeanConverter2 { private int tichete; private String nume; private Date data; public BeanConverter2(){ tichete=2; nume="Popescu"; data=new Date();} public int getTichete() { return tichete; } public void setTichete(int tichete) { this.tichete = tichete; } public String getNume() { return nume; } public void setNume(String nume) { this.nume = nume; } public Date getData() { return data; } public void setData(Date data) { this.data = data; } }
Validatori • Validatorii sunt utilizati de componentele care implementeaza interfata EditableValueHolder • Un obiect EditableValueHolder asociaza un obiect Validator pentru efectuarea validarilor public interface Validator extends java.util.EventListener • Implementari: DoubleRangeValidator, LengthValidator , LongRangeValidator , MethodExpressionValidator • Un validator personalizat se realizeaza prin implementarea metodei: validate(FacesContext ct, UIComponent component, Object value) throws ValidatorException
Exemplu validatori standard <h:form> <p> <h:outputText value="CNP (13 cifre) : " /> <h:inputText id="cnp" value="#{beanValidator1.cnp}" > <f:validateLength maximum="13" minimum="13" /> <f:validateDoubleRange minimum="1000000000000" maximum="3000000000000" /> </h:inputText> <h:message for="cnp" /> <h:commandButton value="Trimite" /> </p> </h:form> public class BeanValidator1 { private String cnp; public BeanValidator1(){ } public String getCnp() { return cnp; } public void setCnp(String cnp) { this.cnp = cnp; } }
Ciclul de viata JSF Restore View - construieste radacina arborelui de componente aferenta ferestrei curente. Sunt inregistrate evenimentele si validatorii asociati Apply Request Values - se determina pentru fiecare componeta parametrii corespunzatori din cerere. Parametrii de tip nonsir sunt convertiti automat. Erorile de conversie sunt notificate prin FacesContext Process Validation - invocarea metodelor de validare inregistrate la Restore View. Invalidarile sunt notificate prin FacesContext Update Model Values - se executa metoda updateModel() pentru fiecare componenta legata prin proprietatea binding de un obiect Java. Erorile de conversie sunt notificate prin FacesContext Invoke Application - este procesata cererea propriuzisa si se determina pagina urmatoare Render Response - servletul central creaza un arbore de componente JSF aferent raspunsului (se utilizeaza taguri JSF)