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

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

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

Budowa aplikacji wielowarstwowych. Zastosowanie szablonów

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

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

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

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

Budowa prostej aplikacji wielowarstwowej

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

Zastosowanie słuchaczy zdarzeń wg

Złożone komponenty JSF wg

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

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń

Podstawowe informacje o technologii Java Persistence API - przykład

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

Budowa aplikacji wielowarstwowych. Zastosowanie technologii Ajax

Budowa aplikacji wielowarstwowych. Zastosowanie technologii Ajax

Złożone komponenty JSF wg

Zastosowanie komponentów EJB typu Session

Podstawy technologii JavaServer Faces wg

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

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Podstawowe informacje o technologii Java Persistence API - przykład

Programowanie komponentowe 5

Budowa aplikacji wielowarstwowych. zastosowanie walidatorów.

Kontynuacja programu z lab3 zaawansowane renderowanie formularzy JSF


Zastosowanie konwerterów wg

Zastosowanie technologii Ajax w ramach technologii JavaServer Faces wg

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

Nr pyt. 5 zal 4.0

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.

Zastosowanie kaskadowych arkuszy stylów (CSS - Cascading Style Sheets) w technologii JavaServer Faces

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

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.

Facelets ViewHandler

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

Konwersja danych. Programowanie komponentowe 4. wg bnaph.html

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

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

Programowanie wielowarstwowe i komponentowe

Podstawy technologii JavaServer Faces wg

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

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Aplikacje RMI Lab4

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

Zastosowanie technologii Ajax w ramach technologii JavaServer Faces wg

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

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

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

Podstawy technologi JavaServer Faces

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

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

Wykład 2 TINT. XHTML tabele i ramki. Zofia Kruczkiewicz

JavaServer Faces (JSF)

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Aplikacje WWW - laboratorium

Diagram stanów Laboratorium 9

Laboratorium 7 Blog: dodawanie i edycja wpisów

Klasy i obiekty cz II

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

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

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

Laboratorium 6 Tworzenie bloga w Zend Framework

Zaawansowane aplikacje WWW - laboratorium

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

Aplikacje WWW - laboratorium

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Instrukcja 3 Laboratorium z Podstaw Inżynierii Oprogramowania

Aplikacje internetowe i rozproszone - laboratorium

Laboratorium 8 Diagramy aktywności

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

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

Budowa aplikacji wielowarstwowych cd Dostęp do bazy danych w oparciu o technologię ORM (Object Relational Mapping)

Java Server Faces - wprowadzenie

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Aplikacje WWW - laboratorium

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

Zastosowanie walidatorów oraz komponentów wyboru wg

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

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

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

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Wykład 3 Inżynieria oprogramowania. Przykład 1 Bezpieczeństwo(2) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

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

Programowanie wielowarstwowe i komponentowe JSP, JSF

Wykład 2 Tabele i ramki 1. Tabele 1.1. Podstawy budowy tabel na stronach WWW

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

Ćwiczenia 9 - Swing - część 1

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Transkrypt:

Budowa aplikacji wielowarstwowych. Zastosowanie szablonów, tabel oraz plików typu properties Laboratorium 3 Technologie internetowe Zofia Kruczkiewicz 1

