JSF: Methode eines anderen managedBeans aufrufen

schlumsch

Mitglied
Hallo allerseits,

ich habe da mal eine (sicher triviale ... zuzmindest die Anwort darauf) Frage. Ich habe ein Portlet mit mehreren managed-Beans. In meinem ersten Bean (s.u.: "PlanningResultsBean") lade ich einen Reiseplan. In einer Methode gebe ich verschiedene Variablen in den facesContext und navigiere zu einer anderen xhtml-Seite. Durch diese neue Seite wird ein anderes Bean (s.u.: "Bean") initialisiert und die variablen aus dem Context gelesen. Nun selektiert der User eine neue Option im Plan (s.u.: hotelSelection").
Soweit alles wunderbar, nun will ich allerdings auch wieder zurück auf die erste Seite gelangen und dort natürlich den neuen Plan anzeigen. Das einzige, was ich dazu machen muss, ist den Plan neu zu laden, da ich zuvor alle Änderungen in einer DB abgelegt habe.

Meine Frage ist also, wie ich eine methode der laufenden Instanz vom PlanningResultsBean aurufe?
Ich kann mir ja im Bean2 ein Property Bean1 anlegen und dann auf die Methoden von Bean1 zugreifen, allerdings erzeuge ich doch dabei eine neue Instanz von Bean1, right? Das ist ja nicht Sinn und Zweck der Sache...

...mal ein kleiner Codeschnipsel zur Demo...
faces-config:
(die showResults.xhtml gehört zum PlanningResultsBean, Hotelinfo zum Bean)
Code:
...
  <managed-bean-name>Bean</managed-bean-name>
  <managed-bean-class>com.e2e.portal.ta.hotel.Bean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
...
                <managed-bean>
                <managed-bean-name>planingResults</managed-bean-name>
                <managed-bean-class>com.e2e.portal.ta.result.beans.PlanningResultsBean</managed-bean-class>
                <managed-bean-scope>session</managed-bean-scope>
...
                <navigation-case>
                        <from-outcome>tohotel</from-outcome>
                        <to-view-id>/jsf/Hotelinfo.xhtml</to-view-id>
                </navigation-case> 				
                <navigation-case>
                        <from-outcome>toresult</from-outcome>
                        <to-view-id>/jsf/showResults.xhtml</to-view-id>
                </navigation-case>

im Bean
Code:
	public String setHotelSelection(int hotelSelection) {

		this.hotelSelection = hotelSelection;
                 ...
		reiseplan.store();
                return "toresult"
	}
im Planningresultbean
Code:
public void reloadPlan() {
...
reiseplan.reload();
...
}
 
Meine Frage ist also, wie ich eine methode der laufenden Instanz vom PlanningResultsBean aurufe?
Ich kann mir ja im Bean2 ein Property Bean1 anlegen und dann auf die Methoden von Bean1 zugreifen, allerdings erzeuge ich doch dabei eine neue Instanz von Bean1, right?
Falsch. Deine Beans befinden sich im session scope, somit haben sind die über die Dauer der kompletten Session gültig. Außerdem gibt es von ihnen nur eine Instanz, was natürlich auch Sinn macht. :)

Du kannst also entweder Bean1 Bean2 in der faces-config.xml als Property zuweisen
Code:
 <managed-bean>
  <managed-bean-name>bean1</managed-bean-name>
  <managed-bean-class>path.Bean1</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>

 <managed-bean>
  <managed-bean-name>bean2</managed-bean-name>
  <managed-bean-class>path.Bean2</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
  <managed-property>
   <property-name>bean1</property-name>
   <value>#{bean1}</value>
  </managed-property>
 </managed-bean>

oder dir die Bean zur Laufzeit aus dem FacesContext holen
Java:
Bean1 bean1 = (Bean1 ) FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().get("bean1");


Gruß Tim
 

Neue Beiträge

Zurück