Professional Documents
Culture Documents
230
Plan prezentacji
Wprowadzenie do JavaServer Faces (JSF) Podstawy JavaServer Faces
Nawigacja, backing beans, jzyk wyrae JSF
Tworzenie aplikacji JSF w rodowisku JDeveloper 10g Rozbudowa aplikacji JavaServer Faces
Walidacja, konwersja, obsuga zdarze Wsparcie dla aplikacji wielojzycznych
Podsumowanie
231
Wprowadzenie
232
233
Pierwsza wczesna wersja specyfikacji (JSF 1.0 EA) we wrzeniu 2002 Ostateczna wersja 1.0 opublikowana w marcu 2004
Wraz z ni referencyjna implementacja firmy Sun Aktualna wersja JSF 1.1 Maintainance Release Trwaj prace nad JSF 1.2
234
Oracle wykorzystuje implementacj firmy Sun (wersja 1.1 w JDeveloper 10.1.3), oferujc swoj bibliotek komponentw ADF Faces
235
W zakresie wygody tworzenia oprogramowania przewaga leaa dotychczas po stronie Microsoft .NET
Dopracowane rodowisko RAD: Visual Studio Aplikacje internetowe tworzone w stylu bardzo zblionym do tradycyjnych aplikacji (WebForms)
236
237
Web Container
Interfejs uytkownika pracuje po stronie serwera i jest renderowany jako HTML wysyany klientowi Strona JSP odwouje si do komponentw interfejsu zaimplementowanych w JSF poprzez znaczniki Interfejs uytkownika zarzdza komponentami i zwizanymi z nimi walidatorami, konwerterami itp.
238
JSF dostarcza implementacj kontrolera w postaci konfigurowalnego serwletu FacesServlet JSF nie wspiera tworzenia modelu. Udostpnia jedynie mechanizmy wice obiekty modelu z pozostaymi komponentami aplikacji
239
Komponenty JSF
Podstaw specyfikacji JSF jest opis modelu komponentw interfejsu uytkownika
Zestaw standardowych, gotowych komponentw API (Application Programming Interface) do rozszerzania standardowych komponentw i projektowania zupenie nowych
240
241
242
W przypadku wersji JDeveloper 10g 10.1.2 i wczeniejszych konieczne rczne dodanie wsparcia dla JSF
Naley zarejestrowa biblioteki JSF i znacznikw JSF dla JSP oraz doda biblioteki znacznikw do palety komponentw Wymagana rczna konfiguracja plikw web.xml i faces-config.xml Brak wizualnych narzdzi do edycji regu nawigacji aplikacji JSF
243
JSF w Eclipse
Aby uzyska wsparcie dla wizualnego projektowania JSF na poziomie JDeveloper 10.1.3 naley zainstalowa wtyczk (plug-in) np. Faces IDE
244
245
Przykadowa aplikacja
Opis aplikacji:
Aplikacja obejmuje 3 strony Pierwsza strona prezentuje formularz logowania Po weryfikacji nazwy uytkownika i hasa nastpuje przekierowanie do strony informujcej o sukcesie lub niepowodzeniu logowania
246
3) Tworzony jest Java Bean zawierajcy dane z formularza (tzw. backing bean) 4) Wywoywana jest akcja zwizana z zatwierdzeniem formularza
Metoda akcji zwraca warunek
247
248
249
<!DOCTYPE web-app PUBLIC ... > <web-app> ... <!--Faces Servlet --> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1 </load-on-startup> </servlet> <!--Faces Servlet Mapping --> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> </web-app> Mapowanie rekomendowane przez specyfikacj JSF:
<url-pattern>*.faces</url-pattern> <url-pattern>/faces/*</url-pattern> <url-pattern>*.jsf</url-pattern> (domylny w JDeveloper)
250
251
Formularz logowania
login.jsp
<%@ page contentType="text/html;charset=windows-1250"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <f:view> <html> <head>...<title>Logowanie</title></head> <body><h:form> <p>Uytkownik: <h:inputText value="#{loginBean.username}" id="username"/> <p>Haso: <h:inputSecret value="#{loginBean.password}" id="password"/> <p><h:commandButton value="Zaloguj" id="submitButton" action="#{loginBean.register}"/> </h:form></body> </html> </f:view>
Strona w pliku .jsp, uruchomienie poprzez FacesServlet, URL zaley od mapowania w pliku web.xml
252
Nawigacja statyczna
login.jsp
Uwaga: Gdy cel nawigacji zaley od wprowadzonych danych, konieczna nawigacja dynamiczna
253
254
Odwoania do managed beans z poziomu kodu strony JSF realizowane s za pomoc jzyka wyrae JSF
255
Rnica polega na tym e w JSP/JSTL wyraenia su jedynie do wywietlania wartoci, a w JSF do wywietlania i ustawiania waciwoci
JSP EL wywouje tylko metody getXXX JSF EL wywouje metody getXXX i setXXX
Powysza rnica jest powodem innej notacji w JSF (#{...}) ni w JSP i JSTL (${...}) Uwagi:
Uywany tylko w atrybutach znacznikw JSF Dostp do managed beans i zasigw request, session, application
256
package view.backing; public class Login { private String username; private String password; public public public public }
faces-config.xml
void setUsername(String t) { this.username = t; } String getUsername() { return username; } void setPassword(String t) { this.password = t; } String getPassword() { return password; }
Deklaracja komponentu (dziki niej implementacja JSF sama utworzy instancj komponentu gdy bdzie potrzebna managed bean)
257
<%@ page contentType="text/html;charset=windows-1250"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <f:view> <html> <head>...<title>Logowanie</title></head> <body><h:form> <p>Uytkownik: <h:inputText value="#{loginBean.username}" id="username"/> <p>Haso: <h:inputSecret value="#{loginBean.password}" id="password"/> ... </h:form></body> </html> Po zatwierdzeniu formularza i wysaniu wprowadzonych danych </f:view> do serwera, zostan one automatycznie umieszczone we wskazanych waciwociach wskazanego komponentu Do wizania komponentw interfejsu uytkownika z waciwociami komponentu backing bean wykorzystany jzyk wyrae JSF (#{...})
258
np. <h:inputText id="uName" value="#{UserBean.userName}" /> (waciwo typu String, Integer, int, double, ...) Zalecane w wikszoci sytuacji
Automatyczne konwersje typw danych Komponent backing bean nie odwouje si do JSF API
259
<%@ page contentType="text/html;charset=windows-1250"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <f:view> <html> <head><title>Ok</title></head> <body><h:form> <p>Witaj <h:outputText value="#{loginBean.username}"/>! <p>Twoje haso to: <h:outputText value="#{loginBean.password}"/>. </h:form></body> </html> </f:view> Dostp do waciwoci komponentu backing bean za pomoc znacznika h:outputText
260
success
ok.jsp
failure
login.jsp
error.jsp
261
262
263
264
Tu mona wybra szablon uwzgldniajcy JSF, wtedy projekty dla modelu i widoku oraz plik faces-config.xml w projekcie widoku zostan utworzone automatycznie
265
Wraz z plikiem faces-config.xml tworzona jest caa struktura aplikacji webowej J2EE
<servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>
266
267
Utworzenie nowego, automatycznie zarzdzanego komponentu backing bean, z ktrego waciwociami bd wizane komponenty interfejsu na stronie (opcjonalnie)
268
login.jsp
<%@ page contentType="text/html;charset=windows-1250"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <f:view> <html> <head> <meta http-equiv="Content-Type" content="..."/> <title>login</title> </head> <body><h:form binding="#{loginBean.form1}" id="form1"></h:form></body> </html> </f:view> <%-- oracle-jdev-comment:auto-binding-backing-bean-name:loginBean--%>
269
faces-config.xml
<faces-config xmlns="http://java.sun.com/JSF/Configuration"> <managed-bean> <managed-bean-name>loginBean</managed-bean-name> <managed-bean-class>mypackage.backing.Login</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <!--oracle-jdev-comment:managed-bean-jsp-link:1login.jsp--> </managed-bean> </faces-config>
270
271
Login.java
public class Login { private HtmlForm form1; private HtmlInputText inputText1; private HtmlInputSecret inputSecret1; private HtmlCommandButton commandButton1;
backing bean z waciwociami odpowiadajcymi instancjom komponentw a nie ich wartociom! (elastyczniejsze z dwch moliwych rozwiza)
public void setForm1(HtmlForm form1) { this.form1 = form1; } public HtmlForm getForm1() { return form1; } public void setInputText1(HtmlInputText inputText1) { this.inputText1 = inputText1; } public HtmlInputText getInputText1() { return inputText1; } public void setInputSecret1(HtmlInputSecret inputSecret1) { this.inputSecret1 = inputSecret1; } public HtmlInputSecret getInputSecret1() { return inputSecret1; } public void setCommandButton1(HtmlCommandButton commandButton1) { this.commandButton1 = commandButton1; } public HtmlCommandButton getCommandButton1() { return commandButton1; } }
272
273
Pierwsza strzaka domylnie dostaje etykiet success (etykiety mona zmieni na diagramie)
faces-config.xml
<navigation-rule> <from-view-id>/login.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/ok.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>failure</from-outcome> <to-view-id>/error.jsp</to-view-id> </navigation-case> </navigation-rule>
274
Dwuklik na przycisku
Rczna edycja
... public String commandButton1_action() { String user = (String) inputText1.getValue(); String pass = (String) inputSecret1.getValue(); if (user.equals(pass)) return "success"; else return "failure"; } ...
275
Strona nie suy do wprowadzania danych, wic mona nie deklarowa dla niej komponentu backing bean Do wywietlenia danych przekazanych przez backing bean suy element h:outputText
276
Wprowadzenie wartoci #{ uaktywnia przycisk wywoujcy okno dialogowe pozwalajcy na powizanie z waciwoci komponentu backing bean (lub innego dostpnego obiektu np. powiza z modelem)
277
Gotowa aplikacja
marek/marek
marek/xxx
278
279
280
281
282
<h:inputSecret binding="#{loginBean.inputSecret1}" id="inputSecret1"> <f:validateLength maximum="6" minimum="4"/> </h:inputSecret> <h:message for="inputSecret1" binding="#{loginBean.message2}" id="message2"/>
283
Konwertery
Konwertery s uywane gdy:
Wymagana jest inna konwersja ni standardowa dokonywana automatycznie (do typw takich jak int, float, Integer, Boolean, ...) Wymagane jest zaawansowane formatowanie (liczb, dat)
Konwersja a walidacja
Konwerter moe suy do walidacji generuje wyjtek i tworzy komunikat o bdzie gdy konwersja si nie powiedzie Konwerter rwnie zmienia format wywietlania, a nie tylko konwertuje wprowadzane dane Walidatory mog by uywane tylko z komponentami do wprowadzania danych, a konwertery rwnie z h:outputText
Standardowe konwertery:
f:convertNumber, f:convertDateTime
284
Poprzez zmian wartoci atrybutu disabled mona spowodowa, e komponent nie bdzie aktywny (domylnie false)
<h:commandButton value="Zaloguj" binding="#{loginBean.commandButton1}" action="#{loginBean.commandButton1_action}" disabled="true"/> Moliwe odwoanie do metody backing bean: #{}
285
Event listeners
Czsto uruchamiane przed wypenieniem komponentu backing bean danymi i z pominiciem walidacji Nie wpywaj bezporednio na nawigacj
286
ValueChangeListener
Wywoywany przez listy rozwijane, pola wyboru, grupy radiowe, pola tekstowe, itp. Elementy te automatycznie nie zatwierdzaj formularza
Konieczne wymuszenie zatwierdzenia formularza poprzez kod JavaScript: submit() w onchange lub onclick
287
ActionListener - Przykad
Metoda obsugujca zdarzenie zwyczajowo w klasie komponentu backing bean Przypomnienie: Dla zdarze powodujcych nawigacj: atrybut action
288
Wpisanie w palecie waciwoci nazwy metody powoduje utworzenie szkieletu metody w klasie backing bean
public void checkbox1Changed(ValueChangeEvent valueChangeEvent) { // Add event code here... if (selectBooleanCheckbox1.isSelected()) commandButton1.setDisabled(false); else commandButton1.setDisabled(true); }
289
Wymagany JavaScript, aby zmiana stanu pola wyboru zatwierdzaa formularz (naley wpisa rcznie lub przez palet) Problem: Po zmianie stanu pola wyboru budzi si walidacja pl tekstowych!
290
291
loginBean scope=request
loginBean scope=session
292
293
komunikaty.properties
sorryPrompt=Sorry backLabel=Back
error.jsp
<f:view> <f:loadBundle basename="komunikaty" var="kom"/> ... <h:outputText value="#{kom.sorryPrompt}"/> <h:outputText value="#{loginBean.inputText1.value}"/>... <h:form> <h:commandButton value="#{kom.backLabel}" action="success"/> <h:commandLink action="success"> <h:outputText value="#{kom.backLabel}"/> </h:commandLink> </h:form> ... </f:view>
294
Internacjonalizacja aplikacji
Naley przygotowa zestaw plikw .properties dla poszczeglnych jzykw (rnicych si kodem lokalizacji w przyrostku nazwy):
komunikaty.properties, komunikaty_pl.properties, ...
295
sorryPrompt=Sorry backLabel=Back
UWAGA: Polskie znaki (poza ) w kostaci kodw Unicode (\uXXXX)
error.jsp
<f:view locale="#{facesContext.externalContext.request.locale}"> <f:loadBundle basename="komunikaty" var="kom"/> ... <h:outputText value="#{kom.sorryPrompt}"/> <h:outputText value="#{loginBean.inputText1.value}"/>... <h:form> <h:commandButton value="#{kom.backLabel}" action="success"/> <h:commandLink action="success"> <h:outputText value="#{kom.backLabel}"/> </h:commandLink> </h:form> ... </f:view>
Podmiana i internacjonalizacja komunikatw ze standardowych walidatorw (1/2) Naley wykona dwa kroki:
Przygotowa pliki .properties dla poszczeglnych jzykw zawierajce nowe komunikaty przypisane do predefiniowanych kluczy Wskaza przygotowane pliki jako message bundle zawierajcy dostosowane komunikaty w konfiguracji aplikacji (faces-config.xml)
komunikaty_pl.properties
296
javax.faces.component.UIInput.REQUIRED=Pole jest wymagane! javax.faces.validator.LengthValidator.MINIMUM=Minimalna wymagana liczba znakw to {0}! javax.faces.validator.LengthValidator.MAXIMUM=Maksymalna wymagana liczba znakw to {0}!
W miejsce {0} bdzie wstawiany parametr ograniczenia np. limit na liczb znakw
297
298
299
300
301
JSF umoliwia prezentacj danych tabelarycznych bez konstrukcji ptli za pomoc komponentu h:dataTable
h:dataTable zawiera definicj jednego wiersza Struktura wiersza jest powielona dla elementw kolekcji
Mona wskaza szczegln zawarto dla nagwka i stopki za pomoc elementu f:facet Mona wskaza od ktrego elementu kolekcji (numeracja od 0) i ile wierszy ma by wywietlonych (atrybuty first i rows)
302
javax.sql.RowSet javax.faces.model.DataModel
Wszystkie rda danych musz by jawnie lub niejawnie opakowane w DataModel
Podklasy ScalarDataModel, ListDataModel, ArrayDataModel, ResultSetDataModel, ResultDataModel
303
Book.java
public class Book { private String author; private String title;
public Book(String a, String t) { this.author = a; this.title = t; } public public public public } void setAuthor(String author) {...} String getAuthor() {...} void setTitle(String title) {...} String getTitle() {...}
304
faces-config.xml
<managed-bean> <managed-bean-name> booksBean </managed-bean-name> <managed-bean-class> mypackage.BooksBean </managed-bean-class> <managed-bean-scope> request </managed-bean-scope> </managed-bean>
305
Podanie klasy reprezentujcej struktur elementu kolekcji jest opcjonalne. Umoliwia kreatorowi automatyczne wypenienie zawartoci kolumn i ich nagwkw! Rczne wprowadzenie nazwy zmiennej, ktra bdzie reprezentowa kolejne elementy
306
ksiazki.jsp
h:column definuje kolumn tabeli f:facet w tabeli definiuje nagwek (header) i stopk (footer) Uwaga: Zawarto nie-JSF (np. HTML) musi by ujta w element f:verbatim, aby bya wywietlona we waciwym miejscu <h:dataTable value="#{booksBean.books}" var="book"> <h:column> <f:facet name="header"> <h:outputText value="Title"/> </f:facet> <h:outputText value="#{book.title}"/> </h:column> <h:column> <f:facet name="header"> <f:verbatim>Author</f:verbatim> </f:facet> <h:outputText value="#{book.author}"/> </h:column> </h:dataTable>
307
ksiazki.jsp
<head> <link href="css/styl.css" rel="stylesheet"/> ... </head> ... <h:dataTable value="#{booksBean.books}" var="book" rowClasses="nieparzysty, parzysty"> </h:dataTable>
308
309
faces-config.xml
<managed-bean> <managed-bean-name>empsBean</managed-bean-name> <managed-bean-class>mypackage.EmpsBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>
310
DataModel udostpnia wiersz wyniku zapytania w postaci obiektu, zawierajcego waciwoci odpowiadajce wartociom atrybutw
311
Podsumowanie
312
Nadzieja dla programistw J2EE na dorwnanie .NET w zakresie prostoty tworzenia interfejsu uytkownika w aplikacjach webowych W pewnym stopniu alternatywa dla Struts
Wykorzystuje dowiadczenia twrcw Struts i innych szkieletw aplikacji Uproszczony kontroler Ograniczone moliwoci walidacji Nacisk na interfejs uytkownika Struts i JSF mog wsppracowa
313