Tworzenie aplikacji J2EE w technologii JavaServer Faces (JSF)kolos.math.uni.lodz.pl/~archive/Java...

85
229 Tworzenie aplikacji J2EE Tworzenie aplikacji J2EE w technologii w technologii JavaServer Faces JavaServer Faces (JSF) (JSF)

Transcript of Tworzenie aplikacji J2EE w technologii JavaServer Faces (JSF)kolos.math.uni.lodz.pl/~archive/Java...

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

231

WprowadzenieWprowadzenie

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)

277

Gotowa aplikacjaGotowa aplikacja

marek/marek

marek/xxx

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

311

PodsumowaniePodsumowanie

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