Zastosowanie słuchaczy zdarzeń wg

Podobne dokumenty
Budowa aplikacji wielowarstwowych. Obsługa zdarzeń

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

Budowa aplikacji wielowarstwowych. zastosowanie walidatorów.

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

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 prostej aplikacji wielowarstwowej

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

Budowa aplikacji wielowarstwowych. Zastosowanie technologii Ajax

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

Budowa aplikacji wielowarstwowych. Zastosowanie technologii Ajax

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

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

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

Zastosowanie konwerterów wg

termin. Podobna wada 2) jak w Sklep_6

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

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

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

Kontynuacja programu z lab3 zaawansowane renderowanie formularzy JSF

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

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

Budowa aplikacji wielowarstwowych. Zastosowanie szablonów

Programowanie komponentowe 5

Konwersja danych. Programowanie komponentowe 4. wg bnaph.html

Zastosowanie walidatorów oraz komponentów wyboru wg

Zastosowanie komponentów EJB typu Session

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Złożone komponenty JSF wg

Aplikacje RMI Lab4

Podstawy technologii JavaServer Faces wg

Podstawowe informacje o technologii Java Persistence API - przykład

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

Zastosowanie technologii Ajax w ramach technologii JavaServer Faces wg

Java Server Faces narzędzie do implementacji w wy prezentacji

JavaServer Faces (JSF)

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.

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

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

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

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

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

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

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


Aplikacje internetowe i rozproszone - laboratorium

Programowanie zdarzeniowe

Programowanie obiektowe

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

Podstawy technologii JavaServer Faces wg

Programowanie obiektowe

Podstawowe informacje o technologii Java Persistence API - przykład

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

Dokumentacja do API Javy.

Zaawansowane aplikacje internetowe - laboratorium

Wykład 7: Pakiety i Interfejsy

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

Aplikacje RMI

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

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

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

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

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

Klasy i obiekty cz II

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

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

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

Programowanie obiektowe

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

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

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

Programowanie obiektowe

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

Tworzenie i wykorzystanie usług

Wywoływanie metod zdalnych

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

Zaawansowane aplikacje internetowe

Stanowe komponenty sesyjne

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Instrukcja 3 Laboratorium z Podstaw Inżynierii Oprogramowania

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

Podstawy technologi JavaServer Faces

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

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Diagram stanów Laboratorium 9

JAVA W SUPER EXPRESOWEJ PIGUŁCE

1 Atrybuty i metody klasowe

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

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Obsługa zdarzeń. Wykład 4

Diagramy klas. dr Jarosław Skaruz

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Laboratorium 8 Diagramy aktywności

Usługa TimerService

Transkrypt:

Zastosowanie słuchaczy zdarzeń wg https://docs.oracle.com/javaee/7/jeett.pdf Technologie internetowe 6

1. Obsługa zdarzeń typu valuechangelistener

