Struktura fasoli nośnej JSF (najlepsze praktyki)

Mam nadzieję, że w tym poście będę mógł uzyskać opinie ludzi na temat najlepszych praktyk dotyczących interfejsu między stronami JSF a fasolami wspierającymi.

Jedna rzecz, na której nigdy nie mogę się rozstrzygnąć, to struktura moich ziaren. Co więcej, nigdy nie znalazłem dobrego artykułu na ten temat.

Jakie właściwości należą do której fasoli podkładowej? Kiedy należy dodać więcej właściwości do danej fasoli, a nie tworzyć nową fasolę i dodawać właściwości do niej? Do prostych zastosowań, czy to ma sens, aby mieć tylko jedną fasolę podkładu dla całej strony, biorąc pod uwagę złożoność związaną z wstrzykiwaniem jednej fasoli do drugiej? Czy fasola zaplecza powinna zawierać jakąś rzeczywistą logikę biznesową, czy powinna zawierać wyłącznie dane?

Nie krępuj się odpowiedzieć na te pytania i wszelkie inne, które mogą się pojawić.

Jeśli chodzi o zmniejszenie sprzężenia między stroną JSF a backing bean, nigdy nie pozwalam stronie JSF na dostęp do właściwości backing bean. Na przykład, nigdy nie pozwalam na coś takiego jak:

<h:outputText value="#{myBean.anObject.anObjectProperty}" />

Zawsze wymagam czegoś takiego:

<h:outputText value="#{myBean.theObjectProperty}" />

O wartości:

public String getTheObjectProperty()
{
    return anObject.getAnObjectProperty();
}

Kiedy pętlę nad kolekcją, używam klasy wrapper, aby uniknąć wiercenia w obiekt w tabeli danych, na przykład.

Ogólnie rzecz biorąc, takie podejście wydaje mi się "właściwe". Pozwala to uniknąć jakiegokolwiek sprzężenia między widokiem a danymi. Popraw mnie, jeśli się mylę.
 114
Author: Zack Marrapese, 2009-04-14

6 answers

Warto to sprawdzić: dokonywanie rozróżnień między różnymi rodzajami zarządzanych fasoli JSF .

Oto opis różnych rodzajów fasoli, zdefiniowanych w powyższym artykule przez Neila Griffina:

  • Model Managed-Bean: normalnie zakres sesji. ten typ zarządzanej fasoli bierze udział w "modelu" wzorca projektowego MVC. Kiedy zobaczysz słowo "model" - pomyśl o danych. Model JSF-bean powinien być POJO, które podąża za JavaBean design pattern with getters / setters enkapsulating properties. Najczęstszym przypadkiem użycia modelu bean jest bycie jednostką bazy danych lub po prostu reprezentowanie zbioru wierszy z zbioru wynikowego zapytania bazy danych.
  • Backing Managed-Bean: Zwykle żądaj zakresu. ten typ managed-bean bierze udział w "widoku" wzorca projektowego MVC. Celem backing-bean jest obsługa logiki UI i ma relację 1:: 1 z widokiem JSF lub JSF forma w kompozycji Fasetowej. Chociaż zwykle ma właściwości w stylu JavaBean z powiązanymi getterami/setterami, są to właściwości widoku , a nie bazowego modelu danych aplikacji. JSF backing-beans może mieć również metody JSF actionListener i valueChangeListener.
  • Controller Managed-Bean: Zwykle żądaj zakresu. ten typ managed-bean bierze udział w trosce o" Kontroler " wzorca projektowego MVC. Celem kontrolera jest wykonaj jakąś logikę biznesową i zwróć wynik nawigacji do obsługi nawigacji JSF. Kontroler JSF - beans zazwyczaj posiada metody akcji JSF (a nie metody actionListener).
  • Wsparcie zarządzane-Bean: Zwykle zakres sesji lub aplikacji. ten typ fasoli "obsługuje" jeden lub więcej widoków w" widoku " wzorca projektowego MVC. Typowym przypadkiem użycia jest dostarczenie ArrayList do JSF h: selectOneMenu listy rozwijane, które pojawiają się w więcej niż jednym JSF widok. Jeśli dane z listy rozwijanej są specyficzne dla użytkownika, to bean będzie przechowywany w zakresie sesji. Jeśli jednak dane dotyczą wszystkich użytkowników (np. listy rozwijane prowincji), bean będzie przechowywany w zakresie aplikacji, tak aby mógł być buforowany dla wszystkich użytkowników.
  • Utility Managed-Bean: Zwykle zakres zastosowania. ten typ bean dostarcza pewnego rodzaju funkcję "utility" do jednego lub więcej widoków JSF. Dobrym tego przykładem może być FileUpload bean, który może być ponownie użyty w wielu aplikacjach internetowych.
 141
