it-swarm.com.de

Wie wählt man den richtigen Bohnenumfang?

Mir ist aufgefallen, dass es verschiedene Bean Scopes gibt:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

Was ist der Zweck eines jeden? Wie wähle ich einen geeigneten Bereich für meine Bohne aus?

371
Valter Silva

Einführung

Es repräsentiert den Umfang (die Lebensdauer) der Bohne. Dies ist einfacher zu verstehen, wenn Sie mit der Arbeitsweise einer einfachen Servlet-Webanwendung "unter der Decke" vertraut sind: Wie funktionieren Servlets? Instanziierung, Sitzungen, gemeinsame Variablen und Multithreading .


@Request/View/Flow/Session/ApplicationScoped

Eine @RequestScoped Bean lebt so lange wie ein einzelner HTTP Request-Response-Zyklus (beachten Sie, dass eine Ajax-Anfrage auch als eine einzige HTTP-Anfrage zählt). Eine @ViewScoped Bohne lebt, solange Sie mit derselben JSF-Ansicht durch Postbacks interagieren, die Aktionsmethoden aufrufen, die null/void zurückgeben. ohne Navigation/Weiterleitung. Eine Bean @FlowScoped ist gültig, solange Sie durch die angegebene Sammlung von Ansichten navigieren, die in der Flow-Konfigurationsdatei registriert sind. Eine @SessionScoped Bohne lebt so lange wie die eingerichtete HTTP-Sitzung. Eine @ApplicationScoped Bohne ist so lange gültig, wie die Webanwendung ausgeführt wird. Beachten Sie, dass der CDI @Model Im Grunde genommen ein Stereotyp für @Named @RequestScoped Ist, daher gelten dieselben Regeln.

Welcher Bereich ausgewählt werden soll, hängt ausschließlich von den Daten (dem Zustand) ab, den die Bean enthält und darstellt. Verwenden Sie @RequestScoped Für einfache und ajaxfreie Formulare/Präsentationen. Verwenden Sie @ViewScoped Für umfangreiche Ajax-fähige dynamische Ansichten (Ajax-basierte Validierung, Rendering, Dialoge usw.). Verwenden Sie @FlowScoped Für das Muster "Assistent" ("Fragebogen") zum Sammeln von Eingabedaten, die auf mehrere Seiten verteilt sind. Verwenden Sie @SessionScoped Für kundenspezifische Daten, z. B. den angemeldeten Benutzer und Benutzereinstellungen (Sprache usw.). Verwenden Sie @ApplicationScoped Für anwendungsweite Daten/Konstanten, z. B. Dropdown-Listen, die für alle gleich sind, oder verwaltete Beans ohne Instanzvariablen und mit nur Methoden.

Der Missbrauch einer @ApplicationScoped - Bean für Sitzungs-/Ansichts-/Anforderungsdaten würde dazu führen, dass sie von allen Benutzern gemeinsam genutzt werden, sodass jeder andere die Daten des anderen sehen kann, was einfach falsch ist. Der Missbrauch einer @SessionScoped - Bean für Ansichts-/Anforderungsdaten würde dazu führen, dass diese in einer einzigen Browsersitzung für alle Registerkarten/Fenster freigegeben werden, sodass der Endbenutzer bei der Interaktion mit jeder Ansicht nach dem Umschalten zwischen den Registerkarten möglicherweise Unstimmigkeiten hat für die Benutzererfahrung. Der Missbrauch eines @RequestScoped - Beans für view-bezogene Daten würde dazu führen, dass view-bezogene Daten bei jedem einzelnen (Ajax-) Postback auf den Standardwert zurückgesetzt werden und möglicherweise nicht funktionierende Formulare ( siehe auch die Punkte 4 und 5 hier ). Der Missbrauch eines @ViewScoped - Beans für Request-, Session- oder Application-Scoped-Daten und der Missbrauch eines @SessionScoped - Beans für Application-Scoped-Daten wirken sich nicht auf den Client aus, belegen jedoch unnötig den Serverspeicher und sind ineffizient.

Beachten Sie, dass der Gültigkeitsbereich nicht auf der Grundlage der Auswirkungen auf die Leistung ausgewählt werden sollte, es sei denn, Sie haben wirklich einen geringen Speicherbedarf und möchten vollständig statuslos werden. Sie müssen ausschließlich @RequestScoped Beans und Fiddle mit Anforderungsparametern verwenden, um den Status des Clients beizubehalten. Beachten Sie auch, dass es bei einer einzelnen JSF-Seite mit Daten mit unterschiedlichem Gültigkeitsbereich durchaus zulässig ist, sie in separaten Backing Beans in einem Bereich abzulegen, der dem Bereich der Daten entspricht. Die Beans können bei JSF-verwalteten Beans einfach über @ManagedProperty Oder bei CDI-verwalteten Beans über @Inject Aufeinander zugreifen.

Siehe auch:


@CustomScoped/NoneScoped/Dependent

