Kilka pytań odnośnie JEE

0

Witam
Jeśli można to mam kilka pytań odnośnie JEE i niekoniecznie ver. 6 :

I.Ostatnio wyczytałem taki fragment:

Aplikacja webowa korzystająca z beana, który wstrzykuje inną klasę beana, wymaga, aby bean ten był w stanie zapamiętać swój stan na czas interakcji użytkownika z aplikacją. Sposobem na zdefiniowanie tego stanu jest nadanie beanowi zasięgu. W zależności jak używasz danego obiektu, możesz nadać mu jeden z zasięgów.

I tu mamy: żądanie, sesja, aplikacja , zależność (default), konwersacja.
O ile dobrze rozumiem to jest tak .

1.Żądania (@RequestScope) czyli wykonanie w odpowiedzi na pojedyncze wywołanie żądania HTTP. Czyli klient wysyła żądanie i za każdym razem wykonywana jest logika zawarta w danym beanie.

2.Sesji (@SessionScoped) Interakcja w czasie wielokrotnych żądań HTTP danego klienta. Czyli jak mniemam stan jest zapisywany pomiędzy kolejnymi żądaniami http danego klienta. Czyli inaczej mówiąc obiekt ten jest powiązany jak sama nazwa mówi z sesją http request. Nie rozumiem jaka jest różnica w stosunku do wykorzystania tego beana a zapisania jakiegoś obiektu/wartości
w obiekcie sesji danego klienta ??? Rozumiem że powinniśmy użyć tego typu beana jeśli np. chcielibyśmy przetrzymać ustawienia personalizacyjne danego użytkownika odnośnie aplikacji ??

  1. Aplikacji @ApplicationScoped. Czyli stan współdzielony w czasie wszystkich interakcji użytkowników (liczba mnoga) z aplikacją webową. Kurcze więc teraz tak może z głupia ale czym to się różni od singletona ?? Chodzi mi dokładnie o obiekt @Singleton przecież też przetrzymuje on stan dla wszystkich klientów ?? Jedyna różnica jaką widzę to to iż @Singleton posiada dodatkową adnotacje @Startup. Czy jak użyjemy ApplicationScoped to mamy tylko 1 instancje beana ,czy jest jakaś pula czy coś ???

  2. Zależności @Dependent (zasięg domyślny)Obiekt służący tylko 1 klientowi ma taki sam czas trwania. Czym to się będzie różnić w takim razie od zasięgu żądania ??

  3. Konwersacji @ConversationScoped. Rozumiem iż jest on podobny do session scoped jednak odnosi się do interakcji użytkownika z JSF, nie bardzo mogę pojąć ten zasięg, może dlatego iż nigdy nie miałem przyjemności używać jsf :/

II.Ogólnie mam też taki przypadek w aplikacji, że każdy użytkownik który zaloguje się do systemu ma jakieś ustawienia personalizacyjne które może sobie w każdym czasie zmieniać. Teraz jest tak, że za każdym razem czyli wywołaniem zapytania HTTP te ustawienia są sprawdzane odczytywane. Dlatego myślałem, o użyciu 3 różnych rzeczy.

  1. zapisać ustawienia w obiekcie sesji danego użytkownika
  2. zapisać ustawienia w cookies
  3. przetrzymywać ustawienia w beanie sessionscoped.

Jeśli chodzi o sposób 3 to myślałem o czymś takim :

@SessionScoped
public class PersonalizationBean implements Serialization { 
	@Inject @Personalization Instance<PersonSettings> personSettings;
...
}
 

Nie wiem który ze sposobów byłby najlepszy w moim przypadku ??
Zmiany personalizacyjne dotyczą w moim przypadku wyglądu aplikacji czyli defacto po zaakceptowaniu nowych zmian cała aplikacja jest odświeżana.

III. Jakoś nie mogę znaleźć potrzeby istnienia w aplikacjach JEE stanowego komponentu sesyjnego. Wszyscy piszą aby wystrzegać się tego typu konstrukcji. W systemach rozproszonych komponent ten musi być replikowany , przetrzymuje stan tylko 1 klienta itd itp.

Nie jestem jakoś super doświadczony w jee i to co się wyczyta w książkach na stronach to jedno a to co ma się w głowie to drugie :)
Z tego co widziałem w aplikacjach to rzeczywiście nie widziałem ani 1 stanowego komponentu sesyjnego. Zresztą po co go używać przecież można użyć inne rozwiązania ja np widziałem w aplikacji gdzie wykonywany był bezstanowy komponent sesyjny a stan był zapisywany w bazie. Gdy była wywoływana metoda w tym komponencie sprawdzany był stan i następnie wykonywana metoda.
Można także użyć obiektu sesji danego klienta czy też beana sesyjnego. To wszystko tworzy pewnego rodzaju zagmatwanie.

