Budowa aplikacji wielowarstwowych. Obsługa zdarzeń, zastosowanie walidatorów, wykonanie listy typu Drop Down List.

Podobne dokumenty
Budowa aplikacji wielowarstwowych. Obsługa zdarzeń

Zastosowanie słuchaczy zdarzeń wg

Budowa aplikacji wielowarstwowych. zastosowanie walidatorów.

Zastosowanie walidatorów oraz komponentów wyboru wg

Budowa aplikacji wielowarstwowych. Zastosowanie technologii Ajax

Budowa aplikacji wielowarstwowych. Zastosowanie technologii Ajax

Budowa aplikacji wielowarstwowych. Zastosowanie konwerterów oraz plików typu properties.

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

Budowa prostej aplikacji wielowarstwowej

Zastosowanie słuchaczy zdarzeń, walidatorów oraz komponentów wyboru wg

Zastosowanie komponentów EJB typu Session

Budowa aplikacji wielowarstwowych. Zastosowanie szablonów

termin Podobna wada 2) jak w Sklep_ , zal. 3.0 termin

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

termin Podobna wada 2) jak w Sklep_ , zal. 3.0 termin

termin. Podobna wada 2) jak w Sklep_6

)<h:commandLink action="#{managed _produkt.dane_pro duktu}" value="ok" actionlistener="#{m anaged_produkt.

Kontynuacja programu z lab2 refaktoryzacja kodu oparta na dodaniu obiektu transferowego oraz stronicowania tabeli w formularzu JSF

Budowa aplikacji wielowarstwowych, zastosowanie obiektów transferowych, konwerterów i walidatorów

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

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

Wielowarstwowa aplikacja internetowa. Wykonanie widoku typu tabela. Pliki typu properties. wg

Programowanie komponentowe 5

Zastosowanie konwerterów wg

Zastosowanie technologii Ajax w ramach technologii JavaServer Faces wg

Kontynuacja programu z lab3 zaawansowane renderowanie formularzy JSF

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Aplikacje RMI Lab4

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Języki i metody programowania Java Lab2 podejście obiektowe

Budowa aplikacji wielowarstwowych. Zastosowanie Kaskadowych arkuszy stylów (CSS)

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

Konwersja danych. Programowanie komponentowe 4. wg bnaph.html

Diagram stanów Laboratorium 9


Podstawowe informacje o technologii Java Persistence API - przykład

Laboratorium 8 Diagramy aktywności

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Złożone komponenty JSF wg

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

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

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

Java Server Faces narzędzie do implementacji w wy prezentacji

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

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

Klasy i obiekty cz II

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

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

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

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

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

Podstawy technologii JavaServer Faces wg

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

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Aplikacje internetowe i rozproszone - laboratorium

Wykład 7: Pakiety i Interfejsy

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Aplikacje RMI

Programowanie obiektowe

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Tworzenie projektu zawierającego aplet w środowisku NetBeans. lab1. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

Diagramy stanów tworzenie modeli analizy i projektowania Na podstawie UML 2.0 Tutorial

Podstawowe informacje o technologii Java Persistence API - przykład

Nr pyt. 5 zal 4.0

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Instrukcja 3 Laboratorium z Podstaw Inżynierii Oprogramowania

Zaawansowane aplikacje internetowe

Testy jednostkowe - zastosowanie oprogramowania JUNIT 4.0 Zofia Kruczkiewicz

Programowanie obiektowe

Tworzenie i wykorzystanie usług

Instrukcja 5 Laboratorium z Podstaw Inżynierii Oprogramowania. Warstwy integracji z bazą danych: Wzorzec DAO Technologia ORM

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Programowanie obiektowe

Projekt INP Instrukcja 1. Autor Dr inż. Zofia Kruczkiewicz

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

Zaawansowane aplikacje WWW - laboratorium

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Projektowanie aplikacji internetowych laboratorium

Podstawy technologii JavaServer Faces wg

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

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

