Programowanie wielowarstwowe i komponentowe JSP, JSF



Podobne dokumenty
JavaServer Faces (JSF)

Programowanie wielowarstwowe i komponentowe

Java Server Faces - wprowadzenie

Projektowanie i wdrażanie systemów informatycznych. Dodanie aplikacji klienta uruchamianej przez przeglądarkę kontynuacja projektu:

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Złożone komponenty JSF wg

Serwery aplikacji. dr Radosław Matusik. radmat

Złożone komponenty JSF wg

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Serwery aplikacji. dr Radosław Matusik. radmat

Budowa aplikacji wielowarstwowych. Zastosowanie szablonów

Przykłady tworzenia aplikacji komponentowych w technologii JavaServer Faces 2.1 na podstawie

Java wybrane technologie spotkanie nr 5. Java Server Pages

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Facelets ViewHandler

Aplikacje WWW - laboratorium

Aplikacje WWW - laboratorium

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Podstawowe informacje o technologii Java Persistence API - przykład

Programowanie komponentowe 5

Podstawowe wykorzystanie Hibernate

Aplikacje Internetowe, Servlety, JSP i JDBC

Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Infrastruktura aplikacji WWW II

Budowa prostej aplikacji wielowarstwowej

Podstawy technologii JavaServer Faces wg

Wprowadzenie do technologii JavaServer Faces 2.2 na podstawie Wykład 2 Technologie internetowe

Java Server Faces narzędzie do implementacji w wy prezentacji

Elementy JEE. 1. Wprowadzenie. 2. Prerekwizyty. 3. Pierwszy servlet. obsługa parametrów żądań 4. JavaServer Pages.

prepared by: Programowanie WWW Servlety

Programowanie w Javie 2. Płock, 26 luty 2014 r.

Enterprise JavaBeans (EJB)

Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej. Wstęp. Programowanie w Javie 2. mgr inż.

Wybrane działy Informatyki Stosowanej

Java. Michał Wójcik.

Java Enterprise Edition spotkanie nr 3. Serwlety c.d.

Wybierz kategorię Java Web i typ projektu Web Application. Kliknij przycisk Next >.

Aplikacje WWW - laboratorium

prepared by: Programowanie WWW Model-View-Controller

Przykłady pytań do zaliczenia programu wykonywanego w ramach zajęć laboratoryjnych 6-8 z Programowania komponentowego w Javie. Zofia Kruczkiewicz

Budowa aplikacji wielowarstwowych. Zastosowanie szablonów, tabel oraz plików typu properties

JSF 1.2. w wykonaniu NetBeans IDE 6.1. Jacek Laskowski

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Laboratorium 1 Wprowadzenie do PHP

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

1 Wprowadzenie do J2EE

Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski

Aplikacje WWW - laboratorium

Architektury Usług Internetowych. Laboratorium 1. Servlety

Aplikacje internetowe i rozproszone - laboratorium

Budowa aplikacji wielowarstwowych. Zastosowanie szablonów, tabel oraz plików typu properties

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008

Umieszczanie kodu. kod skryptu

6. Powtórz kroki z punktu 5. dla strony sorry.jsp, zmieniając jedynie treść wyświetlanego tekstu ( Niestety zamiast Witaj )

Programowanie obiektowe

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

JavaServer Pages. Konrad Kurdej Karol Strzelecki

Podstawy technologi JavaServer Faces

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Klasy i obiekty cz II

Laboratorium 6 Tworzenie bloga w Zend Framework


Zaawansowane aplikacje WWW - laboratorium

Wstęp - Prosta aplikacja internetowa w technologii Java EE 5. Programowanie komponentowe 1

Kurs WWW 1. Paweł Rajba

Java wybrane technologie

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Aplikacje w środowisku Java

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Zaawansowane aplikacje internetowe - laboratorium

Java Enterprise Edition spotkanie nr 4. Java Server Pages c.d.

Kurs WWW. Paweł Rajba.

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

JAVA SERVER FACES jest to nowy framework Javy do tworzenia interface u użytkownika dla aplikacji sieciowych.

Podstawy JavaScript ćwiczenia