Rejestracja słuchaczy zdarzeń typu valuechangelistener w komponentach 1. Pierwszy sposób Słuchacz zdarzeń może być metodą obiektów typu Managed Bean wtedy referencja tej metody jest przypisana do atrybutu valuechangelistener komponentu (wykład 3, Przykład 4, slajdy 35-37; http://zofia.kruczkiewicz.staff.iiar.pwr.wroc.pl/wyklady/ti_/tint_3.pdf) 2. Drugi sposób Słuchacz zdarzeń może być instancją zdefiniowanej klasy wtedy znaczniki f:valuechangelistener (wykład 3, Przykład 5, slajdy 38-41; http://zofia.kruczkiewicz.staff.iiar.pwr.wroc.pl/wyklady/ti_/tint_3.pdf)

Przykład 4 - Dodawanie atrybutu valuechangelistener do znacznika input (rozbudowa przykładu 3) w celu zliczania zmian wartości wprowadzanej do pola name Pierwszy sposób public void processvaluechange(valuechangeevent event) throws AbortProcessingException { if (null!= event.getnewvalue()) { licznik++;} //zliczanie zmian atrybutu name w czasie sesji } Metoda w klasie typu Managed Bean do obsługi zdarzeń generowanych przez widoki komponentów stron JSF

Przykład 4 (cd) wynik obsługi zdarzenia

Przykład 4 (cd) wynik obsługi zdarzenia

Rejestracja słuchaczy zdarzeń typu Value-Change w komponentach f:valuechangelistener Atrybuty: type Drugi sposób - wskazanie na nazwę pakietową klasy, zawierającą definicję słuchacza zdarzeń typu ValueChangeListener. Można użyć literał lub wyrażenie, wskazujące np. na klasę typu javax.faces.event.valuechangeevent. W podanym przykładzie jest: warstwa_internetowa.namechanged binding - wskazanie na obiekt, który implementuje słuchacza zdarzeń typu ValueChangeListener. Można użyć jedynie wyrażenia, które wskazuje na właściwość obiektu typu Managed Bean, która zwraca referencję do obiektu implementującego słuchacza zdarzeń typu ValueChangeListener (podobnie jak w przypadku konwerterów)

Przykład 5 rejestracja obsługi valuechangelistener za pomocą atrybutu type

Przykład 5 (cd) definicja nowego słuchacza zdarzeń

Przykład 5 (cd) definicja metody getlicznik w klasie typu ManagedBean powiązanej z polem licznik znacznika outputlabel na stronie rezultat.xhtml

Przykład 6 rejestracja obsługi valuechangelistener za pomocą atrybutu type 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. 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.

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.

4. Zastosowanie definicji klasy Zmiana_danych implementującej interfejs ValueChangeListener (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']}" > </h:inputtext> <f:valuechangelistener type="pomoc.zmiana_danych"/>

5 Prezentacja wyniku

5. Prezentacja wyniku (cd)

Przykład 7. rejestracja obsługi valuechangelistener za pomocą atrybutu binding 1. Zastosowanie definicji klasy Zmiana_danych implementującej interfejs ValueChangeListener <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']}" > </h:inputtext> <f:valuechangelistener binding="#{managed_produkt.zmiana1}"/> <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}"/>

2. Zastosowanie definicji klasy Zmiana_danych implementującej interfejs ValueChangeListener. 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; }

3 Prezentacja wyniku

3 Prezentacja wyniku (cd)

2. Obsługa zdarzeń typu actionlistener

Rejestracja słuchaczy zdarzeń typu actionlistener w komponentach 1. Pierwszy sposób Słuchacz zdarzeń może być metodą obiektów typu Managed Bean wtedy referencja tej metody jest przypisana do atrybutu actionlistener komponentu 1. Drugi sposób Słuchacz zdarzeń może być instancją zdefiniowanej klasy wtedy znaczniki f:actionlistener są powiązane z takim słuchaczem i zagnieżdżone w znaczniku komponentu, który generuje zdarzenie

Obsługa zdarzeń typu ActionListener 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]));

Przykład 1 (pierwszy sposób) przy wprowadzaniu danych obsługa zdarzenia typu actionlistener podczas kliknięcia na komponent typu h:commandlink Fragment strony dodaj_produkt2.xhtml: <h:commandlink action="rezultat2" value="ok" actionlistener="#{managed_produkt.dodaj_produkt}"/> W klasie typu Managed Bean dokonano zmiany metody dodaj_produkt public void dodaj_produkt() { } String[] dane = {"" + nazwa, "" + cena, "" + promocja}; fasada.utworz_produkt(dane, data_produkcji); dane_produktu(); // return "rezultat2";

3.3. Prezentacja wyniku

Przykład 2 (pierwszy sposób) przy wprowadzaniu danych obsługa zdarzenia typu actionlistener podczas kliknięcia na komponent typu h:commandlink Obsługa zdarzeń typu ActionListener 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"; }

Prezentacja wyniku

Rejestracja słuchaczy zdarzeń typu Action Listener w komponentach (drugi sposób) f:actionlistener Atrybuty: type - wskazanie na nazwę pakietową klasy, zawierającą definicję słuchacza zdarzeń typu ActionListener. Można użyć literał lub wyrażenie, wskazujące np. na klasę typu javax.faces.event.actionlistener binding - wskazanie na obiekt, który implementuje słuchacza zdarzeń typu ActionListener. Można użyć jedynie wyrażenia, które wskazuje na właściwość obiektu typu Managed Bean, która zwraca referencję do obiektu implementującego słuchacza zdarzeń typu ActionListener (podobnie jak w przypadku konwerterów)