Komunikatory typu TCP/IP lab2. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Wprowadzenie do laboratorium. Zasady obowiązujące na zajęciach. Wprowadzenie do narzędzi wykorzystywanych podczas laboratorium.

Usługa TimerService

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Transkrypt:

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń, zastosowanie walidatorów, wykonanie listy typu Drop Down List. Laboratorium 5 Technologie internetowe Zofia Kruczkiewicz TINT_Lab_5, Zofia Kruczkiewicz 1

Wykaz pytań dotyczących materiału wykorzystanego w lab5, które należy opracować (wykłady: 3, 5, 6). 1. Jaką rolę pełni zdarzenie typu valuechangelistener? 2. Należy scharakteryzować sposoby definiowania obsługi zdarzeń valuechangelistener: <f:valuechangelistener type="pomoc.zmiana_danych"/>- co zonacza atrybut type? <f:valuechangelistener binding="#{managed_produkt.zmiana2"/> - co oznacza atrybut binding? oraz jako atrybut valuechangelistener w znaczniku <h:inputtext jak należy zdefiniować wartość tego atrybutu?. 3. Jaką rolę pełni zdarzenie actionlistener? 4. Co jest przypisane do atrybutu action? Co musi realizować ten atrybut? <h:commandlink action="#{managed_produkt.dodaj_produkt" value="ok" /> 5. Co jest przypisane do atrybutu action oraz atrybutu actionlistener? Jaka jest kolejność wykonywanych czynności zdefiniowanych za pomocą podanych atrybutów? Co musi realizować atrybut action? <h:commandlink action="#{managed_produkt.dane_produktu" value="ok" actionlistener="#{managed_produkt.dodaj_produkt" /> 6. Co realizuje atrybut action? Jaką rolę pełni znacznik <f:actionlistener? Jaka jest kolejność wykonywanych czynności zdefiniowanych za pomocą atrybutu action i znacznika <f:actionlistener? <h:commandlink action="rezultat2" value="ok" > <f:actionlistener binding="#{managed_produkt"/> </h:commandlink> 7. Należy opisać rolę znacznika <f:validatelongrange minimum="#{managed_produkt.min" maximum="#{managed_produkt.max"/> zagnieżdżonego w znaczniku <h:inputtext. Jaką rolę pełnią atrybuty tego znacznika? 8. Należy opisać rolę atrybutu validator znacznika <h:inputtext. Należy podać, jak definiuje się wartość tego atrybutu. validator="#{managed_produkt.zakrespromocji 9. Jaką rolę pełni znacznik <h:selectonemenu przy wprowadzaniu danych 10. Jaki atrybut znacznika <h:selectonemenu służy do pobrania wybranej wartości? 11. Jaką rolę pełni znacznik <f:selectitems value="#{managed_produkt.itemsavailableselectone"/> zagnieżdżony w znaczniku <h:selectonemenu. Jaką rolę pełni atrybut value tego zagnieżdżonego znacznika należy wyjaśnić, co jest przypisane do tego atrybutu i jaką pełni rolę? 2

1. Czynności początkowe Należy wykonać kopię programu Sklep_6, wykonanego podczas lab4 jako Sklep_5. Ustawić kodowanie UTF-8; po zaznaczeniu nazwy projektu w oknie Projects prawym klawiszem myszy wybrać pozycję Properties/Sources/Encoding/UTF-8 3

2. Obsługa zdarzeń typu valuechangelistener TINT_Lab_5, Zofia Kruczkiewicz 4

2.1. Należy wykonać pakiet o nazwie pomoc po kliknięciu prawym klawiszem myszy na nazwę projektu należy wybrać kolejno pozycje New/Other/Java/Java Package i po kliknięciu na klawisz Next w polu Package Name wpisać nazwę nowego pakietu: pomoc. 2.2. W pakiecie pomoc należy utworzyć nową klasę Zmiana_danych: po kliknięciu na pakiet pomoc prawym klawiszem myszy należy wybrać kolejno pozycje: New/Other/Java/Java Class i po kliknięciu na klawisz Next w polu Class Name wpisać nazwę nowej klasy: Zmiana_danych. 5