Wykaz pytań dotyczących materiału wykorzystanego w lab3, które należy opracować (wykłady : 4,5, instrukcja do lab1). 1. Jakie atrybuty obiektów typu Produkt1 służą do porównania instancji tej klasy? Jaka metoda służy do tego celu? 2. Jak obecnie są przechowywane obiekty typu Produkt1 w obiekcie typu Fasada_warstwy_biznesowej? 3. Jak ustawia się informację o braku wstawienia nowego obiektu typu Produkt1 w metodzie utworz_produkt w klasie Fasada_warstwy_biznesowej? W jakiej metodzie jest ta informacja ustalana podczas próby wstawienia produktu o atrybutach wstawionego już wcześniej produktu? 4. Jak w metodzie dane_produktu() w klasie Fasada_warstwy_biznesowej wykonuje się model ostatnio wstawionego produktu, a jak w przypadku braku wstawionego produktu? 5. Jak obiekt typu Managed_produkt ustala sposób prezentowania informacji o wprowadzonym nowym produkcie: 5.1. w przypadku produktu o wartościach atrybutów, których nie zawiera żaden wcześniej wprowadzony produkt? 5.2. w przypadku produktu o wartościach atrybutów, które zawiera wcześniej wprowadzony produkt? 6. Należy wyjaśnić, kiedy wyświetlany jest napis: Taki produkt juz istnieje na stronie rezultat2.xhtml lub pełna informacja o produkcie czy wynika z wartości zwracanej przez metodę getstan() w atrybutach rendered wyjaśniając fragment kodu strony JSF: <h:outputtext escape="false" value= "Taki produkt juz istnieje" rendered="#{managed_produkt.stan==0"/> <h:panelgrid columns="2" rendered="#{managed_produkt.stan!=0"> 7. Jak ustalana jest wartość atrybutu stan w obiekcie typu Managed_produkt? 8. Jak tworzona jest zawartość komponentu <h:datatable> na stronie lista_produktow.xhtml? 9. Kiedy na stronie lista_produktow.xhtml wyświetlany jest napis zdefiniowany w atrybucie value analizując fragment kodu strony JSF: <h:outputtext escape="false" value="#{bundle.lista_produktow_pusta" rendered="#{managed_produkt.items.rowcount == 0"/> 10. Jaka rolę pełni plik Bundle.properties w budowie stron xhtml? Jak należy korzystać z tego pliku? 2

Przykład 3 Zastosowanie szablonu i znacznika h:datatable do prezentowania zbioru produktów. Należy w proponowanych zmianach w projekcie z przykładu 3 uwzględnić nowy/nowe atrybut/atrybuty obiektu typu Produkt1, wprowadzone podczas realizacji zadania w lab2. 3