Oliwy do ognia dolewają jeszcze aplikacje które się przegląda , a informacje które się przeczytało. Podam taki klasyczny przykład, np o obiekcie HttpSession i takim przykładem jest koszyk z zakupami gdzie piszą aby te informacje przechowywać w tym obiektem gdzie stan zakupów danego klienta jest przechowywany na czas trwania jego sesji co wydaje się być logiczne. Następnie gdzieś w kodzie widzi się, że zaimplementowane są metody dodawania artykułów i wykorzystany jest bezstanowy komponent sesyjny który zapisuje dane pozycje w bazie, czyli wiąże danego usera z produktami na dany dzień. Wtedy człowiek się zastanawia hmm no jest to też rozwiązanie ale dlaczego akurat takie, czy jest lepsze, czy tak się to powinno robić czy w publikacjach w książkach piszą bzdury, czy po prostu ten programista źle napisał ????

Tego typu np rozwiązania dodają do tego całego jee dodatkowe pytania, po co w takim razie jest obiekt http session, czy zamiast tego nie lepiej użyć stanowego komponentu sesyjnego i tam zapisywać informacje ??

Na koniec nie chciałbym być źle zrozumiany tylko w różnych publikacjach jak czyta się o jee jest to wszystko tak fajnie wypunktowane natomiast jak tak człowiek się zastanowi to czasami mam wrażenie takiego mętliku, pojawiają się takie pytania typu a po co, a dlaczego tak czy nie da się lepiej, czy jeśli użyję tego do takiego typu rozwiązań to dobrze czy źle .....

Przepraszam jeśli nie bardzo skonkretyzowałem moje pytania. Chciałem jakoś w punktach zaznaczyć ważniejsze zagadnienia. Dziękuję za odpowiedzi...

0

Napisałeś taki elaborat, że jak doszedłem do końca, to już nie pamiętałem co jest na początku. Sam się dziwię, że przeczytałem całość. Porada: rozbij ten temat na osobne wątki, to prędzej dostaniesz odpowiedź. Ja nie mogę się wypowiedzieć na wszystkie tematy, to głupio mi na jeden coś napisać.

Wstępnie o @ConversationScoped. W jednej sesji może istnieć kilka konwersacji. Dzielą one poprzez sesje informacje o zalogowanym użytkowniku, uprawnieniach i wszystko to, co jest sesyjne. Konwersację możesz utożsamiać z otwartą kartą przeglądarki, jedną stronę możesz otworzyć w kilku kartach. Nabiera to znaczenia wtedy, kiedy na stronie masz formularze i do wykonania jakiś określony zestaw kroków. Powiedzmy, że jesteś na stronie banku i w jednym oknie zaczynasz przelew, wpisujesz dane odbiorcy, w drogim robisz to samo dla innego odbiorcy. Teraz potwierdzasz jeden a potem drugi i w obu musisz wpisać kod SMS, oczywiście dla każdej inny. W tej sytuacji masz dwie takie same zakładki z dwoma formularzami na kod, ale mechanizm konwersacji pozwoli aplikacji na serwerze rozpoznać do którego przelewu jest który kod. Na sesji mógłbyś mieć tylko jedną wartość i wysyłając tak przelew albo byś nadpisał poprzednio rozpoczęty, albo wywołał błąd.
Tak to mniej więcej wygląda.

0

@chodnik dzięki śliczne fajnie to napisałeś ja z książki wyczytałem natomiast taką informacje jeśli chodzi o @ConversationScoped

Interakcja użytkownika z aplikacją JavaServerFaces rozciąga się do granic wyraźnie określonych przez dewelopera. Rozszerzają one zasięg na wielokrotne wywołania cyklu życia aplikacji JavaServer Faces. Wszystkie długo trwające konwersacje są w zakresie konkretnego serwletu sesji HTTP i nie mogą wyjść poza obszar sesji.

Czyli jeśli nie użyję w projekcie JavaServer Faces to nici z używania @ConversationScoped ?

Swoją drogą dość podobny projekt do GWT widziałem a mianowicie Errai. Jeśli aplikacje uruchomisz np na 2 przeglądarkach i coś zmienisz na 1 np napiszesz coś w polu formularza to zmiany są automatycznie widziane na 2.

0

Czyli jeśli nie użyję w projekcie JavaServer Faces to nici z używania @ConversationScoped ?

Niekoniecznie. Mówimy tutaj o CDI. Ono nie jest częścią JSF, powstało osobno i później. Jest możliwość używania CDI tego bez JSF, ale musiałbyś znaleźć jakieś zastępstwo dla JSF, które to wspiera, albo napisać samemu serwlet uprzedni grzebiąc trochę w dokumentacji (CDI, Weld). Ja tego nie robiłem, mi tam JSF pasuje. Zwłaszcza z biblioteką RichFaces, polecam. http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=popup&skin=blueSky

Swoją drogą dość podobny projekt do GWT widziałem a mianowicie Errai. Jeśli aplikacje uruchomisz np na 2 przeglądarkach i coś zmienisz na 1 np napiszesz coś w polu formularza to zmiany są automatycznie widziane na 2.

To jest właśnie coś odwrotnego od konwersacji. Konwersacje mają rozpoznawać z jakiej zakładki przychodzi request a w tym co mówisz to aplikacja nawet przeglądarki nie rozpoznała.

1 użytkowników online, w tym zalogowanych: 0, gości: 1