2017-07-20 2 views
0

Sagen wir, ich habe eine @ViewScoped Bean hinter meiner aktuellen Seite A. Jetzt navigiert der Benutzer auf Seite B über eine normale Anfrage, sagen wir zu www.google.com. Wenn der Benutzer auf die Zurück-Schaltfläche des Browsers klickt, möchte ich das @ViewScope der vorherigen Seite wiederherstellen, so dass es genau so aussieht, wie es übrig war. Ist das irgendwie möglich?Wie kann ViewScoped Bean wiederhergestellt werden, wenn der Benutzer auf die Schaltfläche Zurück klickt?

Ich möchte nicht meine Seite A @SessionScoped machen, so dass die Backing-Beans einander nicht stören, wenn sie in zwei Browser-Tabs geöffnet werden.

+0

Im Falle von Ajaxical Anfragen, gibt es keine Frage der Wiederherstellung - JSF oder anders. In anderen Fällen, wenn die Seitennavigation über HTTP-POST-Anfragen erfolgt, ist das gesamte Konzept der Seitennavigation verworren und muss neu überdacht werden, indem die erforderlichen Anforderungsparameter unter Verwendung der HTTP-GET-Anforderung (Seitennavigation mit entsprechenden Lesezeichen-URLs in jedem Webprojekt) bereitgestellt werden erfolgt über die HTTP GET-Anfrage). – Tiny

+0

Behalten Sie Werte in @PreDestroy() bei und rufen Sie sie in der Methode @PostContruct() zurück. Oder überprüfen Sie diesen Link https://StackOverflow.com/questions/1282251/saving-data-to-session-in-jsf, um zu sehen, wie sie in der Sitzung gespeichert werden. – stakahop

Antwort

0

Seit Version 2.6 OmniFaces hat diese Funktion, heißt @ViewScoped(saveInViewState = true) Aber mit etwas Vorsicht!

Es ist sehr wichtig, dass Sie verstehen, dass diese Einstellung hat möglicherweise einen großen Einfluss auf die Größe des Ansichtszustand JSF, sicher, wenn die Ansicht Bean-Instanz scoped hält „zu viel“ Daten, wie zum Beispiel eine Sammlung von Entitäten eine Datentabelle, und dass solche Beans tatsächlich nie ablaufen, da sie vollständig im versteckten Eingabefeld javax.faces.ViewState auf der HTML-Seite gespeichert sind. Darüber hinaus wird die Annotated-Methode @PreDestroy für eine solche Bean explizit nie aufgerufen, auch nicht beim Entladen, da es durchaus möglich ist, die Seitenquelle zu speichern oder zwischenzuspeichern und sie zu einem (sehr viel späteren) Zeitpunkt erneut auszuführen.

Eine eher programmatische Lösung ist die @ConversationScoped. Mit der Konvertierungs-ID als Parameter können Sie die Ansicht wiederherstellen.

+0

Vielen Dank für Ihren Vorschlag. Ich bin mir nicht sicher über die Implikationen dieses Ansatzes, aber ich werde mich darum kümmern. – Thomas

0

Ja, es ist möglich, Parameter wie folgt mit f: param zu übergeben, damit wird der Parameter an den nächsten Bildschirm übergeben.

<h:commandLink action="screenName" value="#{search.participantName}"> 
    <f:param value="#{searchcus.participantId}" name="PARTICIPANT_ID"/> 
    <f:param name="PARENT_SCREEN_CODE" value="SEARCH_PARTICIPANT"/> 
    </h:commandLink> 

Danach in init() Methode erhalten Wert als Parameter, um das Ergebnis zu holen.

Verwandte Themen