2010-11-29 3 views
5

Ist es möglich, einen Verweis auf die auszuführende managedbean im before-invokeApplication-Phaselistener zu erhalten?JSF 2: Zugriff auf die Instanz der verwalteten Bean im Phasen-Listener-Objekt?

Vor der Aufruf-Anwendungsphase sollte es klar sein, welche managedBean die Methode ausführen wird.

Für das Beispiel angenommen, es gibt 1 Main-Management-Bean, um 1 JSF-Seite zu behandeln.

Also, was ich brauche, ist im Grunde:

  1. Der Benutzer Zugriff auf das Programm aus dem Menü
  2. Weil es aus dem Menü zugegriffen wird, die Haupt Bean Methode init() verwalten wird aufgerufen, stopft zu initialisieren, wie die Vorbereitung Daten, Autorisierung tun prüft
  3. Nachfolgende vorträgt brauchen nicht mehr die init() Methode aufrufen, bis es aus dem Menü

zur Umsetzung der Punkt # erneut zugegriffen hat 2, ich denke, eine der Phasen abzufangen

Ich habe die API-Dokumentation über das Erhalten der verwalteten Bean in der Implementierung der Phasen überprüft, aber ich konnte nicht scheinen, irgendwelche zu finden.

Nachdem ich diese Frage eingegeben habe, merke ich, dass ich das in @PostConstruct oder dem Konstruktor der verwalteten Bean machen könnte, aber das würde nur beim ersten Erstellen der Bean funktionieren, und ich muss die Methode jedes Mal aufrufen, wenn die JSF ist Zugriff über das Menü.

Irgendwelche Vorschläge?

Grüße,
Albert Kam

Antwort

3

Sie können Ihre verwalteten Bohnen über die ELContext/ELResolver zugreifen. Dies wird schön in der MyFaces wiki erklärt (funktioniert auch in Vanille JSF).

Zum Beispiel:

ELContext elContext = FacesContext.getCurrentInstance().getELContext(); 
NeededBean neededBean = (NeededBean) FacesContext.getCurrentInstance().getApplication() 
    .getELResolver().getValue(elContext, null, "neededBean"); 

Siehe MyFaces wiki entry für weitere Erläuterungen und Ausführungen für andere JSF-Versionen.

Ihre Idee, @PostConstruct zu verwenden, ist eine gute Idee. Überlegen Sie, ob Sie Ihren Bereich in etwas geändert haben, das @ViewScoped gefällt, so dass die Logik jedes Mal ausgeführt wird, wenn Sie zu dieser Ansicht navigieren.

Schauen Sie sich auch die PreRenderViewEvent (für JSF 2). Dieser Code ist in Ihre Facelet-Seite eingebettet:

<f:metadata> 
<f:viewParam name="foo" value="#{bean.foo}"/> 
<f:event type="preRenderView" listener="#{bean.doSomething}"/> 
</f:metadata> 

Der f: -Ereignislistener wird vor jeder Seitenanzeige ausgeführt.

+0

Wow, so viele Möglichkeiten. Vielen Dank ! – bertie

+1

Ich sehe nicht, wie das genau die Instanz zurückgibt, die an der Aktionsmethode beteiligt war. Ihr Ansatz erfordert, dass der Name des Beans bereits bekannt ist. Übrigens bevorzuge ich die ['Application # evaluateExpressionGet()'] (http://download.oracle.com/javaee/6/api/javax/faces/application/Application.html#evaluateExpressionGet%28javax.faces.context .FacesContext,% 20java.lang.String,% 20java.lang.Class% 29) Kurzschrift anstelle von 'ELResolver/ELContext'. Siehe auch [diese Antwort] (http://stackoverflow.com/questions/2633112/jsf-get-managed-bean-by-name). – BalusC

+0

Nun, wenn sein Phasenlistener in der Anwendungsphase vor dem Aufruf zuhört, dann instanziert der Phasenlistener die Objektinstanz. Auf dieselbe Instanz wird in der Anwendungsmethode verwiesen (die während der Aufrufphase aufgerufen wird), da sich die verwaltete Klasse immer noch im Bereich befindet (gleiche Anforderung). Ich habe die Frage beantwortet, wie es geht, aber ich befürworte es nicht als die beste Lösung. Ich habe Alternativen angeboten, die besser zum Erreichen des Endziels geeignet scheinen. –

Verwandte Themen