# JSF datatable mit buttons Werte übergeben



## Solid (16. Feb 2007)

Hallo Gemeinde.

Ich stehe vor folgendem problem:

Bastel mit gerade eine kleine Benutzerverwaltung. JDBC Anbindung funktioniert. Wenn ich folgende JSP aufrufe wird einer Liste aller User und Ihrer ID ausgegeben. Nun habe ich auch noch Methode geschrieben die einen User aus der DB löscht. Ich möchte das hinter Jedem User/id ein Button ist und wenn ich diesen betätige dieser gelöscht wird und die JSP sich refresht und die Liste neue geladen wird.

Habe eine UserTasks und User Klasse. In User sind alle Attribute. UserTasks erbt von User.

Laden der Liste, sowie der Refresh bei Button klick funktionieren. Hier der Code:


```
<h:dataTable id="userlist" columnClasses="list-column-center" rowClasses="list-row"
                                 styleClass="list-background" value="#{UserTasks.userList}" var="currentUser">
                        
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Benutzername"/>
                            </f:facet>
                            <h:outputText value="#{currentUser.username}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="ID"/>
                            </f:facet>
                            <h:outputText value="#{currentUser.id}"/>
                        </h:column>
                        <h:column>
                            <f:facet name="header">
                                <h:outputText value="Option"/>
                            </f:facet>
                            <h:form id="deleteuser">
                                <h:inputText id="username" value="#{currentUser.username}"/>
                                <h:inputText id="id" value="#{currentUser.id}" size="2" />
                                <h:commandButton id="del" action="#{UserTasks.deleteUser}" value="        "/>
                            </h:form>
                        </h:column>
                        
                    </h:dataTable>
```

Mein Problem ist nun folgendes: Die form in der der "löschButton" liegt wird befüllt mit den Werten aus currentUser.username. Wenn ich löschtButton betätige wird die Methode deleteUser ausgefüht:


```
public String deleteUser() throws Exception {
        UserDBActions.deleteUser(username);
        return Constans.REFRESH;
    }
```

JSF sorgt ja dafür sich den usernamen aus der Form zu holen. Doch wird er dort ja mit currentuser.username nur temporär gefüllt. Wenn ich den Button hinter einem User drücke ist username bereits wieder "null". Ist ja auch klar weil currentUser.username nur währender des Erstellen der Liste vorhanden ist. 

Wie kann ich das Lösen? Wenn ich den Button klicke soll er den Usernamen nehmen welcher kurzzeit in currentUser steht.

Hoffe mir kann nemand helfen.


----------



## Solid (16. Feb 2007)

so habe das Problem gelöst.

habe die fkt. deleteUser einfach in User gepackt. dann kann ich das so lösen:


```
<h:commandButton id="del" action="#{currentUser.deleteUser}" value="        "/>

statt

<h:commandButton id="del" action="#{UserTasks.deleteUser}" value="        "/>
```

und es geht =)


----------



## freez (3. Jun 2007)

Servus,

ich stehe gerade vor einem ähnlichen Problem. Kannst du dein Code noch etwas ausführlicher darstellen (vor allem die Beans)


----------



## Björn K. (3. Jun 2007)

Hallo!

Wenn ihr in die User-Klasse (also nicht die Klasse die die managed Bean repräsentiert) die Methoden deleteUser und editUser etc... reinmacht könnt ihr mit currentUser als Referenz auf die Entity-Class, die denn User repräsentiert die Actions reinmachen. Das ist das was euch Solid sagen wollte. Also

UserBean ist Managed hat die Methoden getUserList etc.... aber wenn ihr in dem dataTable über die Sätze iteriert und Zeile für Zeile ausgeben lasst, habt ihr ja mit currentUser (welches ja die Referenz auf die Entity-Class User ist) eine Referenz und da könnt ihr einfach ein

DELETE FROM usertabelle WHERE ID = (this.id)

setzen, da die Referenz ja selber den User repräsentiert.

Also nochmal:

Nicht in der UserBean sondern in der User-Entität die Edit und Delete und Save-Methoden rein! So hab ichs auch gemacht. 

Viele Grüße

Björn K.


----------



## Björn K. (3. Jun 2007)

Ach so ein REFRESH findet normalerweise automatisch nach dem ausführen einer Action mit #{User.delete} statt.


----------



## freez (10. Jun 2007)

Hallo,

ich habe es nun anders gelöst:

Zuerst habe ich einen Parameter an den commandLink gehängt, welcher die ID des Datensatzes aus der MySQL Table enthält. Damit habe ich in jeder Row einen Link welcher die passende ID mitschickt:

```
<h:commandLink actionListener="#{personListBean.selectPerson}">
     <h:outputText value="Edit" />
     <f:param name="id" value="#{person.id}" id="id"/>
</h:commandLink>
```

Dabei ist "PersonList" die Bean, welche die komplette Liste enthält und "person" die Bean die ich im Var Attribut des Datatables angebe: var="person"

So, nun wird bei einem Klick auf den commandLink die Methode selectPerson aus der personListBean aufgerufen. Ihr wird ein ActionEvent übergeben, aus dem ich den Parameter mit dem Namen "id" auslesen kann (wird in <faram dem Attribut id mitgegeben ... hier: id="id"):


```
public String selectPerson(ActionEvent ae){
		UIParameter component = (UIParameter) ae.getComponent().findComponent("id");
		this.selectedId = Integer.parseInt(component.getValue().toString());
		System.out.println(selectedId);
		return "true";
	}
```

Zuerst hole ich mir den UIParameter mit dem Namen "id". Dann hole ich mir den Wert mit getValue. Da bei mir die ID ein Zahlenwert vom Typ Integer ist, habe ich den String noch in ein Integer gewandelt. Der letzte Vorgang ist allerdings optional.

Man kann das ganze auch noch kürzer schreiben, wenn man es nur als String benötigt:

```
this.selectedId = ((UIParameter) ae.getComponent().findComponent("id")).getValue().toString();
```


----------