Tworzenie i wykorzystanie usług

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Serwlety Java: zagadnienia zaawansowane. Data Sources. Data Sources. Przykład pliku data-sources.xml

Poznań Java User Group Java Server Faces. Wprowadzenie (Fakty i Mity)

Szkolenie wycofane z oferty

Fragmenty są wspierane od Androida 1.6

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

Zaawansowane aplikacje internetowe

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Podstawowe informacje o technologii Java Persistence API - przykład

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Aplikacje WWW - laboratorium

Wybrane działy Informatyki Stosowanej

Tworzenie aplikacji J2EE w technologii JavaServer Faces (JSF)

Programowanie obiektowe

Java EE: JSF + EJB + JPA + CDI + BV

Aplikacje w środowisku Java

Metody dostępu do danych

Języki i metody programowania Java. Wykład 2 (część 2)

Transkrypt:

Programowanie wielowarstwowe i komponentowe JSP, JSF

JSP

Cykl życia strony JSP Strony JSP są przetwarzane jako servlety, więc dziedziczą po nich wiele cech Kiedy następuje odwołanie do strony JSP, jest ona tłumaczona na kod źródłowy Javy, do klasy będącej servletem. Następuje kompilacja. Cykl życia strony JSP jest identyczny jak cykl życia servleta Gdy nie istnieje instancja servletu danej strony JSP, serwer Ładuje klasę servletu JSP Tworzy instancję tego servletu Wywołuje metodę jspinit() Wywoływana jest metoda _jspservice() Przed usunięciem strony JSP następuje wywołanie funkcji jspdestroy()

Elementy stron JSP Dyrektywy <%@ page language="java" contenttype="text/html; charset=iso- 8859-1" pageencoding="iso-8859-1"%> Elementy języka wyrażeń (expression language) ${} i #{} Znaczniki <jsp:.. /> Inne znaczniki Z bibliotek znaczników Własne znaczniki

JavaBeans w JSP <jsp:usebean id="nazwabeana" class="pełna.nazwa.klasy" scope="widocznosc" /> <jsp:usebean id="nazwabeana" class="pełna.nazwa.klasy" scope="widocznosc" > <jsp:setproperty > </jsp:usebean> <jsp:setproperty name="nazwabeana" property="nazwawlasciwosci" value="wartosc wyrazenie"/> <jsp:setproperty name="nazwabeana" property="nazwawlasciwosci" param="wartosc wyrazenie"/> Widocznosc: application, session, request

Język wyrażeń EL (expression language) Są dwa typy wyrażeń ${wyrazenie} natychmiastowa ewaluacja Tylko do odczytu Obliczenie po pierwszym wyświetleniu strony #{wyrazenie} Użycie Do odczytu i zapisu Obliczenia w dowolnym etapie cyklu życia strony W statycznym tekście, w atrybucie znacznika Wyrażenie jest automatycznie konwertowane w zależności od typu (int, String,..)

Język wyrażeń ${zmienna} Serwer będzie szukał zmiennej o podanej nazwie kolejno w kontekstach: Strony Żądania Sesji Aplikacji Dostęp do właściwości obiektów jest możliwy przez Kropkę. [] ${osoba.imie} #{osoba[imie]}

Język wyrażeń ${a.b} lub ${a[b]} Jeżeli zmienna jest bean-em, zwróci właściwość b a.getb() Jeżeli zmienna a jest mapą, wówczas zwróci obiekt pod kluczem b Jeżeli zmienna jest listą, zwróci obiekt spod indeksu b Operatory +, -, *, /, div, %, mod and, &&, or,, not,! ==, eq,!=, ne, <, lt, >, gt, <=, ge, >=, le empty

Język wyrażeń Zmienne predefinowane pagecontext servletcontext session request response param paramvalues header headervalues Cookie initparam

Biblioteki znaczników Użycie bibliotek znaczników: Deklaracja <%@ taglib prefix="prefix" tagdir="/web-inf/tags/dir" %> <%@ taglib prefix="prefix" uri="uri" %> Użycie <prefix:tag attr1="value" attr2="value" /> Dołączanie fragmentów stron <%@ include file="filename.jspf" %> <jsp:include page="includepage.jspf" /> Przekazywanie żądań <jsp:forward page="/main.jsp" />

