# JSF - Frage zu Managed Beans und DataTable



## nightpoet (12. Dez 2007)

Hallo zusammen

Ich habe wieder mal ein DataTable Problem.

Eine DataTable wird mit einer Liste gefüllt, die Instanzen einer Bean als Elemente enthält. Innerhalb der Tabelle sollen Einträge über einen CommandLink selektiert werden können. Die ausgwählte Zeile muss anschließend auf einer weiteren Seite im Detail angezeigt werden.

Die Anzeige der Tabelle und das Auslesen der ausgewählten Zeile klappt soweit ganz gut. 

Nun hätte ich jedoch die Frage, wie ich die ausgewählte Bean für die Verwendung auf der nächsten Seite registriere. 

Ich hatte es zunächst mit:


```
public static void setBeanInstance(String beanName, Object bean) {
FacesContext context = FacesContext.getCurrentInstance();
        context.getELContext().getELResolver().setValue(context.getELContext(), null, beanName, bean);
    }
```

probiert. 

Allerdings werden die Properties der Bean dann nur auf der nächsten Seite korrekt angezeigt. Nach einem weiteren Seitenaufruf ist die Bean wieder auf null gesetzt und wird bei einer erneuten Verwendung neu initalisiert. Die Bean muss jedoch innerhalb der gesamten Session verfügbar sein.

Hat jemand hierzu eine Idee oder ein gutes Beispiel/ Tutorial.

Ich wäre sehr Dankbar, wenn mir jemand weiterhelfen könnte.

Viele Grüße


----------



## y0dA (13. Dez 2007)

Du kannst in der faces.config einstellen, wie lange die Bean existieren soll.


```
<managed-bean>
		<managed-bean-name>beanName</managed-bean-name>
		<managed-bean-class>at.projekt.BeanKlasse</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
	</managed-bean>
```

scope mit *session* hast du dann solange bis die session endet. momentan dürften sie auf request sein.


----------



## nightpoet (14. Dez 2007)

Danke 

Ich habe das Problem nun durch einen Controller gelöst. Die Bean war mit Session Scope konfiguriert. Allerdings scheint es so, dass die setValue Methode des ELResolver Bean Instanzen, unabhängig von den Einstellungen in der faces-config.xml, nur im Request Scope speichert.


----------



## freez (14. Dez 2007)

Hm, warum gibst du dem CommandLink nicht einen Parameter mit, der als Wert eine eindeutige Zuordnung (ID) zu deiner Zeile darstellt? Dann kannst du in dem CommandLink einen ActionListener registrieren, der den Parameter liest und anhand der ID holt sich der ActionListener weitere Informationen, die du dann auf der zweiten Seite darstellen möchtest.

Wenn dann die Bean im Session Scope läuft sind diese Daten dann auch weiterhin vorhanden.

Jedenfalls arbeite ich immer so mit CommandLinks in der DataTable und habe damit noch nie Probleme gehabt.


----------



## nightpoet (14. Dez 2007)

Die ausgewählte Zeile abzugreifen ist nicht das Problem. Dies mache ich über ein Binding des der DataTable entsprechenden Java Objektes (HtmlDataTable) an eine Varibale in meiner Controller Bean. Über einen einfachen Aufruf von getRowData() kann ich die Zeile dann in einem ActionListener aus der Tabelle auslesen. 
Was nicht funktionierte war die Speicherung der Auswahl, damit sie später auf weiteren Seiten angezeigt werden kann.


----------

