Jak wybrać odpowiedni zakres fasoli?

Zauważyłem, że są różne zakresy fasoli jak:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

Jaki jest cel każdego? Jak dobrać odpowiednią lunetę do fasoli?

Author: BalusC, 2011-08-11

2 answers

Wprowadzenie

Reprezentuje zakres (żywotność) fasoli. Jest to łatwiejsze do zrozumienia, jeśli jesteś zaznajomiony z pracą" pod przykrywką " podstawowej aplikacji webowej servleta: jak działają servlety? Tworzenie instancji, sesje, współdzielone zmienne i wielowątkowość .


@Request/View/Flow/Session/ApplicationScoped

A @RequestScoped bean żyje tak długo, jak pojedynczy cykl odpowiedzi na żądanie HTTP(zwróć uwagę, że żądanie Ajax liczy się również jako pojedyncze żądanie HTTP). A @ViewScoped bean żyje tak długo, jak interakcja z tym samym widokiem JSF przez postbacks, które wywołują metody akcji zwracające null/void bez nawigacji/przekierowania. A @FlowScoped bean żyje tak długo, jak poruszasz się po określonej kolekcji widoków zarejestrowanych w pliku konfiguracyjnym przepływu. A @SessionScoped bean żyje tak długo, jak ustalona sesja HTTP. Na @ApplicationScoped bean żyje tak długo, jak działa aplikacja internetowa. Zauważ, że CDI {[8] } jest w zasadzie a stereotyp dla @Named @RequestScoped, więc obowiązują te same zasady.

Wybór zakresu zależy wyłącznie od danych (stanu), które bean przechowuje i reprezentuje. Użyj @RequestScoped do prostych i nie-ajaxowych formularzy / prezentacji. Użyj @ViewScoped dla dynamicznych widoków z obsługą ajax (Walidacja ajaxbased, rendering, okna dialogowe itp.). Użyj @FlowScoped dla wzorca" kreatora" ("kwestionariusza") zbierania danych wejściowych rozłożonych na wiele stron. Użyj @SessionScoped dla danych specyficznych dla Klienta, takich jak zalogowany użytkownik i użytkownik preferencje (język, Itp.). Użyj @ApplicationScoped dla danych/stałych w całej aplikacji, takich jak listy rozwijane, które są takie same dla wszystkich, lub managed beans bez żadnych zmiennych instancji i posiadające tylko metody.

Nadużywanie fasoli @ApplicationScoped dla danych o zasięgu sesji/widoku/żądania spowodowałoby, że będą one udostępniane wszystkim użytkownikom, aby każdy inny mógł zobaczyć swoje dane, co jest po prostu błędne. Nadużywanie fasoli @SessionScoped dla danych o zasięgu view/request sprawi, że będzie ona współdzielona między wszystkimi kartami / oknami w pojedyncza sesja przeglądarki, więc użytkownik końcowy może doświadczyć nieścisłości podczas interakcji z każdym widokiem po przełączaniu między kartami, co jest złe dla doświadczenia użytkownika. Użycie fasoli @RequestScoped dla danych o zasięgu widoku sprawi, że dane o zasięgu widoku będą ponownie uruchamiane domyślnie na każdym pojedynczym postbacku (ajax), powodując prawdopodobnie niedziałające formularze (Zobacz także punkty 4 i 5 tutaj). Nadużywanie @ViewScoped bean dla danych o zakresie żądania, sesji lub aplikacji oraz nadużywanie @SessionScoped bean dla danych o zakresie aplikacji dane nie wpływają na klienta, ale niepotrzebnie zajmują pamięć serwera i są po prostu nieefektywne.

Zauważ, że zakres nie powinien być wybierany na podstawie implikacji wydajności, chyba że naprawdę masz mało pamięci i chcesz przejść całkowicie bezstanowo; musisz używać wyłącznie @RequestScoped beans i bawić się parametrami żądania, aby utrzymać stan klienta. Zauważ również, że gdy masz jedną stronę JSF z różnymi danymi, to idealnie valid to put them in separate back beans in a scope pasujący do zakresu danych. Fasola może po prostu uzyskać dostęp do siebie poprzez @ManagedProperty w przypadku JSF managed beans lub @Inject w przypadku CDI managed beans.

Zobacz też:


@CustomScoped/NoneScoped/Dependent

