Frage

Mojarra Implementierung von JSF 2 hat folgenden Kontext params:

  • com.sun.faces.numberOfViewsInSession (Standard: 15)
  • com.sun.faces.numberOfLogicalViews (Standard: 15)

Was ist der Unterschied zwischen ihnen? Die Dokumentation spricht nicht viel über diese. Meine App wurde für einige Seiten Probleme mit ViewExpiredException hat, aber nachdem wir diese Einstellungen in einen (viel) höheren Wert gestoßen, hielten wir Probleme.

Meine app ist eine finanzielle, kontur schwer, Ajax-fähige App (einig Bildschirm haben 50+ Eingänge, mit der Möglichkeit der Zugabe von viel mehr Daten / Eingaben über AJAX).

, was die Ursache für dieses Verhalten sein kann? Ich verstehe, dass die erste param die Anzahl der „Seiten“ definiert, die in der Sitzung gehalten werden, die für die Zurück-Taste kann nützlich sein, aber meine Anwendungsfälle, die die ViewExpiredException auslösen nicht die Zurück-Taste verwenden. Was bedeutet der zweite param beziehen sich auf? Wenn ich in dem gleichen Bildschirm bleiben, aber eine Menge von Daten über AJAX Halten Sie das Hinzufügen, macht diese Ursache die Notwendigkeit einer größeren Anzahl von logischen Ansichten zur Seite?

War es hilfreich?

Lösung

Zunächst einmal unbeabsichtigt die Mojarra Umsetzung die Bedeutung dieser Kontextparameter getauscht. Also, wenn Sie den Eindruck haben, dass die Beschreibung genau andersherum als das, was der wörtliche Kontextparameter Name schon sagt, dann ist dies in der Tat wahr.


com.sun.faces.numberOfLogicalViews

Dies ist im Grunde GET Anforderung. Jede GET-Anfrage erstellt eine neue Ansicht in der Sitzung.

damit experimentieren, stellen Sie es auf einen Wert von 3, eine neue Browser-Sitzung und öffnen 4 verschiedene Browser-Tabs (unabhängig von der URL, kann gleich sein, kann unterschiedlich sein) starten in der Reihenfolge und dann zum ersten gehen zurück Registerkarte und senden Sie das Formular drin. Sie erhalten eine ViewExpiredException bekommen, weil diese Ansicht von der LRU (Least Recently Used) herausgeschoben wurde für Ansichten in Sitzung zuordnen. Dies wird nicht passieren, wenn Sie max 3 Tabs geöffnet.

Mit dem Standardwert von 15, dann ist dies ein seltenes reale Welt Problem. Wenn Ihr Webapp wirklich entworfen, um auf diese Weise verwendet werden (zB einer sozialen / Community-Site, die lädt in mehreren Tabs, wie Diskussionsforum oder Q & A geöffnet wird), dann könnten Sie Speicher unter Verwendung von Client-Seite Zustand betrachten, anstatt den Standardwert zu erhöhen . Mit Client-Seite Zustand Einsparung, werden Sie nie diese Ausnahme stellen. Eine Alternative wäre OmniFaces <o:enableRestorableView> in Kombination, die eine Anfrage scoped bean und Anforderungsparameter zu verwenden, oder ein Blick scoped Bohne, die die Kontrollen in (post) Konstrukt, wenn sein eigener Staat Bedarf gestellt werden. Wieder eine andere Alternative ist staatenlos mit <f:view transient="true"> zu gehen, auf diese Weise die Ansichten nicht mehr gespeichert werden, aber Sie können Ansicht scoped Bohnen nicht mehr verwendet werden.

Die MyFaces entspricht org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION die standardmäßig bis 20.


com.sun.faces.numberOfViewsInSession

Dies ist im Wesentlichen synchron (nicht-Ajax-!) POST-Anfrage basiert. Jede synchrone POST-Anfrage erstellt eine neue logische Sicht. Sie sind alle auf Basis einer physikalischen Ansicht wie so Map<PhysicalView, Map<LogicalView, ViewState>> gespeichert. Also, mit maximal 15 physikalischen Ansichten und maximal 15 logischen Ansichten können Sie theoretisch haben 15 * 15 = 225 Ansichten in der Sitzung.

damit experimentieren, stellen Sie es auf einen Wert von 3, öffnen Sie eine Ansicht mit einer synchronen Form, legt sie 4 Mal und drücken Sie dann den Zurück-Taste 4-mal des Browser und dann das Formular wieder. Sie erhalten eine ViewExpiredException bekommen, weil diese Ansicht von der LRU (Least Recently Used) herausgeschoben wurde für logische Ansichten abzubilden. Dies wird nicht passieren, wenn Sie zurück max 3 mal gehen und es dann erneut.

Beachten Sie, dass Ajax macht die gleiche logische Ansicht wiederverwenden (Sie können es bestätigen zu sehen genau den gleichen javax.faces.ViewState Wert auf Ajax-Postbacks zurückgeschickt werden). Es gibt keinen Back-Button Unterstützung ohnehin für seinen Browser. Der einzige Zurück-Button des Browsers zurück zur vorherige synchronen Anforderung bringt, wäre es daher keinen Sinn, alle dieses Ajax-Postbacks als logische Ansichten in der Sitzung zu speichern.

Mit dem Standardwert von 15 und dem aktuellen Trend der Ajax-nur Formen und deaktiviert Cache auf dynamischen Seiten, ist dies ein sehr seltenes reale Welt Problem. Richtig entworfenen Formulare sollten auf dem Drücken des Browser-Zurück-Taste nicht einladen. Stattdessen sollten sie auf erfolgreiche Umleitung auf die Zielansicht vorlegen und bei einem Fehler nur die gleiche Form mit Validierungsfehlern erneut anzuzeigen. Siehe für Hinweise auch Schaltfläche Vermeiden Sie zurück auf Web-Anwendung JSF. Wenn dies der Fall auch für Ihre Anwendung ist, dann können Sie den Wert sicher eingestellt 1 ist.

MyFaces hatte ursprünglich keine Entsprechung für diesen und zählte dies als eine physische Ansicht in der Sitzung als auch. In der Version 2.0.6, org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION eingeführt wurde, mit einem ähnlichen Zweck, wenn auch mit einer anderen Implementierung und standardmäßig deaktiviert.


Siehe auch:

Andere Tipps

gefunden Gerade diese im Web: http: // oss .org.cn / ossdocs / java / ee / javaeetutorial5 / doc / JSFConfigure11.html

Dies könnte hilfreich sein:

  

Logische Ansichten sind Subviews einer Top-Level-Ansicht. Zum Beispiel, wenn Sie eine Seite haben, die mehrere Frames dann jeder Rahmen ist eine logische Ansicht.   Wenn Sie eine einfache Anwendung haben dann die Standardeinstellung von 15 Ansichten oder 15 logischer Ansichten könnte zu groß sein. In diesem Fall sollten Sie die zulässige Anzahl von Ansichten und logischen Ansichten zu sparen Speicher zu reduzieren. Umgekehrt kann eine komplexere Anwendung kann mehr als 15 Ansichten oder logische Ansichten erfordert in einer Sitzung gespeichert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top