JSF 2 Facetten f: Metadaten / in Vorlage und Seite

8

Ich habe die folgende Vorlage (masterLayout.xhtml):

%Vor%

und die Seite, die es verwendet (search.xhtml):

%Vor%

Das Problem ist, dass ich den Aufruf an userSessionBean.preRenderViewCookieLogin(e) in der Vorlage platzieren möchte, da es viele andere Seiten gibt. Diese Methode prüft, ob der Benutzer angemeldet ist (je nach Sitzungsstatus) und überprüft, ob ein Cookie verfügbar ist, mit dem der Benutzer angemeldet werden kann. Falls dies der Fall ist, wird der Benutzer automatisch angemeldet . Das System funktioniert im obigen Code, aber wenn ich versuche, dies in die Vorlage zu schieben, werden meine Ansichtsparameter nicht mehr eingestellt.

Hier ist die modifizierte Version von oben, wobei userSessionBean.preRenderViewCookieLogin(e) auf die Vorlage geschoben wurde.

masterLayout.xhtml:

%Vor%

search.xhtml

%Vor%

Beachten Sie, dass ich das <f:metadata/> -Tag in die Vorlage verschoben habe. Das ist das Problem, da das Entfernen von userSessionBean.preRenderViewCookieLogin(e) keinen Unterschied macht. Ich habe auch versucht, eine Variation des funktionierenden Codes auszuprobieren, nämlich userSessionBean.preRenderViewCookieLogin(e) in die Vorlage zu verschieben, was bedeutet, dass er nicht innerhalb des <f:metadata/> -Tags sein kann. In diesem Fall wurde diese Methode ausgeführt, nachdem alle Ansichtsparameter gesetzt und searchBean.preRenderView(e) aufgerufen wurden. Ich möchte, dass userSessionBean.preRenderViewCookieLogin(e) aufgerufen wird, bevor das preRenderView(e) einer Seite aufgerufen wird, nicht danach. Und nur zum Spaß habe ich versucht, ein <f:metadata/> um userSessionBean.preRenderViewCookieLogin(e) zu setzen, das diese Methode aufgerufen hat, aber die Ansichtsparameter nicht gesetzt hat.

Also würde ich gerne wissen:

  1. Warum passiert das und gibt es einen Weg, es zu reparieren?
  2. Gibt es einen besseren Weg, um sicherzustellen, dass für jede Seite dieselbe Methode aufgerufen wird?

Bearbeiten: Ich habe gerade etwas anderes probiert - ein Phasenereignis: %Code% Dies ist in masterLayout.xhtml. Es wird überhaupt nicht gerufen; nicht für irgendeine Phase.

Bearbeiten: Die <f:view contentType="text/html" beforePhase="#{userSessionBean.beforePhase(e)}"> entfernt (verdammt du NetBeans!): %Code% Dies wird nur vor der Render-Antwort-Phase aufgerufen, was natürlich bedeutet, dass es aufgerufen wird, nachdem das e -Ereignis ausgelöst wurde.

    
Steve Taylor 27.09.2011, 18:42
quelle

2 Antworten

13
  

Warum passiert das und gibt es eine Möglichkeit, das Problem zu beheben?

Aus der <f:metadata> -Tag-Dokumentation (Schwerpunkt des 2. Absatzes ist meiner):

  

Deklarieren Sie das Metadatenfacet für diese Ansicht. Dies muss ein Kind von <f:view> sein. Dieses Tag muss in der XHTML-Datei der obersten Ebene für die angegebene viewId oder in einem Vorlagenclient, aber nicht in einer Vorlage enthalten sein. Die Implementierung muss sicherstellen, dass das direkte untergeordnete Element der Facette UIPanel ist. , auch wenn es nur ein Kind der Facette gibt. Die Implementierung muss die ID des UIPanel auf den Wert der symbolischen Konstante UIViewRoot.METADATA_FACET_NAME setzen.

Also muss es wirklich in die Draufsicht gehen, nicht in die Vorlage.

  

Gibt es einen besseren Weg, um sicherzustellen, dass die gleiche Methode für jede Seite vor allem anderen aufgerufen wird?

Speichern Sie den angemeldeten Benutzer in Ihrem speziellen Fall als Eigenschaft einer verwalteten Bean im Sitzungsbereich anstelle eines Cookies und verwenden Sie Filter auf das entsprechende URL-Muster, um es zu überprüfen. Für den Sitzungsbereich verwaltete verwaltete Beans sind im Filter als HttpSession -Attribute verfügbar. Homegrown Cookies sind unnötig, da du das HttpSession hier neu erfindest. Es sei denn, Sie möchten sich an mich erinnern, aber das sollte nicht so gelöst werden. Mach es auch in einem Filter.

Siehe auch:

BalusC 27.09.2011, 19:13
quelle
0

Ich habe das funktioniert mit einem PhaseListener statt.

%Vor%

und das kleine bisschen Nachschlag Magie ist hier:

%Vor%

Danke an @BalusC dafür: JSF - Bekomme Bean nach Namen . Da ich CDI verwende, kann ich die deklarative Option @ManagedProperty nicht verwenden. Aber keine große Sache.

    
Steve Taylor 28.09.2011 10:45
quelle

Tags und Links