To nie jest wymienione w twoim pytaniu, ale (legacy) JSF obsługuje również @CustomScoped oraz @NoneScoped, które są rzadko używane w świecie rzeczywistym. {[24] } musi odnosić się do niestandardowej implementacji Map<K, Bean> w szerszym zakresie, która została nadpisana Map#put() i / lub {29]}, aby mieć bardziej drobnoziarnistą kontrolę nad tworzeniem i/lub niszczeniem fasoli.

JSF @NoneScoped i CDI @Dependent zasadniczo żyje tak długo, jak pojedynczy El-ocena na fasoli. Wyobraź sobie formularz logowania z dwoma polami wejściowymi odnoszącymi się do właściwości bean i przyciskiem poleceń odnoszącym się do akcji bean, a więc z łącznie trzema wyrażeniami EL, w efekcie powstaną trzy instancje. Jeden z ustawioną nazwą użytkownika, jeden z ustawionym hasłem i jeden, na którym akcja jest wywoływana. Zwykle chcesz używać tego zakresu tylko na fasoli, która powinna żyć tak długo, jak fasola, w której jest wstrzykiwana. Więc jeśli a @NoneScoped lub @Dependent jest wstrzykiwany w @SessionScoped, to będzie żył tak długo, jak fasola.

Zobacz też:


Flash scope

Jako ostatni, JSF obsługuje również zakres flash. Jest on wspierany przez krótki żywy plik cookie, który jest powiązany z wprowadzaniem danych w sesji zakres. Przed przekierowaniem w odpowiedzi HTTP zostanie ustawiony plik cookie z wartością, która jest jednoznacznie powiązana z wprowadzaniem danych w zakresie sesji. Po przekierowaniu obecność pliku cookie Flash scope zostanie sprawdzona, a wpis danych związany z plikiem cookie zostanie usunięty z zakresu sesji i umieszczony w zakresie żądania przekierowanego żądania. Ostatecznie plik cookie zostanie usunięty z odpowiedzi HTTP. W ten sposób przekierowane żądanie ma dostęp do danych o zasięgu żądania który został przygotowany w pierwotnym wniosku.

W rzeczywistości nie jest to dostępne jako zarządzany zakres fasoli, tzn. nie ma czegoś takiego jak @FlashScoped. Zakres flash jest dostępny tylko jako mapa za pośrednictwem ExternalContext#getFlash() w latach 1975-1998 miejscowość administracyjnie należała do województwa siedleckiego.

Zobacz też:

 451
Author: BalusC,
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
2017-06-22 13:08:07

Od JSF 2.x są 4 zakresy fasoli:

  • @SessionScoped
  • @RequestScoped
  • @ApplicationScoped
  • @ViewScoped

Zakres sesji: zakres sesji trwa od momentu ustanowienia sesji do jej zakończenia. Sesja się kończy jeśli aplikacja webowa wywoła metodę invalidate na Obiekt HttpSession, lub jeśli czas upływa.

RequestScope: The zakres żądania jest krótkotrwały. Rozpoczyna się w momencie przesłania żądania HTTP i kończy się po odesłaniu odpowiedzi do klienta. Jeśli umieścisz managed bean w obszarze żądania, nowy instancja jest tworzona przy każdym żądaniu. Warto rozważyć prośbę zakres jeśli obawiasz się o koszt przechowywania zakresu sesji.

ApplicationScope: Zakres aplikacji utrzymuje się przez cały czas trwania aplikacji internetowej. Zakres ten jest dzielony między wszystkie wnioski i wszystkie sesje. Umieszczasz zarządzane fasolki w zakres zastosowania, jeśli jedna fasola powinna być dzielona między wszystkie instancje aplikacji internetowej. Fasola jest skonstruowana, gdy jest najpierw żądany przez dowolnego użytkownika aplikacji, a on pozostaje przy życiu do momentu usunięcia aplikacji webowej z serwera aplikacji.

ViewScope: zakres widoku został dodany w JSF 2.0. Fasola w zakresie widoku utrzymuje się, gdy ta sama strona JSF jest ponownie wyświetlana. (JSF Specyfikacja wykorzystuje termin widok dla strony JSF.) Gdy tylko użytkownik przechodzi na inną stronę, fasola wychodzi poza zakres.

Wybierz zakres na podstawie swoich wymagań.

Źródło: Core Java Server Faces 3rd Edition by David Geary & Cay Horstmann [Strona nr 51 - 54] Tutaj wpisz opis obrazka

 117
Author: Kishor Prakash,
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-06 10:56:52