com.słońce.twarze.numerofviewsinsession vs com.słońce.twarze.numeroflogicalviews

Mojarra implementacja JSF 2 ma następujące paramy kontekstowe:

  • com.sun.faces.numberOfViewsInSession (domyślnie 15)
  • com.sun.faces.numberOfLogicalViews (domyślnie 15)
Jaka jest różnica między nimi? Dokumentacja niewiele mówi na ten temat. Moja aplikacja miała problemy z ViewExpiredException dla niektórych stron, ale po przekroczeniu tych ustawień do (znacznie) wyższej wartości, przestaliśmy mieć problemy.

Moja aplikacja to finansowa, pełna form, obsługująca ajax (niektóre ekrany mają ponad 50 wejść, z możliwość dodania wielu danych/wejść przez AJAX).

Co może być przyczyną takiego zachowania? Rozumiem, że pierwszy param definiuje liczbę" stron", które są przechowywane w sesji, co może być przydatne dla przycisku wstecz, ale moje przypadki użycia, które wyzwalają ViewExpiredException, nie używają przycisku Wstecz. Do czego odnosi się drugi param? Jeśli pozostanę na tym samym ekranie, ale będę dodawał wiele danych za pośrednictwem AJAX, czy powoduje to potrzebę większej liczby logicznych widoków dla strony?
Author: BalusC, 2010-11-05

2 answers

Po pierwsze, implementacja Mojarry nieumyślnie zamieniła znaczenie tych parametrów kontekstu. Więc jeśli masz wrażenie, że opis jest dokładnie odwrotnie niż to, co sugeruje literalna nazwa parametru kontekstowego, to jest to rzeczywiście prawda.


com.sun.faces.numberOfLogicalViews

Jest to w zasadzie GET request based. Każde żądanie GET tworzy nowy widok w sesji.

Aby poeksperymentować z nim, ustaw na wartość 3, uruchom nową sesję przeglądarki i otwórz 4 różne karty przeglądarki (niezależnie od adresu URL; mogą być takie same, mogą być różne) w kolejności, a następnie wróć do pierwszej karty i prześlij tam formularz. Otrzymasz ViewExpiredException, Ponieważ ten widok został wypchnięty z mapy LRU (ostatnio używanej) dla widoków w sesji. Tak się nie stanie, jeśli otworzysz max 3 zakładki.

Z domyślną wartością 15, jest to rzadki problem w świecie rzeczywistym. Jeśli twoja webapp jest naprawdę przeznaczony do korzystania w ten sposób (np. aby otworzyć wiele kart, takich jak forum dyskusyjne lub pytania i odpowiedzi), możesz rozważyć użycie zapisywania stanu po stronie klienta zamiast zwiększania wartości domyślnej. Przy zapisywaniu stanu po stronie klienta nigdy nie napotkasz tego wyjątku. Alternatywą byłoby użycie OmniFaces <o:enableRestorableView> w połączeniu z parametrami request scoped bean i request lub view scoped bean, który sprawdza w (post)construct, czy jego własny stan musi zostać przywrócony. Kolejną alternatywą jest odejście [[22]] stateless z <f:view transient="true">, w ten sposób widoki nie są już zapisywane, ale nie można już używać fasoli z zakresem widoku.

Odpowiednikiem MyFaces jest org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION która domyślnie wynosi 20.


com.sun.faces.numberOfViewsInSession

Jest to w zasadzie synchroniczne (nie-ajax!) POST request based. Każde synchroniczne żądanie POST tworzy nowy widok logiczny. Wszystkie są przechowywane w oparciu o fizyczny widok tak Map<PhysicalView, Map<LogicalView, ViewState>>. Tak więc, przy max 15 widokach fizycznych i max 15 widokach logicznych, teoretycznie możesz mieć 15*15 = 225 odsłon w sesji.

Aby eksperymentować z nim, ustaw go na wartość 3, Otwórz widok z formularzem synchronicznym, wyślij go 4 razy, a następnie naciśnij przycisk Wstecz 4 razy, a następnie wyślij formularz ponownie. Otrzymasz ViewExpiredException, Ponieważ ten widok został wypchnięty z mapy LRU (ostatnio używanej) dla widoków logicznych. Nie stanie się to, jeśli wrócisz maksymalnie 3 razy, a następnie ponownie go Prześlij.

Zauważ, że ajax przesyła ponownie ten sam widok logiczny (możesz to potwierdzić przez wyświetlanie dokładnie tej samej wartości javax.faces.ViewState zwracanej w postbackach ajax). Nie ma dla niego wsparcia dla przycisku Wstecz przeglądarki. Przycisk Wstecz przeglądarki przenosi tylko z powrotem do poprzedniego żądania synchronicznego, dlatego nie miałoby sensu przechowywanie wszystkich tych postów ajax jako logicznych widoków w sesji.

Z domyślną wartością 15 i aktualnym trendem formularzy tylko ajax i wyłączonej pamięci podręcznej na dynamicznych stronach, jest to bardzo rzadki problem w świecie rzeczywistym. Odpowiednio zaprojektowane formularze nie należy zapraszać do naciskania przycisku Wstecz przeglądarki. Zamiast tego powinni po pomyślnym przesłaniu przekierowania do widoku docelowego, a po niepowodzeniu po prostu ponownie odtworzyć ten sam formularz z błędami walidacji. Zobacz również podpowiedzi Jak poruszać się w JSF? Jak sprawić, by adres URL odzwierciedlał bieżącą stronę (a nie poprzednią) . Ponadto pamięć podręczna jest częściej niż często wyłączana na dynamicznych stronach, więc przycisk Wstecz dałby ci zupełnie nowy widok wstecz. Patrz również unikaj przycisku Wstecz w aplikacji internetowej JSF . Jeśli dotyczy to również Twojej aplikacji, możesz bezpiecznie ustawić wartość na 1.

MyFaces pierwotnie nie miał odpowiednika dla tego, i policzył to jako fizyczny widok w sesji, jak również. W wersji 2.0.6, org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION został wprowadzony, o podobnym celu, choć z inną implementacją i domyślnie wyłączony.


Zobacz też:

 59
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-05-23 12:02:31

Właśnie znalazłem to w sieci: http://oss.org.cn/ossdocs/java/ee/javaeetutorial5/doc/JSFConfigure11.html

To może być pomocne:

Widoki logiczne są podwidywaniami widoku najwyższego poziomu. Na przykład, jeśli strona zawiera wiele ramek, to każda ramka jest logicznym widokiem. Jeśli masz prostą aplikację, domyślne 15 widoków lub 15 widoków logicznych może być zbyt duże. W takim przypadku należy rozważyć zmniejszenie dopuszczalnej liczby wyświetleń i widoki logiczne w celu zachowania pamięci. I odwrotnie, bardziej złożona aplikacja może wymagać zapisania więcej niż 15 widoków lub widoków logicznych w sesji.

 5
Author: tasel,
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
2010-11-11 12:10:44