Przykład 3 (drugi sposób) przy wprowadzaniu danych obsługa zdarzenia typu actionlistener podczas kliknięcia na komponent typu h:commandlink (na stronie dodaj_produkt2) Fragment strony dodaj_produkt2.xhtml: <h:commandlink action="rezultat2" value="ok" > <f:actionlistener binding="#{managed_produkt}"/> </h:commandlink>

Przykład 3 (cd) - Klasa typu Managed Bean implementuje interfejs ActionListener: package warstwa_internetowa; import java.util.date; import javax.ejb.ejb; import javax.inject.named; import javax.enterprise.context.requestscoped; 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 warstwa_biznesowa.fasada_warstwy_biznesowej; @Named(value = "managed_produkt") @RequestScoped public class Managed_produkt implements ActionListener { //.. public void processaction(actionevent event) throws AbortProcessingException { //public void dodaj_produkt() { String[] dane = {"" + nazwa, "" + cena, "" + promocja}; fasada.utworz_produkt(dane, data_produkcji); dane_produktu(); } // return "rezultat2";

Przykład 3 (cd) Wynik działania w przypadku zastosowania obu sposobów rejestrowania obsługi zdarzeń typu actionlistener

Przykład 4 (drugi sposób) przy wprowadzaniu danych obsługa zdarzenia typu actionlistener podczas kliknięcia na komponent typu h:commandlink (na stronie dodaj_produkt2) Fragment strony dodaj_produkt2.xhtml: <h:commandlink action="rezultat2" value="ok" > <f:actionlistener binding="#{managed_produkt}"/> </h:commandlink>

Przykład 4 (cd) - Klasa typu Managed Bean implementuje interfejs ActionListener: package warstwa_internetowa; import java.util.date; import javax.ejb.ejb; import javax.inject.named; import javax.enterprise.context.requestscoped; 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 warstwa_biznesowa.fasada_warstwy_biznesowej; @Named(value = "managed_produkt") @RequestScoped public class Managed_produkt implements ActionListener { //... public void processaction(actionevent event) throws AbortProcessingException { dodaj_produkt(); }

public void dodaj_produkt() { } } String[] dane = {nazwa, "" + cena, "" + promocja}; fasada.utworz_produkt(dane, data_produkcji); dane_produktu(); 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]));

Przykład 4 (cd) Wynik działania w przypadku zastosowania obu sposobów rejestrowania obsługi zdarzeń typu actionlistener

Przykład 5 (drugi sposób) przy wprowadzaniu danych obsługa zdarzenia typu actionlistener podczas kliknięcia na komponent typu h:commandlink (na stronie dodaj_produkt2) Fragment strony dodaj_produkt2.xhtml: <h:commandlink action="#{managed_produkt.dane_produktu}"/> value="ok" > <f:actionlistener binding="#{managed_produkt}"/> </h:commandlink>

Przykład 5 (cd) - Klasa typu Managed Bean implementuje interfejs ActionListener: package warstwa_internetowa; import java.util.date; import javax.ejb.ejb; import javax.inject.named; import javax.enterprise.context.requestscoped; 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 warstwa_biznesowa.fasada_warstwy_biznesowej; @Named(value = "managed_produkt") @RequestScoped public class Managed_produkt implements ActionListener { //... public void processaction(actionevent event) throws AbortProcessingException { dodaj_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";

Przykład 5 (cd) Wynik działania w przypadku zastosowania obu sposobów rejestrowania obsługi zdarzeń typu actionlistener

Przykład 6 obsługa zdarzenia za pomocą słuchacza zdarzeń, zarejestrowanego za pomocą znacznika f:setpropertyactionlistener <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" lang="pl"> <h:column> <f:facet name="header"> <h:outputtext value="#{bundle['lista_produktow.id']}"/> </f:facet> <h:commandlink action= "rezultat2" value="szczegoly"> <f:setpropertyactionlistener target="#{managed_produkt.produkt_dto}" value="#{item}"/> </h:commandlink> </h:column> Metoda umożliwiająca przejście na stronę rezultat2.xhtml i wyświetlenie wybranego item Pobranie obiektu item w fazie żądanie przez podstawienie do obiektu produkt_dto

Przykład 6 (cd) Widok strony rezultat2. xhtml po kliknięciu na link Szczegoly w pierwszym wierszu tabeli