Java Standard Tag Library JSTL Standardowa biblioteka znaczników JSP Core: remove set choose foreach fortokens if import redirect url catch out l18n setlocale requestencodi ng bundle message setbundle formatnumber formatdate parsedate parsenumber settimezone timezone Database setdataquery query transaction update Functions length touppercase substring trim replace indexof split, join escapexml

JSF

Java Server Faces JSF Technologia, ułatwia i standaryzuje tworzenie interfejsu użytkownika w aplikacjach WWW na platformie Java EE Część specyfikacji Java EE (od J2EE 1.4) Oparta o stanowe, konfigurowalne komponenty interfejsu użytkownika pracujące po stronie serwera Koncepcja podobna do Web Forms w ASP.NET Główne elementy technologii JSF: API do reprezentowania komponentów interfejsu użytkownika i zarządzania nimi biblioteki znaczników dla JSP/Facelets

JSF Zakres funkcjonalny: stanowy, komponentowy interfejs użytkownika obsługa nawigacji między stronami walidacja danych wsparcie dla aplikacji wielojęzycznych JSF jako implementacja architektury MVC: model komponentów do tworzenia stron-widoków gotowy, konfigurowalny kontroler: FacesServlet nie obejmuje modelu, współpracuje z różnymi modelami

Tworzenie aplikacji JSF Konfiguracja serwletu kontrolera jako punktu wejścia do aplikacji Utworzenie stron-widoków z wykorzystaniem znaczników odwołujących się do komponentów JSF Zdefiniowanie nawigacji między stronami w pliku konfiguracyjnym aplikacji (od wersji 2.0 nie wymagane). Implementacja komponentów JavaBean reprezentujących właściwości i funkcje komponentów dla stron (tzw. Backing Beans) Zadeklarowanie komponentów JavaBean, których cyklem życia ma zarządzać JSF w pliku konfiguracyjnym jako tzw. managed beans (od wersji 2.0 nie wymagane).

Projekt w Eclipse

Projekt w Eclipse

Projekt w Eclipse

Projekt w Eclipse