Author: cecemel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-31 19:41:32

Świetne pytanie. Bardzo cierpiałem z tym samym dylematem, kiedy przeniosłem się do JSF. To naprawdę zależy od twojej aplikacji. Jestem ze świata Java EE, więc polecam mieć jak najmniej logiki biznesowej w swoich podstawach, jak to możliwe. Jeśli logika jest czysto związana z prezentacją Twojej strony, dobrze jest mieć ją w fasoli zaplecza.

Wierzę, że jedną z (wielu) mocnych stron JSF jest fakt, że można wystawiać obiekty domeny bezpośrednio na zarządzanych fasolach. I dlatego zdecydowanie polecam podejście <:outputText value="#{myBean.anObject.anObjectProperty}" />, w przeciwnym razie robisz za dużo pracy dla siebie w ręcznym ujawnianiu każdej właściwości. Ponadto byłoby trochę bałaganu podczas wstawiania lub aktualizowania danych, jeśli zamkniesz wszystkie właściwości. Istnieją sytuacje, w których pojedynczy obiekt domeny może nie być wystarczający. W takich przypadkach przygotowuję ValueObject PRZED wystawieniem go na fasoli.

EDIT: właściwie, jeśli zamierzasz zamknąć każdą właściwość obiektu że chcesz ujawnić, polecam, aby zamiast związać komponenty UI do fasoli podkładu, a następnie wstrzyknąć zawartość bezpośrednio do wartości komponentu.

Jeśli chodzi o strukturę fasoli, punktem zwrotnym dla mnie było zignorowanie wszystkiego, co wiedziałem o tworzeniu aplikacji internetowych i rozpoczęcie traktowania ich jako aplikacji GUI. JSF dużo naśladuje Swing i dlatego najlepsze praktyki tworzenia aplikacji Swing będą miały zastosowanie głównie do budowanie aplikacji JSF.

 14
Author: Allan Lykke Christensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-14 21:34:30

Mogę nie odpowiedzieć na każde twoje pytanie, ponieważ niewiele wydaje się zależeć od każdego przypadku.

  • To dobrze mieć logikę biznesową w swojej fasoli. To zależy, skąd pochodzisz. Jeśli ćwiczysz projektowanie oparte na domenie, będziesz kuszony, aby włączyć logikę biznesową do backing bean lub może być również logiką wytrwałości. Twierdzą, że dlaczego tak głupi obiekt. Obiekt powinien nosić nie tylko stan, ale również zachowanie. Z drugiej strony, jeśli rozważysz tradycyjny sposób robienia rzeczy w Java EE, możesz mieć ochotę na dane w swojej fasoli wspierającej, która również może być twoją fasolą entity oraz inną logiką biznesową i wytrwałości w jakiejś fasoli sesji lub czymś takim. To też jest w porządku.

  • Doskonale jest mieć pojedynczą fasolę na całej stronie. Nie widzę z tym problemu. To może nie wyglądać dobrze, ale to zależy od sprawy.

  • Twoje drugie pytanie jest znacznie bardziej zależne od przypadku, w którym jesteś mając w ręku. Wolałbym iść domeny napędzane tutaj, może być właściwe, aby dodać właściwości do istniejących lub w inny sposób utworzyć nową fasolę dla tego. Co zawsze pasuje lepiej. Nie sądzę, żeby była do tego jakaś Srebrna kula.

  • Jakie właściwości należy do jakiej fasoli podkładowej. Czy to nie zależy od obiektu domeny? A może pytanie nie jest takie jasne.

