Ist das Gespräch Bereich ein geeigneter Ersatz für die Ansicht von scope?
In JSF 2.0, der offensichtlichste Anwendungsfall für die view-scope ist eine einzelne Seite mit potenziell mehreren AJAX-post-Rücken. Mit CDI anstelle von JSF managed beans verlässt uns, ohne den Blick Umfang so wir sind entweder Links, um die Umsetzung unserer eigenen, einen (möglicherweise fehlerbehaftete) Dritter Durchführung oder verwenden Sie den conversation scope.
Meine Frage: Ist der conversation scope ein würdiger Ersatz für den view-Bereich in der typischen AJAX-situation? Wie die Ansicht von scope ist die Möglichkeit, mehrere Instanzen pro session? Was sind die Fallstricke?
Ich bin mir bewusst, über eine der Fallstricke, nämlich, dass das Gespräch Bereich nicht automatisch gelöscht, wenn der Benutzer navigiert Weg von der Seite, sondern wird gelöscht, nachdem ein time-out. Aber ich bin mir nicht sicher, was passiert, wenn der Benutzer navigiert zurück zu dieser Seite, bevor das Gespräch abgelaufen ist.
UPDATE
Gespräch Bereich ist in der Tat Unterstützung für mehrere Instanzen pro session. Dieses Buch Staaten so viel und ich war in der Lage, dies zu bestätigen, mit code von ch. 2.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In jedem
@ConversationScoped
CDI beans, müssen Sie haben das folgende Feld:Wann immer Sie wollen, um die Konversation beginnen, müssen Sie prüfen, ob die bean ist in
transient
Zustand. AnsonstenIllegalStateException
geworfen werden. Es wäre so etwas wie dieses:Dadurch Ihre Bohnen werden in der
long-running
Zustand. Daher, wenn der Benutzer navigieren immer von der Seite und zurück navigiert werden, später können Sie immer überprüfen, ob sein Gespräch abgelaufen ist-oder auch nicht und bringen Sie ihn auf die Seite, wo er Sie verließ.Außerdem, ich habe mit
@ViewScoped
ManagedBean zusammen mit CDI-bean für eine Weile. Sie können immer noch@Inject
zu injizieren CDI-bean in eine MangedBean. Ich glaube nicht, dass Sie tun können, anders herum aber. Wie auch immer, ich habe keine Ahnung, ob dies würde bewirken, dass etwas schlimmes passieren später. Jedoch, bis jetzt, ich habe noch nie traf alle Probleme. Wenn Sie wirklich wollen, zu verwenden@ViewScoped
, ich glaube, Sie versuchen können :P.UPDATE:
Ich glaube nicht, dass
@ConversationScoped
kann jemals vollständig ersetzen@ViewScoped
.Nein, Sie können nicht mehrere Instanzen pro session. Wie ich bereits erwähnt, wenn Sie ein neues Gespräch zu starten, während der alte das Gespräch ist noch in
long-running
Zustand, erhalten SieIllegalStateException
.Gut, einer der wichtigsten Vorteile
@ViewScoped
über@RequestScoped
ist, dass Sie nicht brauchen, um re-initiieren Daten jedes mal, wenn der Benutzer das Formular sendet, um die gleiche Ansicht. Jedoch, mit@ConversationScoped
dieser Vorteil ist über-verwendet. Während dieses problem ist nicht so gravierend, wie wenn Sie@SessionScoped
Sie noch brauchen, um die initiierten Daten so lange, wie die@ConversationScoped
bean lebt. Je länger das Gespräch, desto mehr Daten müssen Sie möglicherweise zu halten.@EJB
. Dies würde die Arbeit auf beidenCDI beans
undManagedBean
. Außerdem, der Grund für die VerwendungCDI
ist NICHT zur Verwaltung von JSF-scopes. Es geht mehr um die Tatsache, dass Sie gelingen kann, eine größere Anzahl von Dingen in CDI-beans.conversation.begin();
wieder vor dem Aufrufconversation.end();
?IllegalStateException
, aber das fehlt den Punkt. Und warum sollte das jemand machen, der überhaupt? Offensichtlich, was passiert in meinem test ist, dass mehrere Instanzen des gleichen@ConversationScoped
bean-Klasse instanziiert wird, wird jede Wartung ein anderes browser-Fenster noch gebunden an der gleichen Sitzung. In dieser Hinsicht hat das gleiche Verhalten wie@ViewScoped
.@ConversationScoped
bean für mehrere browser-Fenster.