Zugriff auf eine andere Backing Bean ermöglichen (basic)

In der faces-config.xml kann eine Verbindung von einer Backing Bean zu einer anderen ermöglicht werden, indem man mit so genannten Managed Properties arbeitet. Der folgende Code-Ausschnitt verdeutlicht dies:

< managed-bean>
    < managed-bean-name>activityClient</managed-bean-name>
    < managed-bean-class>com.connect.activity.client.ActivityClient</managed-bean-class>
    < managed-bean-scope>application</managed-bean-scope>
</managed-bean>
< managed-bean>
    < managed-bean-name>dictionaryAction</managed-bean-name>
    < managed-bean-class>com.connect.activity.action.DictionaryAction</managed-bean-class>
    < managed-bean-scope>request</managed-bean-scope>
    < managed-property>
        < property-name>activityClient</property-name>
        < value>#{activityClient}</value>
    </managed-property>
</managed-bean>

Aus der Bean dictionaryAction wird durch die Angabe managed-property die Referenz auf den activityClient mittels #{activityClient} möglich. Nützlich ist in diesem Zusammenhang auch der Artikel The JavaServer Faces Managed Bean Facility.

Zugriff auf die vorangehende Backing Bean ermöglichen (advanced)

Jede JSP-Page hat eine eigene Backing Bean mit dem Scope request. Diese Backing Bean kann Properties (binding attributes) besitzen, mit deren Hilfe man im Java-Kontext an die Interaktionselemente der JSP-Page herankommt. Es ist jedoch schwierig, im Kontext init() einer Backing Bean an die Inhalte der Interaktionselemente in der vorangehenden JSP-Page zu gelangen. Hier die Lösung:

Das folgende Szenario hat zwei JSP-Pages namens Login.jsp und Main.jsp. Automatisch erstellt wurden die Backing Beans Login.java und Main.java. In der Login.jsp werden Benutzername und Kennwort eingegeben.

In der Backing Bean Main.java soll nun beispielsweise der Inhalt des Interaktionselements passwordFieldPassword ausgelesen werden, dessen Binding Attribute sich jedoch in der vorangegangenen Backing Bean Login.java befindet. Mit Hilfe des folgenden Quelltext-Fragments gelangt man im Kontext der Backing Bean Main.java an eine Referenz der noch gültigen Backing Bean Login.java, um ihre Properties auszulesen:

@Override
public void init() {
    // ...
    FacesContext facesContext = FacesContext.getCurrentInstance();
    Login login = (Login) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "Login");
    String password = (String) (login.getPasswordFieldPassword().getText());
    // ...
}