Co więcej, w podanym przykładzie kodu nie widzę żadnej ogromnej korzyści.

 4
Author: Adeel Ansari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-14 03:20:32

Myślę, że najważniejszą rzeczą z Twoim wsparciem jest oddzielenie ich logiki. Jeśli masz stronę główną dla systemu CMS, to uznałbym za złą praktykę umieszczanie każdego fragmentu kodu w jednej fasoli, ponieważ:

  1. fasola w końcu stanie się bardzo duża
  2. łatwiej jest innym znaleźć to, czego szukają, jeśli rozwiązują problemy ze stroną logowania, jeśli mogą łatwo wyszukać loginBean.plik java.
  3. czasami masz małe kawałki funkcjonalność, która wyraźnie różni się od reszty kodu, oddzielając to, wyobrażam sobie, że ułatwiłbyś sobie przebudowanie / rozszerzenie tego kodu na coś większego, gdy masz już ładną fasolę o dobrej strukturze.
  4. posiadanie 1 big bean, aby zrobić to wszystko, sprawi, że będzie bardziej zależny od pamięci, jeśli / kiedy musisz zrobić deklaracje takie jak mybigbean bigBean = new mybigbean (); zamiast używać funksjonality, którego potrzebujesz, wykonując loginbean loginBean = new LoginBean (); (popraw mnie jeśli się mylę tutaj???)
  5. Moim zdaniem oddzielanie fasoli jest jak oddzielanie metod. Nie chcesz 1 dużej metody, która obejmuje ponad 100 linii, ale raczej podziel ją na nowe metody, które obsługują ich konkretne zadanie.
  6. pamiętaj, najprawdopodobniej ktoś inny niż ty będzie musiał również pracować nad twoimi projektami JSF.


Jeśli chodzi o sprzężenie, nie widzę w tym kłopotliwego problemu, aby umożliwić stronom JSF dostęp do właściwości w obiektach na plecach. Jest to wsparcie, które jest wbudowane w JSF i naprawdę ułatwia czytanie i budowanie imo. / Align = "left" / W ten sposób oszczędzasz Tony linii z geterami i seterami w swoim backingbean. Na przykład mam naprawdę ogromny obiekt podarowany mi przez serwisy internetowe, gdzie muszę użyć niektórych właściwości w mojej prezentacji. Gdybym miał zrobić getter/setter dla każdej nieruchomości moja fasola rozszerzyłaby się o co najmniej 100 więcej linie zmiennych i metody uzyskiwania propeties. Korzystając z wbudowanej funkcjonalności JSF oszczędzam czas i cenne linie kodu.

Tylko moje 2 centy na ten temat, nawet z pytaniem oznaczonym już jako odpowiedź.

 4
Author: Chris Dale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-16 07:58:29

Nie musiałbym trzymać tylko jednej fasoli na stronie. To zależy od funkcjonalności, ale przez większość czasu miałem jedną fasolę na stronę, ponieważ głównie jedna strona obsługuje jedną funkcjonalność. Na przykład na stronie mam link do rejestracji (będę link z RegisterBean) i link do koszyka zakupów (ShoopingBasketBean).

Używam tego<:> ponieważ zwykle podtrzymuję beans jako action beans, który przechowuje obiekt danych. Nie chcę pisać wrapper In My backing bean to access the properties of my data objects.

 3
Author: Bhushan Bhangale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-14 03:21:24

Lubię testować kod biznesowy bez widoku, więc BackingBeans traktuję jako interfejsy z widoku do kodu modelu. Nigdy nie umieszczam żadnych reguł ani procesów w BackingBean. Ten kod trafia do Usług lub pomocników, umożliwiając ponowne użycie.

Jeśli używasz walidatorów, umieść je z BackingBean i odwołaj się do nich z metody walidacji.

Jeśli masz dostęp do DAOs do wypełniania Selektów, Radia, Checkboxów, rób to zawsze z BackingBean.

Uwierz mi!. Można wstrzyknąć JavaBean do BackingBean, ale spróbuj wstrzyknąć BackingBean do innego. Wkrótce będziesz w niezłym zakresie konserwacji i zrozumienia kodu.

 0
Author: jjruiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 14:23:07