Wie wählen Sie die richtige bean-scope?
Bemerkte ich, dass es verschiedene bean-Bereiche wie:
@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped
Was ist der Zweck eines jeden? Wie wähle ich einen richtigen Bereich für meine Bohne?
courses.coreservlets.com/Course-Materials/pdf/jsf/jsf2/... gibt es eine Beschreibung auf Seite 6
InformationsquelleAutor Valter Silva | 2011-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einführung
Stellt es den Umfang (die Lebensdauer) der bean. Dies ist leichter zu verstehen, wenn Sie vertraut sind mit "im hintergrund" arbeiten, der eine grundlegende servlet-web-Anwendung: Wie servlets arbeiten? Instanziierung, Sitzungen, gemeinsame Variablen und multithreading.
@Request/View/Flow/Session/ApplicationScoped
Einen
@RequestScoped
bean lebt so lange, als ein einzelner HTTP-request-response-Zyklus (beachten Sie, dass eine Ajax-Anfrage zählt als eine einzelne HTTP-Anforderung zu). Ein@ViewScoped
bean lebt so lange, wie Sie die Interaktion mit den gleichen JSF-view durch postbacks, die Aufruf-Aktion Methoden der Rückkehrnull
/void
ohne navigation/umleiten. Ein@FlowScoped
bean lebt so lange, wie Sie die Navigation durch die angegebene Sammlung von Ansichten, eingetragen in den flow-Konfigurationsdatei. Ein@SessionScoped
bean lebt so lange, wie die etablierten HTTP-Sitzung. Ein@ApplicationScoped
bean lebt so lange, wie die web-Anwendung ausgeführt wird. Beachten Sie, dass die CDI@Model
ist im Grunde ein Stereotyp für@Named @RequestScoped
, so gelten dieselben Regeln.Dem Umfang zu wählen, hängt allein von den Daten (dem Zustand) der bean hält und vertritt. Verwenden
@RequestScoped
einfache und nicht-ajax-Formulare/Präsentationen. Verwenden@ViewScoped
für rich-ajax-fähige dynamische Ansichten (ajaxbased Validierung, rendering, Dialoge, etc). Verwenden@FlowScoped
für die "Assistenten" ("Fragebogen") Muster für die Erhebung von input-Daten verteilt über mehrere Seiten. Verwenden@SessionScoped
für die client-spezifischen Daten, wie der angemeldete Benutzer und Benutzer-Einstellungen (Sprache, etc). Verwenden@ApplicationScoped
für die Anwendung große Daten/Konstanten, wie dropdown-Listen, die für alle gleich sind, oder managed beans ohne Instanz-Variablen sind und nur Methoden.Missbrauchen ein
@ApplicationScoped
für session-bean/view/request-scoped Daten machen würde, es werden von allen Benutzern gemeinsam ist, so jemand sehen können gegenseitig die Daten, das ist schlicht und einfach falsch. Missbraucht ein@SessionScoped
bean für anzeigen/request-scoped Daten machen würde, es zu sein, die gemeinsam von allen tabs/Fenstern in einem einzigen browser-Sitzung, also den Endanwender auftreten, inconsitenties bei der Interaktion mit jeder Ansicht nach dem Umschalten zwischen Registerkarten, die ist schlecht für die user experience. Missbraucht ein@RequestScoped
bean für Sicht-scoped Daten machen würde, Blick scoped die Daten werden neu initialisiert, um einen Standard auf jeder einzelnen (ajax) postback verursacht möglicherweise nicht funktionierende Formulare (siehe auch Punkte 4 und 5 hier). Missbraucht ein@ViewScoped
bean für request -, session-oder application-scoped die Daten und Missbrauch von@SessionScoped
bean für application-scoped die Daten nicht auf dem client, aber es unnötig belegt server-Speicher und ist schlicht ineffizient.Beachten Sie, dass der Umfang sollte eher nicht gewählt werden basierend auf den Auswirkungen auf die Leistung, es sei denn, Sie wirklich haben einen geringen Speicherbedarf und will gehen völlig stateless; Sie müssten verwenden Sie ausschließlich
@RequestScoped
Bohnen und Geige mit Anfrage-Parameter des Mandanten zu wahren ist-Zustand. Beachten Sie auch, dass, wenn Sie haben eine JSF-Seite mit unterschiedlich Gültigkeitsbereich von Daten, dann ist es vollkommen gültig, um Sie in separaten backing beans in einem scope Abgleich der Daten Bereich. Die Bohnen können einfach den Zugang zu jedem anderen über@ManagedProperty
im Falle von JSF managed beans oder@Inject
im Falle von CDI managed beans.Siehe auch:
@CustomScoped/NoneScoped/Dependent
Es ist nicht die in Ihrer Frage erwähnt, aber (legacy) JSF unterstützt auch
@CustomScoped
und@NoneScoped
, die selten verwendet in der realen Welt. Die@CustomScoped
beziehen müssen eine benutzerdefinierteMap<K, Bean>
Umsetzung in der etwas breiteren Rahmen, der überschrieben hatMap#put()
- und/oderMap#get()
um mehr feinkörnige Kontrolle über bean-Erstellung und/oder zu zerstören.JSF
@NoneScoped
und CDI@Dependent
im Grunde lebt so lange wie ein einzelnes EL-Auswertung auf der Bohne. Stellen Sie sich ein login-Formular mit zwei input-Felder bezieht eine bean-Eigenschaft und eine Befehlsschaltfläche die Vermittlung eines bean-action, also mit insgesamt drei EL-Ausdrücke, dann auch effektiv drei Instanzen erstellt werden. Ein mit dem Benutzernamen festlegen, ein Passwort mit dem set und ein auf dem die Aktion aufgerufen wird. Sie normalerweise verwenden möchten, dieser Bereich nur auf die Bohnen, die soll Leben, solange die Bohne, wo es eingespritzt wird. Also, wenn ein@NoneScoped
oder@Dependent
injiziert, die in einem@SessionScoped
, dann wird es Leben, solange die@SessionScoped
bean.Siehe auch:
Flash-Bereich
Als Letzte, JSF unterstützt auch den flash-Bereich. Es ist gesichert durch eine kurzlebige Cookies, die in Verbindung mit einem Daten-Eintrag in der session-scope. Vor der Weiterleitung wird ein cookie gesetzt, der auf die HTTP-Antwort mit einem Wert, der eindeutig im Zusammenhang mit der Eingabe der Daten im Gültigkeitsbereich einer session. Nach der Umleitung, die Anwesenheit der flash-scope cookie wird geprüft und die Daten-Eintrag zugeordnet ist, wird das cookie entfernt werden aus dem session-scope und im anforderungsbereich des umgeleiteten Anfrage. Schließlich wird das cookie entfernt werden aus der HTTP-Antwort. Auf diese Weise wird die umgeleitete Anfrage hat Zugriff auf request-scoped Daten, die war vorbereitet worden, in dem ursprünglichen Antrag.
Dies ist aktuell nicht verfügbar als managed-bean-scope, d.h. es gibt keine solche Sache wie
@FlashScoped
. Der flash-Bereich ist nur als eine map überExternalContext#getFlash()
in managed beans und#{flash}
im EL.Siehe auch:
das ist eine alte CDI Umfang und in JSF 2.2 substituiert mit
@FlowScoped
(keine Notwendigkeit, Sie manuell zu starten/stoppen).Und DeltaSpike hat zusätzlich
ViewAccesscoped
undWindowScoped
Ich denke, es ist ein Problem, mit
ViewScoped
bean in MyFaces 2.2. Ich bin derzeit ein Problem mitViewScoped
bean und Ajax, die ich gepostet here. In MyFaces JIRA, es ist auch ein Diskussion zu diesem Thema.InformationsquelleAutor BalusC
Quelle: Core Java Server Faces 3rd Edition von David Geary & Cay Horstmann [Seite keine. 51 - 54]
invalidate()
Methode, oder ungültige Methode?Ein bisschen alt und vielleicht zu spät für die Antwort, aber um es klarzustellen:
FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
aufgerufen wird, in Ihrem "logout bean" ist, was er bedeutet.es wurde legacy Antwort, im moment gibt es 8 Bereiche
aktualisiert wird die Antwort in eine Weile
InformationsquelleAutor Kishor Prakash