Dzielenie sesji między zakładkami przeglądarki JSF

0

Witam.

Mam projekt w JSF2.2.
Chciałbym zrobić, aby na każdej zakładce była inna sesja tzn wyszukam na pierwszej zakładce osoby o nazwisku Kowalski (do datatable). Następnie na drugiej zakładce wyszukam osoby o nazwisku Nowak. Teraz gdy wejdę na pierwszą zakładkę i odświeżę stronę to mam listę Nowaków, ponieważ managed-bean został nadpisany przez drugą zakładkę.
Chciałbym rozdzielić sesje. W tym przypadku managed-bean ma ustawiony scope na session.

Gdy ustawię scope na View to podział na zakładki działa poprawnie, ale przy każdym refresh strony wykonywany jest destroy beana a następnie tworzony jest nowy, a chciałbym żeby po refresh bean nie tracił danych.

Jak to obejść? Jak rozdzielić sesje na zakładki przy session scope lub jak zachować beana przy refresh strony dla view scope ?

1

Dawno juz nie pisalem w JSF.. ale e ogólności to się nie da jak używasz SessionScope. Pytanie zasadnicze: jaka klęska żywiołowa spowodowała, że używasz JSF? Polecam ubić to jeśli tylko możesz. Naprawde. Zeby miec gorszą platforme do robienia web to trzeba by chyba zejsć do Atari 2600.
Btw. Viewstate client tez Ci na refresh nie pomoze. Kupa.

1

Coś takiego umożliwiał framework Seam. Używałem tego z JSF 1.1 i Richfaces. Czyli trochę podobnie jak w JSF 2, bo richfaces dodawał ajaksowe rzeczy. Rozwiązanie polegało na dodatkowym zasięgu (scope), który nazywał się conversation. Był identyfikowany przez parametr przesyłany przez get, czyli cid=1. Jeżeli otwierało się nową kartę, to ona była w tej samej sesji, ale miała nowy cid. Wydaje mi się, że JSF2 coś takiego miał dodane, trzeba by zerknąć w dokumentacje i opis do scope, na pewno nazywa się to inaczej.

0

Po co robisz refresh strony przy @ViewScoped (wiele rzeczy można zrobić na AJAX PrimeFaces)? Co innego redirect, ogólnie dobrze mi się pracowało, gdy @ViewScoped był nieszczony po przejściu pod inny adres (JSF to nie jest technologia do SPA, więc jak dla mnie redirecty są tam ok). Gdy robiłem redirect (przejście do innego widoku) to rzeczywiście traciłem dane przechodząc do innego widoku, ale dość łatwo sobie z tym poradzić przy @ViewScoped, tak aby przy powrocie na poprzedni adres wyświetlić poprzedni stan np zapamiętane filtry.

Ogólnie znalazłem na to taki sposób:

  • w sesji zapisywałem sobie klucz danych, które są potrzebne do pobrania (np. wartości filtru z datą na formularzu, albo nazwisko Kowalski)
  • przy wejściu do JSF ManagedBeana, który miał @ViewScoped na @PostConstruct implementowałem logikę, która sprawdzała czy w sesji jest zapamiętany jakiś stan np. wartości pól formularzy (klucze filtrów), które powodują załadowanie konkretnych danych, jeśli tak po prostu zasilałem @ViewScoped poprzednimi danymi (strzał do bazy przy @PostConstruct) w momencie jego tworzenia i w ten sposób odtwarzałem sobie widok, nie było to specjalnie trudno zrobić. W sesji pamiętałem to co jest potrzebne do pobrania danych z bazy przy odzyskiwaniu widoku, nie same odzyskiwane dane.

Gdy używałem SessionScope do wyświetlania danych formularzy to miałem same poblemy. Może 1% beanów to było SessionScoped. 95% to myślę, że @ViewScoped na JSF 2.2.

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