piątek, 30 stycznia 2009

Encje, Managery i MBeany Część 3

Witam!
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 {

  /* 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;
  }

}
Więc idąc od góry mamy...
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.

2 komentarze:

  1. 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ń
    Odpowiedzi
    1. Cieszę się, że po tak długim czasie jeszcze komuś ta wiedza się przydaje.
      Miej tylko na uwadze, że to wiedza z 2009 roku i technologia mogła (i napewno w wielu aspektach) się zmieniła ;)

      Usuń