tworzenie aplikacji j2ee w technologii javaserver faces (jsf)kolos.math.uni.lodz.pl/~archive/java...
TRANSCRIPT
229
Tworzenie aplikacji J2EE Tworzenie aplikacji J2EE w technologii w technologii JavaServer FacesJavaServer Faces
(JSF)(JSF)
230
Plan prezentacjiPlan prezentacji
• Wprowadzenie do JavaServer Faces (JSF)• Podstawy JavaServer Faces
– Nawigacja, backing beans, język wyrażeń JSF
• Tworzenie aplikacji JSF w środowisku JDeveloper 10g• Rozbudowa aplikacji JavaServer Faces
– Walidacja, konwersja, obsługa zdarzeń– Wsparcie dla aplikacji wielojęzycznych
• Tworzenie aplikacji bazodanowych w JavaServer Faces– Prezentowanie danych tabelarycznych– Dostęp do wyników zapytań
• Podsumowanie
232
Czym jest Czym jest JavaServer FacesJavaServer Faces (JSF)?(JSF)?
• Wg firmy Sun: „server-side user interface component framework for Java technology-based web applications”
• Główne elementy technologii JSF to:– API do reprezentowania komponentów interfejsu
użytkownika i zarządzania ich stanem, obsługi zdarzeń, walidacji po stronie serwera, definiowania nawigacji między stronami, wspierania aplikacji wielojęzycznych
– Dwie biblioteki znaczników dla JavaServer Pages (JSP)• Do odwoływania się do komponentów interfejsu użytkownika ze
stron JSP• Do wiązania komponentów z obiektami po stronie serwera
233
Historia Historia JavaServer FacesJavaServer Faces
• Jedna z młodszych specyfikacji w ramach J2EE• Opracowana w ramach Java Community Process jako JSR
127 (Java Specification Request) przez grupę ekspertów wywodzących się z projektów:– Jakarta Struts (w tym Craig McClanahan – twórca Struts)– Oracle Application Server, Sun Java Studio, IBM WebSphere
Studio, ATG, ...
• Pierwsza wczesna wersja specyfikacji (JSF 1.0 EA) we wrześniu 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
234Specyfikacja, implementacje Specyfikacja, implementacje i biblioteki komponenti biblioteki komponentóów JSFw JSF
• Technologię JavaServer Faces definiuje specyfikacja firmy Sun jako część J2EE
• Do tworzenia i uruchamiania aplikacji korzystających opartych o technologię JSF konieczna jest implementacja JSF– JavaServer Faces RI (referencyjna implementacja Sun)– Apache MyFaces (http://myfaces.apache.org)
• Dostępne biblioteki komponentów JSF:– Dodatkowe komponenty MyFaces– Oracle ADF Faces (podarowane Apache Software Foundation)
• Oracle wykorzystuje implementację firmy Sun (wersja 1.1 w JDeveloper 10.1.3), oferując swoją bibliotekękomponentów ADF Faces
235
Nadzieje wiNadzieje wiąązane z JSF (1/2)zane z JSF (1/2)
• Zalety platformy J2EE w porównaniu z .NET:– Niezależność od konkretnego producenta – Dostępność narzędzi i serwerów open source
• W zakresie wygody tworzenia oprogramowania przewaga leżała dotychczas po stronie Microsoft .NET– Dopracowane środowisko RAD: Visual Studio– Aplikacje internetowe tworzone w stylu bardzo
zbliżonym do tradycyjnych aplikacji (WebForms)
236
Nadzieje wiNadzieje wiąązane z JSF (2/2)zane z JSF (2/2)
• Technologia JSF jest standardem, który w połączeniu ze wspierającymi go środowiskami IDE ma ułatwić i ustandaryzować tworzenie interfejsu użytkownika w aplikacjach J2EE– Koncepcja JSF zbliżona do WebForms w .NET– JSF jako standard ma szanse na większe wsparcie przez
dostawców narzędzi programistycznych niż inne proponowane szkielety aplikacji J2EE
• Popularne opinie o JSF:– „rapid user-interface development brought to Java”– „Swing for server-side applications”– „combination of Swing and Struts”
237JSF JSF –– Interfejs uInterfejs użżytkownika po stronie ytkownika po stronie
serweraserwera
• Interfejs użytkownika pracuje po stronie serwera i jest „renderowany” jako HTML wysyłany klientowi
• Strona JSP odwołuje się do komponentów interfejsu zaimplementowanych w JSF poprzez znaczniki
• Interfejs użytkownika zarządza komponentami i związanymi z nimi walidatorami, konwerterami itp.
Browser Web Container
page.jsp
jsfUI
HTTP request
HTTP response
renders HTML
238
JSF jako implementacja idei MVCJSF jako implementacja idei MVC
• Głównym zadaniem JSF jest dostarczenie modelu komponentów do tworzenia interfejsu użytkownika (widoku)– Komponenty konfigurowalne, rozszerzalne, stanowe i niezależne
od technologii prezentacji– Gotowe komponenty + możliwość tworzenia własnych– JSP jako podstawowe środowisko „renderowania”
komponentów JSF• Każda implementacja JSF musi wspierać JSP
• JSF dostarcza implementację kontrolera w postaci konfigurowalnego serwletu FacesServlet
• JSF nie wspiera tworzenia modelu. Udostępnia jedynie mechanizmy wiążące obiekty modelu z pozostałymi komponentami aplikacji
239
Komponenty JSFKomponenty JSF
• Podstawą specyfikacji JSF jest opis modelu komponentów interfejsu użytkownika– Zestaw standardowych, gotowych komponentów– API (Application Programming Interface) do rozszerzania
standardowych komponentów i projektowania zupełnie nowych
• Przykłady standardowych komponentów:– UIRoot – korzeń drzewa komponentów interfejsu– UIForm – formularz do przesyłania danych do aplikacji– Proste komponenty interjejsu np. UIInput, UICommand,
UISelectBoolean, ...– Złożone komponenty interfejsu np. UIData - tabele
• Każdy komponent interfejsu użytkownika może byćuzupełniony o mechanizmy:– Konwersji i walidacji– Obsługi zdarzeń i błędów
240
Relacje JSF z JSP i Relacje JSF z JSP i StrutsStruts
• JSF nie wymaga JSP jako technologii widoku, ale JSP jest domyślną technologią do renderowania komponentów JSF– Każda implementacja JSF musi posiadać wsparcie dla JSP– Definiowane przez specyfikację biblioteki znaczników JSF dla JSP
ułatwiają i standaryzują korzystanie z JSF w połączeniu z JSP– Renderowanie komponentów JSF możliwe również np. w Velocity– JSF zakłada wersję JSP 1.2, współpracuje z JSP 2.0, ale dopiero
przyszłe wersje JSF będą wykorzystywać możliwości JSP 2.0
• Funkcjonalność JSF pokrywa się ze Struts w zakresie obsługi nawigacji i walidacji– JSF uproszczone w porównaniu ze Struts– JSF i Struts mogą (i zakłada się, że często będą!) współpracować
w ramach jednej aplikacji: • JSF wykorzystane do komponentów interfejsu użytkownika• Struts jako szkielet całej aplikacji do obsługi nawigacji
241
PorPoróównanie JSF i wnanie JSF i StrutsStruts
• Inny cel, choć funkcjonalność się nakłada:– Struts - Java web application framework– JSF - user-interface framework for Java web applications
• Zalety JSF w porównaniu ze Struts:– Model komponentów interfejsu użytkownika– Prostszy kontroler i prostsza konfiguracja aplikacji– Lepszy, zwięzły język wyrażeń– Większa szansa na wsparcie ze strony narzędzi IDE– Wsparcie dla innych technologii prezentacji niż HTML (np. dla PDA)
• Wady JSF w porównaniu ze Struts– Słabsze standardowe komponenty walidujące– Brak aplikacji startowej (na wzór struts-blank)– Brak walidacji po stronie klienta (jak oparta o JavaScript w Struts)– Struts już ma dobrą pozycję na rynku, JSF dopiero „się przebija”
242
JSF w JSF w Oracle JDeveloperOracle JDeveloper 10g10g
• Pełne wsparcie dla JSF w wersji JDeveloper 10g 10.1.3:– Domyślnie implementacja Sun JavaServer Faces RI– Możliwość wykorzystania implementacji MyFaces– Biblioteka komponentów Oracle ADF Faces– Wizualny edytor nawigacji, wsparcie dla edycji i generacja plików
konfiguracyjnych, palety komponentów ze znacznikami JSF dla JSP
• W przypadku wersji JDeveloper 10g 10.1.2 i wcześniejszych konieczne ręczne dodanie wsparcia dla JSF– Należy zarejestrować biblioteki JSF i znaczników JSF dla JSP oraz
dodać biblioteki znaczników do palety komponentów– Wymagana „ręczna” konfiguracja plików web.xml
i faces-config.xml– Brak wizualnych narzędzi do edycji reguł nawigacji aplikacji JSF
243
JSF w JSF w EclipseEclipse
• Aby uzyskać wsparcie dla wizualnego projektowania JSF na poziomie JDeveloper 10.1.3 należy zainstalować wtyczkę (plug-in) np. Faces IDE
244
Podstawy Podstawy JavaServer FacesJavaServer Faces
-- nawigacjanawigacja-- backing beansbacking beans, , managed beansmanaged beans
-- jjęęzyk wyrazyk wyrażżeeńń JSFJSF
245
PrzykPrzykłładowa aplikacjaadowa aplikacja
• Opis aplikacji:– Aplikacja obejmuje 3 strony– Pierwsza strona prezentuje formularz logowania– Po weryfikacji nazwy użytkownika i hasła następuje przekierowanie
do strony informującej o sukcesie lub niepowodzeniu logowania
246
PrzepPrzepłływ sterowania w aplikacji JSFyw sterowania w aplikacji JSF
1) Zbiór komponentów stanowiących interfejs jest zaprezentowany użytkownikowi w postaci formularza
2) Formularz wywołuje sam siebie– Atrybut ACTION zawiera adres formularza
3) Tworzony jest Java Bean zawierający dane z formularza (tzw. backing bean)
4) Wywoływana jest akcja związana z zatwierdzeniem formularza– Metoda akcji zwraca warunek
5) Prezentowana jest strona związana z warunkiem
247Podstawowe kroki tworzenia Podstawowe kroki tworzenia
aplikacji JSFaplikacji JSF
1) Utworzenie stron z wykorzystaniem znaczników odwołujących się do komponentów JSF
2) Zdefiniowanie nawigacji między stronami w pliku konfiguracyjnym aplikacji
3) Implementacja komponentów Java Beanreprezentujących dane z formularzy (backing beans)
4) Zadeklarowanie backing beans w pliku konfiguracyjnym aplikacji
UWAGA: Powyższe kroki mogą być realizowane współbieżnie lub w dowolnej kolejności
248
Pliki konfiguracyjne aplikacji JSFPliki konfiguracyjne aplikacji JSF
• web.xml (w katalogu WEB-INF/)– Standardowy plik konfiguracyjny modułu webowego
aplikacji J2EE– Zawiera deklarację serwletu kontrolera aplikacji
i mapowanie odpowiadającego mu wzorca adresu
• faces-config.xml (w katalogu WEB-INF/)– Specyficzny plik konfiguracyjny aplikacji JSF– Zawiera reguły nawigacji, deklaracje backing beans,
itd.
249Deklaracja i mapowanie dla Deklaracja i mapowanie dla serwletuserwletu
kontrolera JSFkontrolera JSF
<!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>
web.xml
• Mapowanie rekomendowane przez specyfikację JSF:– <url-pattern>*.faces</url-pattern>
• Alternatywne popularne mapowania: – <url-pattern>/faces/*</url-pattern> (domyślny w JDeveloper)
– <url-pattern>*.jsf</url-pattern>
250Struktura kodu formularzy do Struktura kodu formularzy do
wprowadzania danych JSP/JSFwprowadzania danych JSP/JSF
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<f:view>
znaczniki HTML<h:form>
znaczniki HTML + znaczniki h: JSF (+ zagnieżdżone f:)
</h:form>
znaczniki HTML</f:view>
Strona zawierająca znaczniki JSF jest reprezentowana w postaci drzewa komponentów.Korzeniem drzewa jest komponent UIViewRoot, reprezentowany przez znacznik <f:view>.Dlatego wszystkie znaczniki JSF użyte na stronie musząbyć zawarte wewnątrz elementu <f:view></f:view>. Biblioteka znaczników JSF
niezależnych od technologii prezentacji (np. do walidacji,obsługi zdarzeń, ...)(zwyczajowy prefiks: f)
Biblioteka znaczników JSF reprezentujących znaczniki HTML (w tym elementy formularzy)(zwyczajowy prefiks: h)
<h:form> reprezentuje formularz HTML <FORM>.ACTION automatycznie wskazuje na bieżącą stronę(strona wywołuje sama siebie). METHOD przyjmuje wartość POST (obowiązkowo).
251
Formularz logowaniaFormularz logowania
<%@ 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>Użytkownik: <h:inputText value="#{loginBean.username}"
id="username"/>
<p>Hasło: <h:inputSecret value="#{loginBean.password}"
id="password"/>
<p><h:commandButton value="Zaloguj"
id="submitButton"
action="#{loginBean.register}"/>
</h:form></body>
</html>
</f:view>
login.jsp
• Strona w pliku .jsp, uruchomienie poprzez FacesServlet, URL zależy od mapowania w plikuweb.xml
252
Nawigacja statycznaNawigacja statyczna
...
<h:commandButton value="Zaloguj"
id="submitButton"
action="success"/>
...
login.jsp
<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-rule>
faces-config.xml
Uwaga: Gdy cel nawigacjizależy od wprowadzonychdanych, konieczna nawigacja dynamiczna
Nawigacja statyczna: Wynik akcji zaszyty na stałe w deklaracji przycisku
253
Komponenty Komponenty backing beansbacking beans
• Komponenty backing beans definiują właściwości i metody powiązane z komponentami interfejsu użytkownika– Każda właściwość powiązania z wartością lub instancją komponentu– Dodatkowo backing bean może zawierać metody:
• Do walidacji danych komponentu• Do obsługi zdarzeń generowanych przez komponent• Do przetwarzania związanego z nawigacją
• Ich klasy muszą spełniać reguły Java Beans:– Bezargumentowy konstruktor– Brak publicznych pól– Dostęp do właściwości poprzez metody setXXX/getXXX:
• public String getName()public void setName(String n)
• public boolean isActive()public void setActive(boolean a)
254
Koncepcja Koncepcja managed beansmanaged beans
• JSF oferuje deklaratywny mechanizm tworzenia komponentów JavaBean– Backing beans – komponenty o zasięgu request,
związane z konkretną stroną– Application logic beans – niepełniące roli backing beans,
zawierające kod i właściwości niezwiązane z konkretną stroną
• Komponenty skonfigurowane w pliku faces-config.xml określane są jako managed beans– Runtime JSF utworzy instancję na żądanie, gdy napotka wyrażenie
odwołujące się do komponentu
• Odwołania do managed beans z poziomu kodu strony JSF realizowane są za pomocą języka wyrażeń JSF
255
JJęęzyk wyrazyk wyrażżeeńń JSFJSF
• Język wyrażeń JSF (JSF Expression Language) składniowo jest identyczny z JSP Expression Language– Dostępnym od JSP 2.0– Wykorzystywanym również przez JSTL
• Różnica polega na tym że w JSP/JSTL wyrażenia służąjedynie do wyświetlania wartości, a w JSF do wyświetlania i ustawiania właściwości– JSP EL wywołuje tylko metody getXXX– JSF EL wywołuje metody getXXX i setXXX
• Powyższa różnica jest powodem innej notacji w JSF (#{...}) niż w JSP i JSTL (${...})
• Uwagi:– Używany tylko w atrybutach znaczników JSF– Dostęp do managed beans i zasięgów request, session, application
256Backing bean Backing bean dla formularza logowania dla formularza logowania
(1/2)(1/2)
<faces-config ...>
...
<managed-bean>
<managed-bean-name>loginBean</managed-bean-name>
<managed-bean-class>view.backing.Login</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>
faces-config.xml
package view.backing;
public class Login {
private String username;
private String password;
public void setUsername(String t) { this.username = t; }
public String getUsername() { return username; }
public void setPassword(String t) { this.password = t; }
public String getPassword() { return password; }
}
Login.java
Deklaracja komponentu (dzięki niej implementacja JSF samautworzy instancję komponentu gdy będzie potrzebna -managed bean)
Definicja klasy komponentu
257Backing bean Backing bean dla formularza logowania dla formularza logowania
(2/2)(2/2)
<%@ 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>Użytkownik: <h:inputText value="#{loginBean.username}"
id="username"/>
<p>Hasło: <h:inputSecret value="#{loginBean.password}"
id="password"/>
...
</h:form></body>
</html>
</f:view>
login.jsp
Po zatwierdzeniu formularza i wysłaniu wprowadzonych danychdo serwera, zostaną one automatycznie umieszczone we wskazanych właściwościach wskazanego komponentu
Do wiązania komponentów interfejsu użytkownika z właściwościami komponentu backing bean wykorzystany język wyrażeń JSF (#{...})
258Sposoby wiSposoby wiąązania zania backing beans backing beans
z komponentami interfejsuz komponentami interfejsu
• Backing bean to komponent Java Bean, powiązany z komponentami interfejsu używanymi na stronie
• Każda z właściwości komponentu backing bean powiązana jest z wartością lub instancją komponentu
• Powiązanie właściwości z wartością komponentu:– np. <h:inputText id="uName" value="#{UserBean.userName}" />
(właściwość typu String, Integer, int, double, ...)– Zalecane w większości sytuacji
• Automatyczne konwersje typów danych• Komponent backing bean nie odwołuje się do JSF API
• Powiązanie właściwości z instancją komponentu:– np. <h:inputText binding="#{UserBean.userNameComponent}" />
(właściwość typu UIInput)– Wymagane gdy istnieje potrzeba programowego modyfikowania
właściwości komponentu– Wykorzystywane przez kreator w JDeveloperze
259Przekazywanie wartoPrzekazywanie wartośści mici mięędzy dzy stronami poprzez stronami poprzez backing beansbacking beans
Dostęp do właściwości komponentu backing bean za pomocą znacznika h:outputText
<%@ 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 hasło to: <h:outputText value="#{loginBean.password}"/>.
</h:form></body>
</html>
</f:view>
ok.jsp
260
Nawigacja dynamiczna (1/2)Nawigacja dynamiczna (1/2)
<h:commandButton value="Zaloguj"
id="submitButton„
action="#{loginBean.register}"/>
login.jsp
public class Login {
private String username;
private String password;
...public String register() {
if (username.equals(password)) return "success";
elsereturn "failure";
}
}
Login.java
Wynik akcji zwracany przez metodę (właściwość)komponentu backing bean
marek
***
login.jspsuccess
failure
ok.jsp
error.jsp
261
Nawigacja dynamiczna (2/2)Nawigacja dynamiczna (2/2)
...
<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>
...
faces-config.xml
Jeśli metoda akcji zwróci wartość nieuwzględnioną w regule nawigacji, nastąpi ponowne wywołanie bieżącej strony
262
Tworzenie aplikacji JSF Tworzenie aplikacji JSF w w śśrodowisku rodowisku JDeveloperJDeveloper 10g (10.1.3)10g (10.1.3)
263
Wsparcie JSF w Wsparcie JSF w JDeveloperJDeveloper 10.1.310.1.3
• Kompletny zbiór standardowych komponentów JSF• Biblioteka komponentów ADF Faces• Zintegrowane środowisko wizualnego tworzenia aplikacji:
– Wizualna edycja nawigacji między stronami– Paleta właściwości do przeglądania i edycji właściwości
komponentów na stronie– Automatyczne definiowanie backing beans– Okna dialogowe wspierające tworzenie powiązań w JSF EL– Wizualna edycja pliku faces-config.xml
264
Tworzenie nowej aplikacjiTworzenie nowej aplikacji
Tu można wybrać szablonuwzględniający JSF, wtedyprojekty dla modelu i widoku oraz plik faces-config.xml w projekcie widoku zostanąutworzone automatycznie
265Utworzenie pliku konfiguracyjnego Utworzenie pliku konfiguracyjnego
aplikacji JSFaplikacji JSF
Wybór wersjispecyfikacjiserwletów / JSP
Wraz z plikiem faces-config.xml tworzona jest cała struktura aplikacji webowej J2EE
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
266
Wizualny edytor nawigacjiWizualny edytor nawigacji
• Umożliwia:– Graficzną edycję reguł nawigacji na diagramie– Dodawanie nowych stron do diagramu
• Tworzenie nowych z palety komponentów• Dodawanie wcześniej utworzonych stron JSP/JSF z nawigatora
obiektów (drag & drop)
267
Tworzenie nowej stronyTworzenie nowej strony
Dwuklik na ikonie
Utworzenie nowego, automatycznie zarządzanego komponentu backing bean, z którego właściwościami będąwiązane komponenty interfejsu na stronie (opcjonalnie)
268
Tworzenie nowej strony Tworzenie nowej strony –– efekt (1/2)efekt (1/2)
<%@ 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--%>
login.jsp
269
Tworzenie nowej strony Tworzenie nowej strony –– efekt (2/2)efekt (2/2)
package mypackage.backing;
import javax.faces.component.html.HtmlForm;
public class Login {
private HtmlForm form1;
public void setForm1(HtmlForm form1) {
this.form1 = form1;
}
public HtmlForm getForm1() {
return form1;
}
}
Login.java
<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>
faces-config.xml
270
Wizualna edycja formularza JSP/JSFWizualna edycja formularza JSP/JSF
• Edycja strony (drag & drop)– Elementy formularza z palety JSF HTML– Można do dekoracji wykorzystywać elementy HTML Common
(np. tabelka)– Źródło strony i klasa backing bean (!) uaktualniane na bieżąco
Zmiana etykiety przycisku w kodzie lub w palecie właściwości (value)
271Wizualna edycja formularza JSP/JSF Wizualna edycja formularza JSP/JSF ––
wynikowa klasawynikowa klasa
package mypackage.backing;
import javax.faces.component.html.HtmlCommandButton;
import javax.faces.component.html.HtmlForm;
import javax.faces.component.html.HtmlInputSecret;
import javax.faces.component.html.HtmlInputText;
public class Login {
private HtmlForm form1;private HtmlInputText inputText1;
private HtmlInputSecret inputSecret1;
private HtmlCommandButton commandButton1;
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; }
}
Login.java
JDeveloper generuje klasębacking bean z właściwościami odpowiadającymi instancjom komponentów a nie ich wartościom! (elastyczniejsze z dwóch możliwych rozwiązań)
272Wizualna edycja formularza JSP/JSF Wizualna edycja formularza JSP/JSF ––
wynikowa strona JSPwynikowa strona JSP
<f:view>
<body>
<h:form binding="#{loginBean.form1}" id="form1">
<!– Pominięte znaczniki definiujące tabelkę HTML -->
Użytkownik:<h:inputText binding="#{loginBean.inputText1}" id="inputText1"/>
Hasło:<h:inputSecret binding="#{loginBean.inputSecret1}"
id="inputSecret1"/>
<h:commandButton value="Zaloguj"
binding="#{loginBean.commandButton1}"
id="commandButton1"/>
</h:form>
</body>
</f:view>
login.jsp
Powiązanie z instancją komponentu, a nie z wartością, a więc poprzez atrybut binding, a nie value!
273
Wizualna edycja reguWizualna edycja regułł nawigacjinawigacji
Pierwsza strzałka domyślnie dostaje etykietę „success”(etykiety można zmienić na diagramie)
<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>
faces-config.xml
274
Utworzenie metody akcjiUtworzenie metody akcji
...
public String commandButton1_action() {
// Add event code here...
return null;
}
...
Login.java
...
public String commandButton1_action() {String user = (String) inputText1.getValue();
String pass = (String) inputSecret1.getValue();
if (user.equals(pass))
return "success";
else
return "failure";
}
...
Dwuklik na przycisku Ręczna edycja
275DostDostęęp do danych przekazanych poprzez p do danych przekazanych poprzez
backing beans backing beans (1/2)(1/2)
Dwuklik na ikonie
Strona nie służy do wprowadzania danych, więc można nie deklarować dla niej komponentu backing bean
Do wyświetlenia danych przekazanych przez backing beansłuży element h:outputText Powiązanie outputText
z właściwością backing beanza pomocą palety właściwości
276DostDostęęp do danych przekazanych poprzez p do danych przekazanych poprzez
backing beansbacking beans (2/2)(2/2)
Wprowadzenie wartości #{uaktywnia przycisk wywołującyokno dialogowe pozwalającyna powiązanie z właściwościąkomponentu backing bean(lub innego dostępnego obiektu np. powiązań z modelem)
278
Rozbudowa aplikacji Rozbudowa aplikacji JavaServer FacesJavaServer Faces
-- walidacjawalidacja-- konwersjakonwersja
-- obsobsłługa zdarzeuga zdarzeńń-- wsparcie dla aplikacji wielojwsparcie dla aplikacji wielojęęzycznychzycznych
-- ukrycie ukrycie źźrróódedełł JSP przed dostJSP przed dostęępempem
279Walidacja danych w aplikacjach Walidacja danych w aplikacjach
webowychwebowych
• Typowe cele walidacji w aplikacjach webowych:– Sprawdzenie czy zostały wprowadzone wartości do
wszystkich wymaganych pól formularza i czy format wartości jest odpowiedni
– Ponowne wyświetlenie formularza w przypadku błędów• Z komunikatami o błędach• Z zachowaniem poprawnych wartości
280
Walidacja danych w aplikacjach JSFWalidacja danych w aplikacjach JSF
• Walidacja ręczna– Walidacja w metodach setXXX i/lub metodzie akcji– Metoda akcji zwraca null by wymusić ponowne wyświetlenie formularza
• Niejawna walidacja automatyczna– Użycie atrybutu required– Właściwości backing beans typów prostych– System wyświetla formularz ponownie gdy błąd konwersji– Wyświetlanie komunikatów o błędach: h:message
• Jawna walidacja automatyczna– Użycie predefiniowanych walidatorów:
• f:validateLength,
• f:validateDoubleRange, f:validateLongRange
– System wyświetla formularz ponownie gdy błąd walidacji– Wyświetlanie komunikatów o błędach: h:message
• Walidatory aplikacji (custom validators)– Implementują interfejs Validator– Rejestrowane w faces-config.xml
281
PrzykPrzykłłady walidacji w JSF (1/2)ady walidacji w JSF (1/2)
• Obowiązkowa nazwa użytkownika:– Ustawienie atrybutu required– Dodanie elementu h:message i powiązanie go z polem formularza
<h:inputText
binding="#{loginBean.inputText1}" id="inputText1" required="true"/>
<h:message for="inputText1"
binding="#{loginBean.message1}" id="message1"/>
282
PrzykPrzykłłady walidacji w JSF (2/2)ady walidacji w JSF (2/2)
• Hasło od 4 do 6 znaków:– Dodanie walidatora f:validateLength i ustawienie jego właściwości– Dodanie elementu h:message i powiązanie go z polem formularza
<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
KonwerteryKonwertery
• Konwertery są używane gdy:– Wymagana jest inna konwersja niż standardowa dokonywana
automatycznie (do typów takich jak int, float, Integer, Boolean, ...)
– Wymagane jest zaawansowane formatowanie (liczb, dat)
• Konwersja a walidacja– Konwerter może służyć do walidacji – generuje wyjątek i tworzy
komunikat o błędzie gdy konwersja się nie powiedzie– Konwerter również zmienia format wyświetlania, a nie tylko konwertuje
wprowadzane dane– Walidatory mogą być używane tylko z komponentami do wprowadzania
danych, a konwertery również z h:outputText
• Standardowe konwertery:– f:convertNumber, f:convertDateTime
• Niestandardowe konwertery tworzy się implementując interfejs Converter
<h:outputText value="#{user.lastLogin}">
<f:convertDateTime dateStyle="full" />
</h:outputText>
<h:outputText value="#{user.lastLogin}">
<f:convertDateTime
pattern="EEEEEEEE, MMM dd, yyyy" />
</h:outputText>>
284Warunkowe Warunkowe renderowanie renderowanie i aktywacja komponenti aktywacja komponentóóww
• Poprzez zmianę wartości atrybutu rendered można spowodować, że komponent nie będzie wyświetlany (domyślnie true)
• Poprzez zmianę wartości atrybutu disabled można spowodować, że komponent nie będzie aktywny (domyślnie false)
<h:commandButton value="Zaloguj"
binding="#{loginBean.commandButton1}"
action="#{loginBean.commandButton1_action}"
rendered="false"/>
<h:commandButton value="Zaloguj"
binding="#{loginBean.commandButton1}"
action="#{loginBean.commandButton1_action}"
disabled="true"/>
Możliwe odwołanie do metody backing bean: #{}
285
ObsObsłługa zdarzeuga zdarzeńń w aplikacji JSFw aplikacji JSF
• Zdarzenia zachodzące w aplikacji JSF można podzielić na dwie kategorie:– Zdarzenia inicjujące przetwarzanie po stronie logiki biznesowej– Zdarzenia wpływające jedynie na interfejs użytkownika
• Kategorie „procedur” obsługi zdarzeń w JSF:– Action controllers (metody akcji)
• Uruchamiane po wypełnieniu komponentu backing bean danymi i po walidacji
• Zwracają wartości decydujące o nawigacji
– Event listeners
• Często uruchamiane przed wypełnieniem komponentu backing beandanymi i z pominięciem walidacji
• Nie wpływają bezpośrednio na nawigację
286
Rodzaje Rodzaje Event ListenersEvent Listeners
• ActionListener– Wywoływany przez przyciski, mapy obrazkowe
i linki z kodem JavaScript– Elementy te automatycznie zatwierdzają formularz
• ValueChangeListener– Wywoływany 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
ActionListenerActionListener -- PrzykPrzykłładad
<h:commandButton
actionListener= "#{bean.sideEffect}"
immediate="true" />
public void sideEffect(ActionEvent event) {
// np. aktywacja/deaktywacja innych
// elementów formularza
}
Metoda w klasie komponentu backing bean, zwracająca void
Przypomnienie: Dla zdarzeń powodujących nawigację: atrybut action
Metoda obsługująca zdarzenie zwyczajowo w klasie komponentu backing bean
Umożliwia obsługę zdarzeń przed walidacją innych komponentów
288
ValueChangeListener ValueChangeListener –– PrzykPrzykłład (1/2)ad (1/2)
• Pole wyboru uaktywniające przycisk zatwierdzający formularz logowania
Wpisanie w palecie właściwości 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);
}
disabled= ”true”
289
ValueChangeListenerValueChangeListener –– PrzykPrzykłład (2/2)ad (2/2)
Problem: Po zmianie stanu pola wyboru„budzi się” walidacja pól tekstowych!
UWAGA: W niektórych wersjach Internet Explorer, zdarzenie onchange wystąpi dopiero gdy focus znajdzie się na innym elemencie (jest to raczej bug...). Rozwiązaniem jest onclick
<h:selectBooleanCheckbox
binding="#{loginBean.selectBooleanCheckbox1}"
id="selectBooleanCheckbox1"
valueChangeListener="#{loginBean.checkbox1Changed}"
onchange="submit()"/>
Wymagany JavaScript, aby zmiana stanu pola wyboru zatwierdzała formularz
(należy wpisać ręcznie lub przez paletę)
• Rozwiązanie problemu „niechcianej” walidacji:– Dodanie immediate="true" w elemencie pola wyboru (domyślnie jest false),
aby obsługa zdarzenia miała miejsce przed walidacją
– Dodanie poniższego kodu na końcu metody obsługi zdarzenia:FacesContext context = FacesContext.getCurrentInstance();
context.renderResponse(); // skraca normalne przetwarzanie
290
Nawigacja za pomocNawigacja za pomocąą linklinkóóww
• Nawigacja następuje w wyniku zwrócenia konkretnej etykiety przez metodę akcji
• Akcję nawigacyjną oprócz przycisków mogą wywoływaćrównież linki– Tworzone za pomocą znacznika h:commandLink– Renderowane z wykorzystaniem kodu JavaScript, zatwierdzającego
formularz (JavaScript w przeglądarce musi być włączony!)
<h:form>
<h:commandButton value="Powrót"
action="success"/>
<h:commandLink action="success">
<h:outputText value="Powrót"/>
</h:commandLink>
</h:form>
error.jsp
291
Backing beans Backing beans o zasio zasięęgu sesjigu sesji
• Backing beans najczęściej mają zasięg obsługi żądania (request)• Można zwiększyć ich czas życia do zasięgu sesji (session) lub aplikacji
(application), jeśli mają służyć do przechowywania danych między kolejnymi żądaniami
<managed-bean><managed-bean-name>loginBean</managed-bean-name>
<managed-bean-class>mypackage.backing.Login</managed-bean-class><managed-bean-scope>session</managed-bean-scope>
</managed-bean>
faces-config.xml
loginBean
scope=sessionloginBean
scope=request
292
Pliki .Pliki .properties properties w JSFw JSF
• Plik .properties to tekstowy plik zawierający pary klucz=wartość
• Aplikacja JSF może pobierać teksty do wyświetlenia z plików .properties (Resource Bundles)
• Pliki .properties umieszczane są tam gdzie klasy (WEB-INF/classes)
• Do ładowania plików .properties służy znacznik f:loadBundle wskazujący:– Nazwę pliku (bez rozszerzenia, z prefiksem pakietu)– Nazwę zmiennej (typu Map) do przechowania odczytanych danych
<f:loadBundle basename="komunikaty" var="kom"/>
#{kom.klucz}
293
Plik .Plik .properties properties -- PrzykPrzykłładad
New->Simple files->File
sorryPrompt=Sorry
backLabel=Back
komunikaty.properties
<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>
error.jsp
294
Internacjonalizacja aplikacjiInternacjonalizacja aplikacji
• Należy przygotować zestaw plików .properties dla poszczególnych języków (różniących się kodem lokalizacji w przyrostku nazwy):– komunikaty.properties, komunikaty_pl.properties, ...
• W znaczniku f:view należy umieścić atrybut locale
– Może to nie być konieczne (serwer może ustawić sam)– Wartość locale wyznaczoną przez ustawienia
przeglądarki użytkownika można odczytaćz FacesContext
– Odczyt pliku i wyświetlanie komunikatów bez zmian!
295
Internacjonalizacja aplikacji Internacjonalizacja aplikacji -- PrzykPrzykłładad
sorryPrompt=Przykro nam
backLabel=Powrót
komunikaty_pl.properties
<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>
error.jsp
sorryPrompt=Sorry
backLabel=Back
komunikaty.properties
UWAGA: Polskie znaki (poza „ó”) w kostaci kodów Unicode (\uXXXX)
296Podmiana i internacjonalizacja komunikatPodmiana i internacjonalizacja komunikatóów ze w ze
standardowych standardowych walidatorwalidatoróów w (1/2)(1/2)
• Należy wykonać dwa kroki:– Przygotować pliki .properties dla poszczególnych
języków zawierające nowe komunikaty przypisane do predefiniowanych kluczy
– Wskazać przygotowane pliki jako message bundle zawierający dostosowane komunikaty w konfiguracji aplikacji (faces-config.xml)
javax.faces.component.UIInput.REQUIRED=Pole jest wymagane!
javax.faces.validator.LengthValidator.MINIMUM=Minimalna wymagana
liczba znaków to {0}!
javax.faces.validator.LengthValidator.MAXIMUM=Maksymalna wymagana
liczba znaków to {0}!
komunikaty_pl.properties
W miejsce {0} będzie wstawiany parametr ograniczenia np. limit na liczbę znaków
297Podmiana i internacjonalizacja komunikatPodmiana i internacjonalizacja komunikatóów ze w ze
standardowych standardowych walidatorwalidatoróów w (2/2)(2/2)
<application>
<message-bundle>
komunikaty
</message-bundle>
</application>
faces-config.xml
Interaktywny edytor zawartościfaces-config.xml
298
Problem dostProblem dostęępu do stron JSPpu do stron JSP
• Domyślnie źródłowe strony JSP nie są chronione przed bezpośrednim dostępem
• Dostęp do stron JSP zawierających znaczniki JSF bez pośrednictwa kontrolera FacesServlet powoduje błędy
• Jest to jedna z wad JSF!
299
Ochrona Ochrona źźrróóddłłowych stron JSPowych stron JSP
• Nie można umieścić stron JSP w WEB-INF gdyżw JSF URL musi odpowiadać lokalizacji pliku:– strona.jsp -> strona.faces lub faces/strona.jsp
• Rozwiązaniem jest wykorzystanie security-constraintw pliku web.xml
<security-constraint>
<web-resource-collection>
<web-resource-name>Raw JSPs
</web-resource-name>
<url-pattern>/login.jsp</url-pattern>
<url-pattern>/ok.jsp</url-pattern>
...
</web-resource-collection>
<auth-constraint>
<description>No roles, no direct access</description>
</auth-constraint>
</security-constraint>
web.xml
300
Tworzenie aplikacji Tworzenie aplikacji bazodanowych bazodanowych w w JavaServer FacesJavaServer Faces
-- prezentowanie danych tabelarycznychprezentowanie danych tabelarycznych-- dostdostęęp do wynikp do wynikóów zapytaw zapytańń
301
Prezentacja danych tabelarycznychPrezentacja danych tabelarycznych
• Często aplikacja musi przedstawić kolekcję danych w postaci tabelarycznej– Na etapie projektowania strony liczba wierszy jest
nieznana– Typowy scenariusz przy zapytaniach do bazy danych
• JSF umożliwia prezentację danych tabelarycznych bez konstrukcji pętli za pomocą komponentu h:dataTable
– h:dataTable zawiera definicję jednego wiersza– Struktura wiersza jest powielona dla elementów kolekcji
• Można wskazać szczególną zawartość dla nagłówka i stopki za pomocą elementu f:facet
• Można wskazać od którego elementu kolekcji (numeracja od 0) i ile wierszy ma być wyświetlonych (atrybuty first i rows)
302
Dane Dane źźrróóddłłowe dla h:owe dla h:dataTabledataTable
• Lista komponentów Java Bean• Tablica komponentów Java Bean• Pojedynczy komponent Java Bean• java.sql.ResultSet
• javax.servlet.jsp.jstl.sql.Result
– Użyteczna alternatywa dla java.sql.ResultSet– Nie traci zawartości po zamknięciu połączenia z bazą
• javax.sql.RowSet
• javax.faces.model.DataModel
– Wszystkie źródła danych muszą być jawnie lub niejawnie opakowane w DataModel
• Podklasy ScalarDataModel, ListDataModel, ArrayDataModel, ResultSetDataModel, ResultDataModel
303
h:h:dataTable dataTable dla tablicy obiektdla tablicy obiektóów (1/4)w (1/4)
public class Book {private String author;
private String title;
public Book() {}
public Book(String a, String t) {
this.author = a;
this.title = t;
}
public void setAuthor(String author) {...}
public String getAuthor() {...}
public void setTitle(String title) {...}
public String getTitle() {...}
}
Book.java
public class BooksBean {public Book [] getBooks() {
Book [] books = {
new Book("Adam Mickiewicz", "Pan Tadeusz"),
new Book("Joanna Chmielewska", "Depozyt"),
new Book("Ernest Hemingway", "Komu bije"),
new Book("William Wharton", "Ptasiek") };
return books;
}
}
BookBean.java
304
h:h:dataTabledataTable dla tablicy obiektdla tablicy obiektóów (2/4)w (2/4)
Rejestracja źródła danych jako managed bean w 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>
faces-config.xml
Dodanie komponentu dataTable na stronie
305
h:h:dataTabledataTable dla tablicy obiektdla tablicy obiektóów (3/4)w (3/4)
Wskazanie właściwości komponentu managed bean jako źródłowej kolekcji danych
Ręczne wprowadzenie nazwyzmiennej, która będzie repre-zentować kolejne elementy
Podanie klasy reprezentującej strukturę elementu kolekcji jest opcjonalne. Umożliwia kreatorowi automatyczne wypełnienie zawartości kolumn i ich nagłówków!
306
h:h:dataTabledataTable dla tablicy obiektdla tablicy obiektóów (4/4)w (4/4)
<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>
ksiazki.jsp
h:column definuje kolumnę tabeli
f:facet w tabeli definiuje nagłówek (header) i stopkę(footer)
Uwaga: Zawartość nie-JSF (np. HTML) musi być ujęta w element f:verbatim, aby była wyświetlona we właściwym miejscu
307
Dostosowywanie wyglDostosowywanie wygląądu du –– Klasy CSSKlasy CSS
• Elementy z biblioteki znaczników JSF HTML zawierają atrybut styleClass wskazujący klasę zdefiniowanąw dołączonym arkuszu stylów CSS
• Element h:dataTable zawiera kilka atrybutów umożliwiających specyfikację stylu:– styleClass
– columnClasses, footerClass, headerClass, rowClasses
<head><link href="css/styl.css"
rel="stylesheet"/>
...
</head>
...<h:dataTable value="#{booksBean.books}"
var="book"rowClasses="nieparzysty, parzysty">
</h:dataTable>
ksiazki.jsp
.nieparzysty
{
background-color:
Yellow;
color: black;
}
.parzysty
{
background-color:
Cyan;
color: black;
}
styl.css
308h:h:dataTable dataTable –– Prezentacja wynikPrezentacja wynikóów w
zapytazapytańń do bazy danychdo bazy danych
• Sposoby przygotowania danych źródłowych:– Wydobycie danych ze zbioru wynikowego JDBC i ich
umieszczenie w tablicy lub liście obiektów• Wymaga wielu linii kodu i utworzenia klasy reprezentującej
wiersze wyniku zapytania• Sensowne przy wykorzystaniu technologii mapowania
obiektowo-relacyjnego i wspierających je kreatorów (np. Oracle TopLink + JDeveloper)
– Bezpośrednie wykorzystanie ResultSet JDBC• ResultSet wymaga utrzymania połączenia z bazą danych...
– Wykorzystanie klasy ResultSupport z JSTL• Przejmuje dane z ResultSet (jedna linia kodu!)• Odłączony od bazy danych
309
h:h:dataTabledataTable dla wyniku zapytania (1/2)dla wyniku zapytania (1/2)
public class EmpsBean {
public Result getEmps() {Result r = null;
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup ("jdbc/marek8iDS");
Connection conn = ds.getConnection();
Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select ENAME, SAL from EMP");
r = ResultSupport.toResult(rs);
} catch (Exception e) {} return r;
}
}
EmpsBean.java
<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>
faces-config.xml
310
h:h:dataTabledataTable dla wyniku zapytania (2/2)dla wyniku zapytania (2/2)
<h:dataTable value="#{empsBean.emps}" var="emp" border="1">
<h:column>
<f:facet name="header">
<f:verbatim>Nazwisko</f:verbatim>
</f:facet><h:outputText value="#{emp.ename}"/>
</h:column>
<h:column>
<f:facet name="header">
<f:verbatim>Płaca</f:verbatim>
</f:facet><h:outputText value="#{emp.sal}"/>
</h:column></h:dataTable>
pracownicy.jsp
DataModel udostępnia wiersz wyniku zapytania w postaci obiektu, zawierającego właściwości odpowiadające wartościom atrybutów
312
JSF JSF –– Podsumowanie (1/2)Podsumowanie (1/2)
• JSF to technologia tworzenia interfejsu użytkownika pracującego po stronie serwera w aplikacjach J2EE– Obejmuje również obsługę nawigacji (kontroler)
• Nadzieja dla programistów J2EE na dorównanie .NET w zakresie prostoty tworzenia interfejsu użytkownika w aplikacjach webowych
• W pewnym stopniu alternatywa dla Struts– Wykorzystuje doświadczenia twórców Struts i innych szkieletów
aplikacji– Uproszczony kontroler– Ograniczone możliwości walidacji– Nacisk na interfejs użytkownika– Struts i JSF mogą współpracować
313
JSF JSF –– Podsumowanie (2/2)Podsumowanie (2/2)
• JSF oferuje stanowe, rozszerzalne i konfigurowalne komponenty interfejsu i możliwość tworzenia dodatkowych
• Podstawowym środowiskiem do renderowaniakomponentów jest JSP– Specyfikacja JSF definiuje dwie biblioteki znaczników
• JSF w Oracle JDeveloper 10g– Podstawowa technologia tworzenia widoków i kontrolera od 10.1.3– Pełne wsparcie z bogactwem kreatorów i edytorów wizualnych