Pozostały nam już tylko:
Managed Beany
Są to beany warstwy webowej. Służą przede wszystkim do przechowywania danych, zarówno tych wprowadzonych przez użytkownika w formularzach, jak i innych potrzebnych przy wyświetlaniu naszych stron, pobranych na przykład z bazy danych.Co wydaje mi się być warte podkreślenia, NIE MA TUTAJ ŻADNYCH BEZPOŚREDNICH ODNIESIEŃ DO BAZY DANYCH!
Nie definiujemy tutaj żadnych relacji, zapytań, entityManagere-ów, inicjalizacji "Lazy" pól.
Po prostu niczego co by w sposób bezpośredni sczytywało lub zapisywało dane do bazy.
Wszystkie te czynności powinny być wykonywane przez Session Beany lub encje, a MBeany tylko z nich korzystać.
Mamy trzy rodzaje MBeanów: session, request, application. Nazwy te oznaczają zasięg (scope) w jakim one istnieją.
Przykładowy MBean mógłby wyglądać tak:
public class OsobaBean {Więc idąc od góry mamy...
/* Definicje wymaganych przez nas Session Beanów z warstwy biznesowej
* Adnotacja @EJB musi się znaleźc przy każdym z osobna!
*/
@EJB
protected OsobaManagerLocal om; /* Podajemy nazwe interfejsu nie implementacji! */
/* Pola MBeana powinny byc prywatne */
private String imie;
private String login;
/* Metody wykorzystujące metody biznesowe.
* Ich implementacje znajdziecie w poprzedniej części cyklu.
*/
public void zarejestruj(){
Osoba o = new Osoba(); /* Powiedzmy, że Osoba jest prostą encją mającą tylko dwa pola */
o.setImie(imie);
o.setLogin(login);
om.dodajUsera(o);
}
public void usun(){
Osoba o = new Osoba();
o.setImie(imie);
o.setLogin(login);
om.usunUsera(o);
}
public List<Osoba> szukaj(String login){
return om.szukajUsera(login);
}
/* Skoro pola są prywatne to konieczne są settery gettery
* (chyba, że nie chcemy by były dostępne na stronach)
*/
public void setImie(String imie) {
this.imie = imie;
}
public String getImie() {
return imie;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
}
Adnotacja @EJB pozwala "wstrzykiwać" Managery do naszych MBeanów. Wystarczy podać Interfejs, a implementacja zostanie automatycznie znaleziona.
Pola mogą być zarówno typami prostymi jak i klasami czy encjami nie ma tutaj ograniczeń. Powinny być jednak prywatne. Settery i gettery i tak będą musiały być stworzone jeśli chcemy by strona mogła się z naszym MBeanem komunikować.
Metody, zależnie od tego do czego służą mogą zwracać dowolne typy. Jednak warto zauważyć, że można w faces-config.xml zdefiniować przekierowania (navigation-rule) do innych podstron, na podstawie zwracanego przez metodę String-a.
Aby móc korzystać z naszego MBean-a należy dodać jeszcze wpis do faces-config.xml:
<managed-bean>
<managed-bean-name>osobaBean</managed-bean-name>
<managed-bean-class>com.blogspot.javazpiwnicy.bean.OsobaBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
managed-bean-name
jest to nazwa przez, którą będziemy mogli odwoływać się na stronach do naszego MBean-a.managed-bean-class
klasa naszego beana.managed-bean-scope
czyli wspomniany wcześniej zasięg istnienia naszego beana.Teraz już na naszych stronach możemy odwoływać się do naszych pól i metod przez EL.
Naprzykład
<h:outputText value="#{osobaBean.imie}" />
czy <h:inputText value="#{osobaBean.imie}" />
.Można też w pewien sposób oszukać MBean-a. Jeśli chcemy zwracać jakąś wartość bezpośrednio z bazy i nie przechowywać jej w MBean-ie wystarczy stworzyć metodę przedrostkiem get.
Przykładowo
public String getAllImiona()
i odwoływać się do niej przez #{osobaBean.allImiona}
.Zazwyczaj metody wykorzystujemy w formularzach jako akcje przycisków.
<h:commandButton value="Zarejestruj" action="#{osobaBean.zarejestruj}" />
To już koniec tej trylogii ;)
Miłego pisania i zapraszam do komentowania.
Super wyjaśnione i wcześniej wyjaśniane, wszystko opisane krok po kroku. Tego mi brakowało. Gratuluje, w końcu ktoś kto na prawdę chce pomóc i wyjaśnić, a nie kryje "tajemną" wiedzę :). Pozdrawiam
OdpowiedzUsuńCieszę się, że po tak długim czasie jeszcze komuś ta wiedza się przydaje.
UsuńMiej tylko na uwadze, że to wiedza z 2009 roku i technologia mogła (i napewno w wielu aspektach) się zmieniła ;)