Es wird in Ihrer Frage nicht erwähnt, aber (Legacy) JSF unterstützt auch @CustomScoped und @NoneScoped , die selten verwendet werden in der realen Welt. Das @CustomScoped Muss auf eine benutzerdefinierte Map<K, Bean> - Implementierung in einem breiteren Bereich verweisen, die Map#put() und/oder Map#get() überschreibt, um eine feinkörnigere Steuerung zu erhalten über Bohnenkreation und/oder zerstören.

Die JSF @NoneScoped Und CDI @Dependent leben im Grunde genommen so lange wie eine einzelne EL-Bewertung auf der Bohne. Stellen Sie sich ein Anmeldeformular mit zwei Eingabefeldern vor, die auf eine Bean-Eigenschaft und eine Befehlsschaltfläche verweisen, die auf eine Bean-Aktion verweisen. Somit werden mit insgesamt drei EL-Ausdrücken effektiv drei Instanzen erstellt. Eine mit dem festgelegten Benutzernamen, eine mit dem festgelegten Kennwort und eine, auf die die Aktion angewendet wird. Normalerweise möchten Sie diesen Bereich nur für Bohnen verwenden, die so lange leben sollten wie die Bohne, in die sie injiziert werden. Wenn also ein @NoneScoped Oder ein @Dependent In ein @SessionScoped Injiziert wird, lebt es so lange wie das Bean @SessionScoped.

Siehe auch:


Flash-Bereich

Als letztes unterstützt JSF auch das Flash-Scope. Es wird von einem kurzlebigen Cookie unterstützt, das einem Dateneintrag im Sitzungsbereich zugeordnet ist. Vor der Umleitung wird in der HTTP-Antwort ein Cookie mit einem Wert gesetzt, der dem Dateneintrag im Sitzungsbereich eindeutig zugeordnet ist. Nach der Umleitung wird das Vorhandensein des Flash-Bereichs-Cookies überprüft, und der mit dem Cookie verknüpfte Dateneintrag wird aus dem Sitzungsbereich entfernt und in den Anforderungsbereich der umgeleiteten Anforderung eingefügt. Schließlich wird das Cookie aus der HTTP-Antwort entfernt. Auf diese Weise hat die umgeleitete Anforderung Zugriff auf Anforderungsdaten, die in der anfänglichen Anforderung vorbereitet wurden.

Dies ist eigentlich nicht als Managed-Bean-Bereich verfügbar, d. H. Es gibt kein @FlashScoped. Das Flash-Scope ist nur als Map über ExternalContext#getFlash() in Managed Beans und #{flash} In EL verfügbar.

Siehe auch:

472
BalusC

Ab JSF 2.x gibt es 4 Bean Scopes:

  • @SessionScoped
  • @RequestScoped
  • @ApplicationScoped
  • @ViewScoped

Sitzungsumfang: Der Sitzungsumfang bleibt vom Zeitpunkt des Sitzungsaufbaus bis zur Beendigung der Sitzung bestehen. Eine Sitzung wird beendet, wenn die Webanwendung die Invalidate-Methode für das HttpSession-Objekt aufruft oder wenn eine Zeitüberschreitung auftritt.

RequestScope: Der Anforderungsbereich ist kurzlebig. Sie beginnt mit dem Senden einer HTTP-Anforderung und endet, nachdem die Antwort an den Client zurückgesendet wurde. Wenn Sie eine verwaltete Bean in den Anforderungsbereich einfügen, wird mit jeder Anforderung eine neue Instanz erstellt. Es lohnt sich, den Anforderungsbereich in Betracht zu ziehen, wenn Sie sich Gedanken über die Kosten für die Speicherung des Sitzungsbereichs machen.

ApplicationScope: Der Anwendungsbereich bleibt für die gesamte Dauer der Webanwendung bestehen. Dieser Bereich wird von allen Anforderungen und allen Sitzungen gemeinsam genutzt. Sie fügen verwaltete Beans in den Anwendungsbereich ein, wenn eine einzelne Bean für alle Instanzen einer Webanwendung freigegeben werden soll. Die Bean wird erstellt, wenn sie zum ersten Mal von einem Benutzer der Anwendung angefordert wird. Sie bleibt am Leben, bis die Webanwendung vom Anwendungsserver entfernt wird.

ViewScope: View-Bereich wurde in JSF 2.0 hinzugefügt. Ein Bean im Ansichtsbereich bleibt bestehen, während dieselbe JSF-Seite erneut angezeigt wird. (In der JSF-Spezifikation wird der Begriff "Ansicht" für eine JSF-Seite verwendet.) Sobald der Benutzer zu einer anderen Seite navigiert, verlässt die Bean den Gültigkeitsbereich.

Wählen Sie den Umfang, den Sie benötigen.

Quelle: Core Java Server Faces 3rd Edition von David Geary & Cay Horstmann [Seite Nr. 51 - 54] enter image description here

121
Kishor Prakash