1. Tworzenie kopii projektu typu Web Application o nazwie Sklep_3 z lab2 - Przykład1 (prawy klawisz myszy na nazwie projektu i wybór Copy na formularzu kopiowania należy podać nową nazwę projektu Sklep_3. Projekt źródłowy Sklep_2 należy zamknąć, spakować do formatu zip lub rar i usunąć wersję niespakowaną. 1.1. Należy zmienić nazwy plików dodaj_produkt1 i rezultat1 na dodaj_produkt2 i rezultat2 w folderze warstwa_internetowa_jsf następująco: kliknąć prawym klawiszem myszy na nazwę strony np. dodaj_produkt1.xtml i wybrać kolejno z list: Refactor/Rename. W formularzu Rename, w polu New Name należy wprowadzić nową nazwę: dodaj_produkt2. Podobnie należy zmienić nazwę strony rezultat2.xhtml.

1. Tworzenie kopii projektu typu Web Application o nazwie Sklep_3 z lab2 - cd 1.2. Należy otworzyć zakładkę Services i uruchomić GlassFish Server 1.3. Jeśli pojawi się na liście Applications program będący źródłem kopiowania (Sklep_2 w omawianym przykładzie) należy wykonać na nim operację Undeploy. Po tej operacji ten program zostanie usunięty z listy.

2. Należy zmodyfikować kod klasy Produkt1 metodę equals. Można to wykonać ręcznie lub usunąć dotychczasową metodę equals i za pomocą opcji Insert Code/equals and hashcode() wygenerować nową wersję metody equals, porównującej np. wszystkie atrybuty, jakie posiada klasa Produkt1 ( z uwzględnieniem pól wprowadzonych w lab2). W przykładzie w wygenerowannej metodzie equals zastosowano klasę Objects w przeciwnym wypadku metoda equals może być rozbudowana o kod metody equals z klasy Objects. @Override public boolean equals(object obj) { if (this == obj) return true; if (obj == null) return false; if (getclass()!= obj.getclass()) return false; Należy pominąć przy porównaniu atrybutów obiektów typu Produkt1 atrybut id ponieważ kążdy nowy obiekt posiada inną wartość, nawet jeśli pozostałe atrybuty mają identyczne wartości. final Produkt1 other = (Produkt1) obj; if (Float.floatToIntBits(this.cena)!= Float.floatToIntBits(other.cena)) return false; if (this.promocja!= other.promocja) return false; if (!Objects.equals(this.nazwa, other.nazwa)) return false; /* if (!Objects.equals(this.id, other.id)) return false;*/ return true; //metoda pomocniczej klasy Objects z //pakietu util public static boolean equals(object a, Object b) { return (a == b) (a!= null && a.equals(b)); 6

3. Należy zmodyfikować kod klasy Fasada_warstwy_biznesowej package warstwa_biznesowa; import java.util.arraylist; import java.util.linkedlist; import javax.ejb.stateless; import warstwa_biznesowa.entity.produkt1; @Stateless public class Fasada_warstwy_biznesowej { static long klucz = 0; private LinkedList<Produkt1> produkty = new LinkedList(); boolean stan = false; public LinkedList<Produkt1> getprodukty() { return produkty; public void setprodukty(linkedlist<produkt1> produkty) { this.produkty = produkty; Zmienna do nadawania unikatowych wartości id dla obiektu typu Produkt1 Przechowywanie listy produktów o unikatowych danych Zmienna określająca, czy dodano nowy produkt: wartość false oznacza próbę wprowadzenia produktu o danych, które nie są unikatowe public void utworz_produkt(string dane[]) { Dodawanie nowego produktu Produkt1 produkt = new Produkt1(); klucz++; Nadawanie unikatowej wartości atrybutowi produkt.setid(new Long(klucz)); Id obiektu typu Produkt1 produkt.setnazwa(dane[0]); produkt.setcena(float.parsefloat(dane[1])); produkt.setpromocja(integer.parseint(dane[2])); dodaj_produkt(produkt); 7

protected void dodaj_produkt(produkt1 produkt) { if (!produkty.contains(produkt)) { produkty.add(produkt); stan = true; else stan = false; public String[] dane_produktu() { if (stan) { Produkt1 produkt = produkty.get(produkty.size() - 1); String nazwa = produkt.getnazwa(); String cena = "" + produkt.getcena(); String promocja = "" + produkt.getpromocja(); String cena_brutto = "" + produkt.cena_brutto(); String dane[] = {nazwa, cena, promocja, cena_brutto; return dane; return null; public ArrayList<ArrayList<String>> items() { ArrayList<ArrayList<String>> dane = new ArrayList(); for (Produkt1 p : produkty) { ArrayList<String> wiersz = new ArrayList(); wiersz.add(p.getid().tostring()); wiersz.add(p.getnazwa()); wiersz.add("" + p.getcena()); wiersz.add("" + p.getpromocja()); wiersz.add("" + p.cena_brutto()); dane.add(wiersz); return dane; Dodawanie nowego produktu sprawdzenie w metodzie contains kolekcji produkty, czy nowy obiekt jest unikatowy. W metodzie contains wywoływana jest metoda equals zdefiniowana w klasie Produkt1. Wartość zmiennej stan równy true oznacza wprowadzenie danej. Dane ostatnio wprowadzonego produktu przenaczone do prezentacji. Zwracane wartość null przez metodę oznacza brak dodania nowego produktu. Dane przechowywanych obiektów typu Produkt1 przeznaczone do prezentacji w komponencie datatable Jest to kolekcja elementów, które są kolekcją elementów typu String reprezentująca atrybuty i wyliczoną cenę brutto obiektu typu Produkt1 8

package warstwa_internetowa; import warstwa_biznesowa.fasada_warstwy_biznesowej; import javax.ejb.ejb; import javax.faces.bean.managedbean; import javax.faces.bean.requestscoped; import javax.faces.model.datamodel; import javax.faces.model.listdatamodel; @ManagedBean @RequestScoped public class Managed_produkt { 4. Należy zmodyfikować definicję klasy Managed_produkt @EJB private Fasada_warstwy_biznesowej fasada; private String nazwa; private String cena; private String promocja; private String cena_brutto; private DataModel items; private int stan = 1; public Managed_produkt() { DataModel model danych komponentu datatable stan zmienna oznaczająca warunki renderowania. Wartość 1 pozwala wyświetlać informację o wprowadzony produkcie na stronie rezultat2.xhtml. public Fasada_warstwy_biznesowej getfasada() { return fasada; public void setfasada(fasada_warstwy_biznesowej fasada) { this.fasada = fasada; 9

public String getnazwa() { return nazwa; public void setnazwa(string nazwa) { this.nazwa = nazwa; public String getcena() { return cena; public void setcena(string cena) { this.cena = cena; public String getpromocja() { return promocja; public void setpromocja(string promocja) { this.promocja = promocja; public String getcena_brutto() { return cena_brutto; public void setcena_brutto(string cena_brutto) { this.cena_brutto = cena_brutto; 10

public DataModel utworz_datamodel() { return new ListDataModel(fasada.items()); public DataModel getitems() { if (items == null) { items = utworz_datamodel(); return items; Utworzenie modelu komponentu datatable na podstawie kolekcji zawierających elementy reprezentujące wiersz tabeli (kolekcja obiektów typu String reprezentująca atrybuty obiektu typu Produkt oraz cenę brutto) public void setitems(datamodel items) { this.items = items; public int getstan() { return stan; public void setstan(int stan) { this.stan = stan; 11

Dodane metod do klasy Managed_produkt obsługujących dodawanie produktu (dodaj_produkt) po pobraniu danych z formularza za pomocą atrybutów: nazwa, cena, promocja i wywołaniu metody utworz_produkt ziarna EJB z obiektu fasada klasy typu Fasada_warstwy_biznesowej oraz wyświetlanie danych za pomocą metody dane_produktu pobranych z warstwy biznesowej od obiektu typu EJB fasada za pomocą metody dane_produktu public String dodaj_produkt() { String[] dane = {nazwa, cena, promocja; fasada.utworz_produkt(dane); 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 = dane[1]; promocja = dane[2]; cena_brutto = dane[3]; 12

5. Należy zmodyfikować definicję szablonu template.xhtml dodanie w części przeznaczonej na menu (id=left) linku do strony lista_produktow.xhtml oraz znacznik <h:panelgroup> do obsługi wyświetlania błędów podczas wstawiania danych <?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:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <h:outputstylesheet name="css/default.css" /> <h:outputstylesheet name="css/csslayout.css"/> <title><ui:insert name="title">facelets Template</ui:insert></title> </h:head> <h:body> <div id="top"> <ui:insert name="top">top</ui:insert> </div> 13

<div> <div id="left"> <h:link outcome="/faces/warstwa_internetowa_jsf/dodaj_produkt2" value="dodaj produkt"/><br/> <h:link outcome="/faces/warstwa_internetowa_jsf/lista_produktow" value="lista produktow"/> </div> <div id="content" class="left_content"> <ui:insert name="content">content</ui:insert> </div> </div> <h:panelgroup id="messagepanel" layout="block"> <h:messages errorstyle="color: red" infostyle="color: green" /> </h:panelgroup> <div id="bottom"> <ui:insert name="bottom">bottom</ui:insert> </div> </h:body> </html> 14

6. Należy do strony rezultat2.xhtml dodać kod JSF umożliwiający wyświetlenie komunikatu Taki produkt już istnieje w przypadku próby wprowadzenia produktu o tych samych danych, jakie ma produkt wcześniej wprowadzony zamiast danych ponownie wprowadzanych danych. Umożliwia to atrybut rendered badający wartość atrybutu stan, ustawiany w obiekcie managed_produkt <?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:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:h="http://xmlns.jcp.org/jsf/html"> <body> <ui:composition template="./../template.xhtml"> <ui:define name="title"> Rezultat </ui:define> 15

<ui:define name="content"> <h:form> <h:outputtext escape="false" value= "Taki produkt juz istnieje" rendered="#{managed_produkt.stan==0"/> <h:panelgrid columns="2" rendered="#{managed_produkt.stan!=0"> <h:outputlabel value="nazwa produktu" for="nazwa" /> <h:outputtext id="nazwa" value="#{managed_produkt.nazwa"/> <h:outputlabel value="cena produktu" for="cena" /> <h:outputtext id="cena" value="#{managed_produkt.cena"/> <h:outputlabel value="promocja produktu" for="promocja" /> <h:outputtext id="promocja" value="#{managed_produkt.promocja"/> <h:outputlabel value="cena brutto produktu" for="brutto" /> <h:outputtext id="brutto" value="#{managed_produkt.cena_brutto" /> </h:panelgrid> <h:commandbutton id="powrot" value="powrot" action="/faces/index1"/> </h:form> </ui:define> Dane ostatnio wprowadzone go produktu są wyświetlane warunkowo </ui:composition> </body> </html> 16

7. Należy w pliku kaskadowego arkusza stylu csslayout.css w katalogu projektu: Web Pages/resources/css (okno Projects) wprowadzić zmianę stylu wyświetlania części strony w pliku template.xhrml: <div id="content" class="left_content"> <ui:insert name="content">content</ui:insert> </div> w stylu o nazwie.left_content, aby ustalić obszar przeznaczony na część roboczą strony.left_content { background-color: #dddddd; padding: 5px; margin-left: 170px;.left_content { background-color: #dddddd; padding: 5px; margin-left: 170px; min-height: 50px; 17

8. Należy dodać do projektu stronę lista_produktow.xhtml opartą na szablonie template.xhtml i umieścić w katalogu Web Pages/warstwa_internetowa_jsf (okno Projects) poniżej zawartość strony lista_produktow.xhtml do wyświetlania listy produktów dodana do projektu- New/Other/JavaServer Faces/ Facelets Template Client... <?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:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core"> <body> <ui:composition template="./../template.xhtml"> <ui:define name="title"> <h:outputtext value="#{bundle.lista_produktow_tytul"></h:outputtext> </ui:define> <ui:define name="content"> <h:form> Jeżeli brak danych pobranych z modelu items typu DataModel (rowcount==0), wtedy wyświetla się napis bundle.lista_produktow_pusta (czyli Brak danych), w przeciwnym wypadku wyświetla się tabelę <h:datatable> (następne dwa slajdy). <h:outputtext escape="false" value="#{bundle.lista_produktow_pusta" rendered="#{managed_produkt.items.rowcount == 0"/> <h:panelgroup rendered="#{managed_produkt.items.rowcount > 0"> 18

<h:datatable value="#{managed_produkt.items" var="item" border="0" cellpadding="2" cellspacing="0" rowclasses="jsfcrud_odd_row,jsfcrud_even_row" rules="all" style="border:solid 1px"> Komponent typu datatable zbindowany z obiektem items typu DataModel <h:column> <f:facet name="header"> Nagłówek kolumny tabeli datatable <h:outputtext value="#{bundle.lista_produktow_id"/> </f:facet> <h:outputtext value="#{item.get(0)"/> </h:column> <h:column> <f:facet name="header"> <h:outputtext value="#{bundle.lista_produktow_nazwa"/> </f:facet> <h:outputtext value="#{item.get(1)"/> </h:column> <h:column> <f:facet name="header"> <h:outputtext value="#{bundle.lista_produktow_cena"/> </f:facet> <h:outputtext value="#{item.get(2)"/> </h:column> Item element kolekcji items (zawierający dane atrybutów obiektu typu Produkt oraz cenę brutto Kolejny element kolekcji item (zawierający dane atrybutu id obiektu typu Produkt), która jest elementem kolekcji items typu DataModel Kolejny element kolekcji item (zawierający dane atrybutu nazwa obiektu typu Produkt), która jest elementem kolekcji items typu DataModel Kolejny element kolekcji item (zawierający dane atrybutu cena obiektu typu Produkt), która jest elementem kolekcji items typu DataModel

<h:column> <f:facet name="header"> <h:outputtext value="#{bundle.lista_produktow_promocja"/> </f:facet> <h:outputtext value="#{item.get(3)"/> </h:column> <h:column> <f:facet name="header"> <h:outputtext value="#{bundle.lista_produktow_cenabrutto"/> </f:facet> <h:outputtext value="#{item.get(4)"/> </h:column> </h:datatable> </h:panelgroup> <h:commandbutton id="powrot" value="#{bundle.lista_produktow_powrot" action="/faces/index1"/> </h:form> </ui:define> </ui:composition> </body> </html> Kolejny element kolekcji item (zawierający dane atrybutu promocja obiektu typu Produkt), która jest elementem kolekcji items typu DataModel Kolejny element kolekcji item (zawierający dane ceny brutto wyznaczanej przez metodę cena_brutto obiektu typu Produkt), która jest elementem kolekcji items typu DataModel

9. Dodanie pliku konfiguracji projektu faces-config.xml (New/Other/JavaServer Faces/ JSF Faces Configuration) 21

Dodanie pliku konfiguracji projektu faces-config.xml 22

10. Dodanie pliku typu properties do projektu: prawy klawisz na Source Packages, New/Other/Other/Properties File

Dodanie pliku typu properties do projektu 24

Zawartość pliku Bundle.properties zawierająca treść komunikatów. Należy dodatkowo wkleić plik jsfcrud.css do katalogu resources/css pobrany ze strony http://zofia.kruczkiewicz.staff.iiar.pwr.wroc.pl/wyklady/javapk/jsfcrud.css, który stanowi arkusz stylów, opisujący wygląd tabeli wyświetlanej przez przeglądarkę

Zawartość pliku Bundle.properties zawierająca treść komunikatów używanych na stronie lista_produktow.xhtml. Należy w taki sam sposób zastąpić komunikaty w pozostałych plikach xhtml Lista_produktow_tytul=Lista produktow Lista_produktow_pusta=Brak danych Lista_produktow_id=Id produktu Lista_produktow_nazwa=Nazwa produktu Lista_produktow_cena=Cena netto produktu Lista_produktow_promocja=Promocja produktu Lista_produktow_cenabrutto=Cena brutto Lista_produktow_powrot=Powrot 26

11. Należy zadeklarować plik Bundle.properties w pliku konfiguracyjnym facesconfig.xml. 27

Uruchomienie aplikacji Widok po kliknięciu na Lista produktow 28

Widok po kliknięciu na Ok Widok po kliknięciu na Dodaj produkt

Widok po kliknięciu na Powrot Widok po kliknięciu na Lista produktow 30

Widok po kliknięciu na klawisz Powrot na stronie lista_produktow.xhtml, następnie wybranie pozycji z lewej strony okna: Dodaj produkt i po położeniu kursora myszy na polu z etykietą Podaj nazwe produktu wyświetlenie zawartości atrybutu tytul znacznika <h:inputtytul> <h:inputtext id="nazwa" title="podaj nazwe:" value="#{managed_produkt.nazwa" required="true" requiredmessage="blad: Podaj nazwe." > </h:inputtext> Widok formularza dodaj_produkt2.xhtml po wprowadzeniu danych Widok po kliknięciu na OK na stronie dodaj_produkt2.xhtml

Widok po kliknięciu na Lista produktow Widok po kliknięciu na Dodaj produkt 32

Widok po kliknięciu na Ok Widok po kliknięciu na Lista produktow 33

12. Należy przenieść wszystkie komunikaty do pliku Bundle.properties ze stron dodaj_produkt2.xhtml, rezultat2.xhtml, rozróżniając w nazwie komunikatu przynależność do strony. Część komunikatów strony lista_produktow.xhtml można wykorzystać na stronie rezultat2.xhtml. Poniżej pokazano fragment pliku typu properties oraz przykład zastosowania komunikatów z tego pliku. Następny slajd pokazuje kolejny przykład wykorzystania pliku typu properties.

Fragment zawartości pliku Bundle.properties po proponowanych zmianach lista_produktow.tytul=lista produktow lista_produktow.pusta=brak danych lista_produktow.id=id produktu lista_produktow.nazwa=nazwa produktu lista_produktow.cena=cena netto produktu lista_produktow.promocja=promocja produktu lista_produktow.cena_brutto=cena brutto lista_produktow.powrot=powrot Fragment zawartości pliku lista_produktow.xhtml po proponowanych zmianach zmiana odwołania do komunikatu w postaci indeksowania nazwą komunikatu zawartości pliku Bundle.properties. Podobne odwołania należy wykonać we wszystkich plikach xhtml, zawierających komunikaty (atrybuty: value, requiredmessage) rezultat2.nie_dodano=taki produkt juz istnieje <body> <ui:composition template="./../template.xhtml"> <ui:define name="title"> <h:outputtext value="#{bundle['lista_produktow.tytul']" /> </ui:define> <ui:define name="content"> <h:form styleclass="jsfcrud_list_form"> <h:outputtext escape="false" value="#{bundle['lista_produktow.pusta']" rendered="#{managed_produkt.items.rowcount == 0"/> 35