Plik web.xml <web-app version="2.5"> <servlet> <servlet-name>faces Servlet</servlet-name> </servlet- <servlet-class> javax.faces.webapp.facesservlet class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <context-param> <param-name>javax.faces.project_stage</param-name> <param-value>development</param-value> </context-param> Zamiast *.xhtml często wpisywane są również *.jsf lub /faces/* Nowość w JSF 2. na stronie www zamieszczane są dodatkowe informacje podczas pracy aplikacji

faces-config.xml <?xml version="1.0" encoding="utf-8"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd" version="2.1"> </faces-config> Większość konfiguracji zamieszczanych jest w plikach *.java, więc faces-config.xml może być pusty.

Nowy plik *.xhtml

Struktura pliku index.xhtml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>insert title here</title> </h:head> <h:body> <h1>sprawdź szansę na wygraną!</h1> <h:form > Podaj swoje dane: PESEL <h:inputtext /><br/> Imię <h:inputtext /><br/> Nazwisko <h:inputtext /><br/> </h:form> Dodano przestrzeń nazw h Nie ma konieczności stosować h:body lub h:head. Można używać samych nagłówków body i head. Jednakże przy stosowaniu f:ajax muszą być już tak jak w przykładzie. Te elementy są ignorowane w tym przykładzie. Powinny one posiadać atrybut <h:commandbutton value="wyślij" action="#{szansa.wyslij}"/> value wskazujący na właściwość odpowiedniego beana </h:body> </html> Szansa to nazwa klasy (beana). Wyślij to funkcja.

wygrana.xhtml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>insert title here</title> </h:head> <h:body> <h1>wygrałeś!! Gatulacje</h1> </h:body> </html> Tutaj nie ma treści dynamicznych, ale dobrym zwyczajem jest zawsze dodawać te elementy JSF 2

przegrana.xhtml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>insert title here</title> </h:head> <h:body> <h:form> <h1>przegrałeś!</h1> <p>spróbuj jeszcze raz <h:link value="kliknij" outcome="index" /> </p> </h:form> </h:body> </html>

szansa.java import javax.faces.bean.managedbean; @ManagedBean public class Szansa { } public String wyslij() { if (Math.random() < 0.2 ) { return "wygrana"; } else { return "przegrana"; } }

Rezultat

Rezultat

Przepływ informacji w JSF (wersja bardzo prosta)

@ManagedBean Adnotacja @ManagedBeans jest umieszczana przed deklaracją publicznej klasy @ManagedBean public class SomeName { } Nazwa klasy (bez nazwy pakietu i z małą pierwszą literą) jest równocześnie nazwą bean-a i pojawia się w wyrażeniu #{somename.cos} Nazwa cos po kropce może oznaczać nazwę funkcji (akcji w przypadku np. h:commandbutton) lub właściwości (zmiennej w klasie somename, do której dostęp jest możliwy dzięki funkcją get i set) Funkcja akcji kontrolera zwraca String. Jeżeli nie ma ustalonej konfiguracji w pliku faces-config.xml, wówczas tekst ten oznacza nazwy stron xhtml Strony te są w tym samym folderze, gdzie znajdowała się forma

Właściwości Wartości wejściowe odpowiadają właściwością bean-a <h:inputtext value="#{somebean.prop}" /> Gdy zawartość formy jest wysyłana (po wykonaniu submit), zawartość z pola tekstowego przekazywana jest jako argument funkcji setprop() Jako pierwsza uruchamiana jest wcześniej walidacja lub konwersja Przy wyświetlaniu formy, wywoływana jest funkcja getprop(). Domyślnie bean jest o zasięgu request. Bean jest tworzony dwukrotnie pierwszy raz, gdy formatka jest początkowo wyświetlana i drugi raz, gdy formatka jest submitowana Można użyć bezpośrednio wyrażenia #{somebean.prop} na stronie html. Wywołana jest zawsze wtedy funkcja getprop()

Przykład wybor.xhtml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>insert title here</title> </h:head> <h:body> <h1>wybierz język programowania JSF</h1> <h:form> Wpisz nazwę języka programowania JSF: <h:inputtext value="#{jezykform.jezyk}" /> <h:commandbutton value="wybierz" action="#{jezykform.wybor}" /> </h:form> </h:body> </html>

Przykład JezykForm.java import javax.faces.bean.managedbean; @ManagedBean public class JezykForm { private String jezyk; public String getjezyk() { } return jezyk; public void setjezyk(string jezyk) { } this.jezyk = jezyk;

LanguageBean.java } public String wybor() { if (jezyk==null jezyk.trim().isempty()) { return pusty-wybor"; } else if (jezyk.equals("java")) { return dobry-wybor"; } else { return zly-wybor"; } }

pusty-wybor.xhtml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>insert title here</title> </h:head> <h:body> <h1>nic nie wpisałeś</h1> <h:link outcome="wybor" >Spróbuj ponownie</h:link> </h:body> </html>

zly-wybor.xhtml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>insert title here</title> </h:head> <h:body> <h1>źle!</h1> <p>jesteś pewny, że JSF można tworzyć w #{jezykform.jezyk}?</p> </h:body> </html>

dobry-wybor.xhtml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>dobry wybór</title> </h:head> <h:body> </h:body> </html> <h1>bardzo dobrze!</h1>

Rezultat

Managed Bean

Managed bean Zwykły bean (konstruktor domyślny, gettery i settery, zmienne prywatne) może być Managed beanem Składa się z trzech części: Metod dostępu do elementów otrzymywanych z input Akcji kontrolera Miejsca na składowanie rezultatów Może służyć do przygotowanie stałych danych wejściowych Dla list rozwijanych (combobox)

Dostęp do zmiennych Nazwa metody Nazwa właściwości Przykład użycia JSF getfirstname setfirstname isexecutive setexecutive (typ boolean) getexecutive setexecutive (typ boolean) getzip setzip firstname executive executive ZIP #{customer.firstname} <h:inputtext value="#{customer.firstname}" /> #{customer.executive} <h:selectbooleancheckbox value="#{customer.executive}"/> #{customer.executive} <h:selectbooleancheckbox value="#{customer.executive}"/> #{address.zip} <h:inputtext value="#{address.zip}"/>

Eclipse szybkie tworzenie get i set W menu kontekstowym wybrać Source/Generate Getters and Setters public class Customer { } private String firstname; private String lastname; private boolean executive;

Managed Beans JSF zarządza beanami Tworzenie beanów wymagany jest jedynie bezargumentowy konstruktor Kontrolowanie życia beana Zasięg (request, session, appliaction) określa czas życia Wywołuje metody setxxx Np. przy <h:inputtext value="#{customer.firstname}" />, gdy forma jest submitowana, wartość jest przekazywana przez setfirstname Wywołuje metody getxxx Rezultatem polecenia #{customer.firstname} jest wywołanie funkcji getfirstname

Problem wydajnościowy funkcji getx Problem Metoda get może być wywoływana wielokrotnie Np. za każdym razem, gdy pojawi się <h:inputtext value="#{customer.firstname}" /> lub #{customer.firstname} wówczas wywoływana jest metoda getfirstname Jeżeli wówczas nawiązywane jest połączenie z bazą danych, wówczas jest to duży problem Rozwiązanie Przechowywać wartości w zmiennych, metoda get zwraca aktualną wartość private int zmienna = null; public int getzmienna() { if (zmienna==null) { zmienna = pobierzzmiennazbazydanych(); //lub wykonuj skompilowane obliczenia } return zmienna; }

Trzy części Managed beans Właściwości (pary metody gettter i setter) Jedna para get i set dla każdego z elementów wejściowych Setter jest automatycznie wywoływany przez JSF gdy forma jest submitowana. Wywołanie to następuje PRZED wykonaniem akcji kontrolera Metody kontrolera akcje Zazwyczaj jest tylko jedna akcja, ale może być kilka, gdy form zawiera wiele przycisków Funkcja akcji (odpowiadająca akcji przywiązanej do przycisku) jest wywoływana automatycznie Miejsce dla przechowywania rezultatów Dane nie są wywoływane bezpośrednio przez JSF. Rezultaty tworzone są akcje kontrolera w oparciu o logikę biznesową Dostęp do danych możliwy jest przez funkcję typu getter. Settery nie są potrzebne dla danych tego typu

Rozszerzony przepływ informacji (wciąż uproszczony)

Przykładowa aplikacja Założenia Wpisywany jest numer klienta i hasło Otrzymywane informacje: Strona prezentująca imię, nazwisko i stan konta (dwie wersje w zależności od stanu konta - ujemne i dodatnie) Strona błędu, w przypadku niepoprawnych danych Założenia Managed bean Właściwości odpowiadające danym wejściowym idklienta, haslo Metody akcji Kojarzy idklienta z Klientem i zachowuje Klienta jako zmienną Miejsce na rezultat Początkowa zmienna przechowująca dane Klienta jest pusta. Dostęp jedynie przez getter

bank-login.xhtml dane wejściowe <fieldset> <legend> Zaloguj się</legend> <h:form> Id klienta: Ta wartość odgrywa podwójną rolę. Gdy strona jest pierwszy raz wyświetlana, wywoływana jest funkcja getidklienta. Jeżeli wartość nie jest pustą, wyświetlana w tym miejscu. W przypadku submit, watość przekazywana jest metodą setidklienta do beana. <h:inputtext value="#{bankingbean.idklienta}"/> <br/> Hasło: <h:inputsecret value="#{bankingbean.haslo}"/> <br/> <h:commandbutton value="pokaż saldo" action="#{bankingbean.pokazsaldo}"/> </h:form> </fieldset>

BakingBean.java właściwości dla danych wejściowych private String idklienta, haslo; public String getidklienta() { return idklienta; } public void setidklienta(string idklienta) { this.idklienta = idklienta; if (idklienta.isempty()) { this.idklienta = "brak danych"; } } public String gethaslo() { return haslo; } public void sethaslo(string haslo) { this.haslo = haslo; }

BakingBean.java metody akcji private static KlientLookupService klientservice = new KlientSimpleMap(); public String pokazsaldo() { if (!haslo.equals("test")) { return "bank-zle-haslo"; } klient = klientservice.findklient( idklienta ); if (klient==null) { return "bank-nieznany-klient"; } else if (klient.getsaldo() < 0 ) { return "bank-ujemne-saldo"; } else { return "bank-normalne-saldo"; } } Te zmienne są wypełnione przed wywołaniem tej funkcji.

BankingBean.java dane rezultatów private Klient klient; Wypełniana jest przez kontroler public Klient getklient() { } return klient; Funkcja potrzebna, aby dostać się do składowych klasy Klient, np. tak: #{bankingbean.klient.imie}

Logika Biznesowa public interface KlientLookupService { public Klient findklient(string id); }

Logika biznesowa - implementacja public class KlientSimpleMap implements KlientLookupService { private Map<String, Klient> klienci; public KlientSimpleMap() { } klienci = new HashMap<String, Klient>(); Klient k1 = new Klient("Alicja", "Kowalska", "id01", -3453.44 ); Klient k2 = new Klient("Anna", "Nowak", "id02", 1234.56 ); Klient k3 = new Klient("Jerzy", "Kamiński", "id03", 987654.32 ); klienci.put(k1.getid(), k1); klienci.put(k2.getid(), k2); klienci.put(k3.getid(), k3); public Klient findklient(string id) { if (id!= null) { return klienci.get(id); } else { return null; } }

bank-normalne-saldo.xhtml <ul> </ul> <li>imie: #{bankingbean.klient.imie}</li> <li>nazwisko: #{bankingbean.klient.nazwisko}</li> <li>id: #{bankingbean.klient.id}</li> <li>saldo: #{bankingbean.klient.saldo}</li>

bank-nieznany-klient.xhtml <p>nieznany klient #{bankingbean.idklienta}</p> <p><a href="bank-login.xhtml">spróbuj ponownie</a></p>

Kontrolki Pole tekstowe <h:inputtext value="#{bean.wartosc}" /> Checkbox Pole domyślnie jest wypełnione zawartością właściwości pobranej funkcją get. <h:selectbooleancheckbox value="#{bean.wartosc}" /> Gdy funkcja get właściwości zwraca true, wówczas checkbox jest zaznaczony Combobox, lista rozwijana <h:selectonemenu value="#{bean.wartosc}" > Gdy wartość zwrócona przez funkcję get odpowiada wartości z listy, jest ona zaznaczona

Lista rozwijana Przykład <h:selectonemenu value="#{jakisbean.wartosc}"> <f:selectitems value="#{jakisbean.mozliwosci}"/> </h:selectonemenu> Gdy zawartość strony jest generowana, wówczas wywołana jest funkcja jakisbean.getmozliwosci. Zwraca ona zawartość rozwijanej listy. Następnie wywołana jest funkcja getwartosc. Jeżeli jej wartość znajduje się na liście, jest ona zaznaczona. Zmienna mozliwosci w bean powinna być typu List<SelectItem> lub SelectItem[].

Przykład strona z h:selectonemenu <!DOCTYPE > <html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html"> <h:head> </h:head> Przestrzeń nazw dla <f:selectitems

Przykład strona z h:selectonemenu <h:form> Wybierz język programowania: <h:selectonemenu value="#{wyborjezyka.jezyk}"> <f:selectitems value="#{wyborjezyka.listajezykow}"/> </h:selectonemenu> <h:commandbutton value="wybierz" action="#{wyborjezyka.wybierz}" /> </h:form>

Przykład strona z h:selectonemenu @ManagedBean public class WyborJezyka { private List<SelectItem> lista = null; public List<SelectItem> getlistajezykow() { if (lista == null) { lista = new ArrayList<SelectItem>(); lista.add(new SelectItem("C++", "Język C++")); lista.add(new SelectItem("Java", "Język Java")); lista.add(new SelectItem("C#", "Język C#")); } return lista; }

Przykład strona z h:selectonemenu