2.3 Wykonanie definicji klasy Zmiana_danych implementującej interfejs ValueChangeListener. Możliwa kontrola zdarzeń w wielu komponentach typu UI package pomoc; import javax.faces.application.facesmessage; import javax.faces.context.facescontext; import javax.faces.event.abortprocessingexception; import javax.faces.event.valuechangeevent; import javax.faces.event.valuechangelistener; public class Zmiana_danych implements ValueChangeListener{ int licznik; String klucz; public Zmiana_danych(String klucz_) { klucz = klucz_; public Zmiana_danych() { klucz= dane"; @Override public void processvaluechange(valuechangeevent event) throws AbortProcessingException { String nazwa; FacesContext context = FacesContext.getCurrentInstance(); String clientid = event.getcomponent().getclientid(); nazwa = "" + event.getnewvalue(); if (!nazwa.equals("")) { if (context.getexternalcontext().getsessionmap().containskey(klucz)) licznik = (int) context.getexternalcontext().getsessionmap().get(klucz); licznik++; FacesMessage message = new FacesMessage("Stan licznika zmian " + klucz + ": " + licznik); context.getexternalcontext().getsessionmap().put(klucz, licznik); context.addmessage(clientid, message); Jeśli wystąpią błędy konwersji (int), należy zastosować konwersję (Integer) Klucz pozwala przechowywać informacje w kolekcji implementującej interfejs Map, pochodzące z różnych komponentów UI służących do wprowadzania danych. 6

2.4. Zastosowanie definicji klasy Zmiana_danych implementującej interfejs ValueChangeListener wg str. 45, wykład 6 (odwołanie do ścieżki pakietowej za pomocą atrybutu type). <h:outputlabel value="#{bundle['dodaj_produkt2.nazwa']" for="nazwa" /> <h:inputtext id="nazwa" title="#{bundle['dodaj_produkt2.nazwa1']" value="#{managed_produkt.nazwa" required="true" requiredmessage="#{bundle['dodaj_produkt2.blad_nazwa']" > <f:valuechangelistener type="pomoc.zmiana_danych"/> </h:inputtext> TINT_Lab_5, Zofia Kruczkiewicz 7

2.5 Prezentacja wyniku TINT_Lab_5, Zofia Kruczkiewicz 8

2.5 Prezentacja wyniku (cd) TINT_Lab_5, Zofia Kruczkiewicz 9

2.6. Uwaga dodatkowa: w celu dokonania zmian w kodzie Java aplikacji należy dokonać operacji Undeploy TINT_Lab_5, Zofia Kruczkiewicz 10

2.7. Zastosowanie definicji klasy Zmiana_danych implementującej interfejs ValueChangeListener wg str. 45, wykład 6 (odwołanie do obiektu za pomocą atrybutu binding) <h:outputlabel value="#{bundle['dodaj_produkt2.nazwa']" for="nazwa" /> <h:inputtext id="nazwa title="#{bundle['dodaj_produkt2.nazwa1']" value="#{managed_produkt.nazwa" required="true requiredmessage="#{bundle['dodaj_produkt2.blad_nazwa']" > <f:valuechangelistener binding="#{managed_produkt.zmiana1"/> </h:inputtext> <h:outputlabel value="#{bundle['dodaj_produkt2.cena']" for="cena" /> <h:inputtext id="cena" title="#{bundle['dodaj_produkt2.cena1']" value="#{managed_produkt.cena" required="true" requiredmessage="#{bundle['dodaj_produkt2.blad_cena']" converter="#{managed_produkt.number_convert" convertermessage="blad! Poprawny format: 0,0 zł lub 0 zł" > </h:inputtext> <f:valuechangelistener binding="#{managed_produkt.zmiana2"/> 11

2.8. Zastosowanie definicji klasy Zmiana_danych implementującej interfejs ValueChangeListener wg str. 45,wykład 6. Odwołanie do obiektu za pomocą atrybutu binding wymaga utworzenie obiektu typu Zmiana_danych. Ponieważ obecnie obsługą zdarzeń objęto pola nazwa i cena na stronie dodaj_produkt2.xhtml, wykonano dwa niezależnie obiekty typu Zmiana_danych @Named(value = "managed_produkt") @RequestScoped public class Managed_produkt { @EJB private Fasada_warstwy_biznesowej fasada; public Managed_produkt() { private String nazwa; private float cena; private int promocja; private String cena_brutto; private DataModel items; private int stan = 1; private Date data_produkcji; private Zmiana_danych zmiana1= new Zmiana_danych("nazwa"); private Zmiana_danych zmiana2= new Zmiana_danych("cena"); public Zmiana_danych getzmiana1() { return zmiana1; public void setzmiana1(zmiana_danych zmiana) { this.zmiana1 = zmiana; public Zmiana_danych getzmiana2() { return zmiana2; public void setzmiana2(zmiana_danych zmiana2) { this.zmiana2 = zmiana2; 12

2.9 Prezentacja wyniku TINT_Lab_5, Zofia Kruczkiewicz 13

2.9 Prezentacja wyniku (cd) 2.10. Zadanie do wykonania: Należy dodać obsługę zdarzeń dla wybranego atrybutu ze strony dodaj_produkt2.xhtml z wykorzystaniem atrybutu binding znacznika <f: valuechangelistener TINT_Lab_5, Zofia Kruczkiewicz 14

3. Obsługa zdarzeń typu actionlistener TINT_Lab_5, Zofia Kruczkiewicz 15

3.1. Obsługa zdarzeń typu ActionListener (str. 46, wykład6) zmiana definicji znacznika <h:commandlink na stronie dodaj_produkt2.xhtml oraz modyfikacja metod obsługujących ten znacznik w klasie typu Managed_produkt. Stan przed zmianą. Strona dodaj_produkt2.xhtml <h:commandlink action="#{managed_produkt.dodaj_produkt" value="ok" /> Klasa typu Managed_produkt public String dodaj_produkt() { String[] dane = {nazwa, "" + cena, "" + promocja; fasada.utworz_produkt(dane, data_produkcji); dane_produktu(); return "rezultat2"; public void dane_produktu() { stan = 1; String[] dane = fasada.dane_produktu(); if (dane == null) { stan = 0; else { nazwa = dane[0]; cena = Float.parseFloat(dane[1]); promocja = Integer.parseInt(dane[2]); cena_brutto = dane[3]; data_produkcji.settime(long.parselong(dane[4])); 16

3.2. Obsługa zdarzeń typu ActionListener (str. 46, wykład6) zmiana definicji znacznika <h:commandlink na stronie dodaj_produkt2.xhtml oraz modyfikacja metod obsługujących ten znacznik w klasie typu Managed_produkt. Stan po zmianie. Strona dodaj_produkt2.xhtml <h:commandlink action="#{managed_produkt.dane_produktu" value="ok" actionlistener="#{managed_produkt.dodaj_produkt" /> Klasa typu Managed_produkt public void dodaj_produkt() { String[] dane = {nazwa, "" + cena, "" + promocja; fasada.utworz_produkt(dane, data_produkcji); public String dane_produktu() { stan = 1; String[] dane = fasada.dane_produktu(); if (dane == null) { stan = 0; else { nazwa = dane[0]; cena = Float.parseFloat(dane[1]); promocja = Integer.parseInt(dane[2]); cena_brutto = dane[3]; data_produkcji.settime(long.parselong(dane[4])); return "rezultat2"; 17

3.3. Prezentacja wyniku TINT_Lab_5, Zofia Kruczkiewicz 18

3.4. Obsługa zdarzeń typu ActionListener (str. 46, wykład6) zmiana definicji znacznika <h:commandlink na stronie dodaj_produkt2.xhtml oraz modyfikacja metod obsługujących ten znacznik w klasie typu Managed_produkt. Klasa ta implementuje interfejs ActionListener. Stan po zmianie. Strona dodaj_produkt2.xhtml <h:commandlink action="#{managed_produkt.dane_produktu" value="ok" > <f:actionlistener binding="#{managed_produkt"/> </h:commandlink> Klasa typu Managed_produkt package warstwa_internetowa; import java.util.date; import javax.ejb.ejb; import javax.inject.named; import javax.enterprise.context.requestscoped; import javax.faces.convert.numberconverter; import javax.faces.event.abortprocessingexception; import javax.faces.event.actionevent; import javax.faces.event.actionlistener; import javax.faces.model.datamodel; import javax.faces.model.listdatamodel; import pomoc.zmiana_danych; import warstwa_biznesowa.fasada_warstwy_biznesowej; @Named(value = "managed_produkt") @RequestScoped public class Managed_produkt implements ActionListener{ 19

3.5. Obsługa zdarzeń typu ActionListener (str. 46, wykład6) zmiana definicji znacznika <h:commandlink na stronie dodaj_produkt2.xhtml oraz modyfikacja metod obsługujących ten znacznik w klasie typu Managed_produkt. Klasa ta implementuje interfejs ActionListener. Stan po zmianie (cd) public void dodaj_produkt() { String[] dane = {nazwa, "" + cena, "" + promocja; fasada.utworz_produkt(dane, data_produkcji); public String dane_produktu() { stan = 1; String[] dane = fasada.dane_produktu(); if (dane == null) { stan = 0; else { nazwa = dane[0]; cena = Float.parseFloat(dane[1]); promocja = Integer.parseInt(dane[2]); cena_brutto = dane[3]; data_produkcji.settime(long.parselong(dane[4])); return "rezultat2"; public void processaction(actionevent event) throws AbortProcessingException { dodaj_produkt(); 20

3.6. Prezentacja wyniku 3.7. Zadanie do wykonania: Należy dodać obsługę zdarzeń dla znacznika <h:commandlink tak, aby jego definicja była następująca: <h:commandlink action="rezultat2" value="ok" > <f:actionlistener binding="#{managed_produkt"/> </h:commandlink> definiując odpowiednio w klasie typu Managed_produkt metodę public void processaction(actionevent event) throws AbortProcessingException { /* */ 21

4. Walidacja danych TINT_Lab_5, Zofia Kruczkiewicz 22

4.1. Pierwszy sposób przy wprowadzaniu danych (str. 58, wykład 6) zastosowanie walidatora LongRangeValidator Plik dodaj_produkt2.xhtml <h:outputlabel value="#{bundle['dodaj_produkt2.promocja']" for="promocja" /> <h:inputtext id="promocja" title="#{bundle['dodaj_produkt2.promocja1']" value="#{managed_produkt.promocja" required="true" requiredmessage="#{bundle['dodaj_produkt2.blad_promocja']" > <f:converter converterid="javax.faces.integer" /> <f:validatelongrange minimum="#{managed_produkt.min" maximum="#{managed_produkt.max"/> </h:inputtext> ================================================================================== Klasa Managed_produkt public int getmin() { return 0; public int getmax() { return 100; TINT_Lab_5, Zofia Kruczkiewicz 23

4.2. Prezentacja wyników TINT_Lab_5, Zofia Kruczkiewicz 24

4.3. Drugi sposób przy wprowadzaniu danych zastosowanie metody do walidacji danych o następującej liście parametrów: (FacesContext context, UIComponent tovalidate, Object value) do obsługi atrybutu validator znacznika do wprowadzania danych. Plik dodaj_produkt2.xhtml <h:outputlabel value="#{bundle['dodaj_produkt2.promocja']" for="promocja" /> <h:inputtext id="promocja" title="#{bundle['dodaj_produkt2.promocja1']" value="#{managed_produkt.promocja" required="true" requiredmessage="#{bundle['dodaj_produkt2.blad_promocja']" validator="#{managed_produkt.zakrespromocji"> <f:converter converterid="javax.faces.integer" /> </h:inputtext> TINT_Lab_5, Zofia Kruczkiewicz 25

4.4. Drugi sposób przy wprowadzaniu danych definicja metody do walidacji danych o następującej liście parametrów: (FacesContext context, UIComponent tovalidate, Object value) Klasa Managed_produkt (należy uzupełnić importy klas przez wykorzystanie pozycji Fix Imports) package warstwa_internetowa; import java.util.date; import javax.ejb.ejb; import javax.inject.named; import javax.enterprise.context.requestscoped; import javax.faces.application.facesmessage; import javax.faces.component.uicomponent; import javax.faces.component.uiinput; import javax.faces.context.facescontext; import javax.faces.convert.numberconverter; import javax.faces.event.abortprocessingexception; import javax.faces.event.actionevent; import javax.faces.event.actionlistener; import javax.faces.model.datamodel; import javax.faces.model.listdatamodel; import pomoc.zmiana_danych; import warstwa_biznesowa.fasada_warstwy_biznesowej; @Named(value = "managed_produkt") @RequestScoped public class Managed_produkt implements ActionListener{ /* */ public void zakrespromocji(facescontext context, UIComponent tovalidate, Object value) { stan = 1; int input =((Long) value).intvalue(); if (input < getmin() input > getmax()) { ((UIInput) tovalidate).setvalid(false); FacesMessage message = new FacesMessage("Dane poza zakresem"); context.addmessage(tovalidate.getclientid(context), message); stan = 0; 26

4.5 Prezentacja wyników 4.6. Zadanie do wykonania: Zastosować jeden z wybranych sposobów walidacji do pola cena TINT_Lab_5, Zofia Kruczkiewicz 27

5. Zastosowanie komponentu h:selectonemenu (typu Drop Down List) na stronie lista_produktow2.xhtml do wyboru promocji TINT_Lab_5, Zofia Kruczkiewicz 28

5.1. Należy wykonać kopię programu Sklep_6 o nazwie Sklep_7 29

5.2. Dodanie do strony dodaj_produkt2.xhtml komponentu typu h:selectonemenu do wprowadzania promocji (zmiana dotychczas stosowanego znacznika <h:inputtext do wprowadzania promocji). Należy usunąć niepotrzebny kod z klasy typu Managed_produkt. <h:outputlabel value="#{bundle['dodaj_produkt2.promocja']" for="promocja" /> <h:selectonemenu id="promocja" title="#{bundle['dodaj_produkt2.promocja1']" value="#{managed_produkt.promocja" required="true" requiredmessage="#{bundle['dodaj_produkt2.blad_promocja']" > <f:selectitems value="#{managed_produkt.itemsavailableselectone"/> </h:selectonemenu> TINT_Lab_5, Zofia Kruczkiewicz 30

5.3. Należy dodać do pakietu pomoc nową klasę JSFPomoc i wstawić następujący kod metody getselectitems do tej klasy package pomoc; import java.util.list; import javax.faces.model.selectitem; public class JSFPomoc { public static SelectItem[] getselectitems(list<?> entities, boolean selectone) { int size = selectone? entities.size() + 1 : entities.size(); SelectItem[] items = new SelectItem[size]; int i = 0; if (selectone) { items[0] = new SelectItem("", "---"); i++; for (Object x : entities) { items[i++] = new SelectItem(x, x.tostring()); return items; 31

5.4. Dodanie metody w klasie Fasada_warstwy_biznesowej do generowania modelu listy rozwijanej, zawierającej wykaz promocji do wyboru z listy public ArrayList<Integer> findall() { ArrayList<Integer> pom = new ArrayList(); pom.add(0); pom.add(10); pom.add(20); pom.add(50); return pom; TINT_Lab_5, Zofia Kruczkiewicz 32

5.5. Dodanie do klasy Managed_produkt metody obsługującej wybór z listy właściwość managed_produkt.itemsavailableselectone dla znacznika f:selectitems value public SelectItem[] getitemsavailableselectone() { return JSFPomoc.getSelectItems(fasada.findAll(), true); TINT_Lab_5, Zofia Kruczkiewicz 33

5.6. Prezentacja działania programu (1) 34

5.7. Prezentacja programu (2) 35