In JSF 2.0 ist der offensichtlichste Anwendungsfall für den Ansichtsbereich eine einzelne Seite mit möglicherweise mehreren AJAX-Postbacks. Die Verwendung von CDI anstelle von JSF-verwalteten Beans lässt uns ohne den Ansichtsbereich, sodass wir entweder eigene implementieren, eine (möglicherweise fehlerbehaftete) Implementierung von Drittanbietern verwenden oder den Konversationsbereich verwenden.
Meine Frage: Ist der Konversationsbereich ein würdiger Ersatz für den Sichtbereich in der typischen AJAX-Situation? Wie der Ansichtsbereich erlaubt es mehrere Instanzen pro Sitzung? Was sind die Fallstricke?
Mir ist einer der Fallstricke bewusst, dass der Konversationsbereich nicht automatisch gelöscht wird, wenn der Benutzer von der Seite weg navigiert, sondern stattdessen nach einer Zeitüberschreitung gelöscht wird. Aber ich bin mir nicht sicher, was passiert, wenn der Benutzer zurück auf diese Seite navigiert, bevor die Konversation abgelaufen ist.
AKTUALISIEREN
Der Konversationsbereich unterstützt tatsächlich mehrere Instanzen pro Sitzung. Dieses Buch gibt so viel an und ich konnte dies anhand des Codes von ch bestätigen. 2.
In% @ConversationScoped
CDI-Beans müssen Sie das folgende Feld haben:
Wenn Sie mit der Konversation beginnen möchten, müssen Sie prüfen, ob die Bean in transient
state ist. Andernfalls wird IllegalStateException
ausgelöst. Es wäre etwa so:
Dadurch befindet sich Ihre Bean im long-running
-Zustand. Wenn der Benutzer also von der Seite weg navigiert und später zurück navigiert, können Sie immer überprüfen, ob seine Konversation abgelaufen ist oder nicht und ihn auf die Seite bringen, von der er gegangen ist.
Außerdem habe ich @ViewScoped
ManagedBean zusammen mit CDI-Bean für eine Weile benutzt. Sie können weiterhin @Inject
verwenden, um eine CDI-Bean in ein MangedBean zu injizieren. Ich glaube nicht, dass du das anders machen kannst. Wie auch immer, ich habe keine Ahnung, ob das später etwas Schlimmes verursachen würde. Bis jetzt habe ich jedoch noch nie Probleme gefunden. Wenn Sie @ViewScoped
wirklich verwenden möchten, können Sie Folgendes versuchen: P.
UPDATE:
Ist der Konversationsbereich ein würdiger Ersatz für den Ansichtsbereich in der typischen AJAX-Situation?
Ich glaube nicht, dass @ConversationScoped
jemals @ViewScoped
ersetzen kann.
Wie erlaubt der Ansichtsbereich mehrere Instanzen pro Sitzung?
Nein, Sie können nicht mehrere Instanzen pro Sitzung haben. Wie bereits erwähnt, wenn Sie eine neue Conversation starten, während sich die alte Conversation noch in long-running
state befindet, erhalten Sie IllegalStateException
.
Was sind die Fallstricke?
Nun, einer der Hauptvorteile von @ViewScoped
über @RequestScoped
besteht darin, dass Sie die Daten nicht jedes Mal erneut initiieren müssen, wenn der Benutzer das Formular an dieselbe Ansicht sendet. Mit @ConversationScoped
wird dieser Vorteil jedoch zu oft genutzt. Obwohl dieses Problem nicht so gravierend ist wie bei Verwendung von @SessionScoped
, müssen Sie die initiierten Daten weiterhin speichern, solange die @ConversationScoped
-Bohne lebt. Je länger die Konversation, desto mehr Daten müssen gespeichert werden.
Tags und Links java jsf-2 cdi conversation-scope