# Struts und Objekte in Comboboxen



## tremor4fun (29. Nov 2006)

Hallo, 

ich habe folgendes Problem, ich habe eine Combobox, welche mit einer Collection, die wiederum Objekte enthält gefüllt wird. Das Anzeigen im JSP ist kein Problem, hier einmal der Quelltext:


```
<td> 
  <html:select  styleClass="mustbe-input-widget" property="selectedItem">
    <logic:iterate id="vereinObj" name="NeuesMitgliedForm" property="verein" type="Verein">
       <html:option value="<%=vereinObj.toString()%>"/>
    </logic:iterate>
  </html:select> 
</td>
```

Der Verein ist vom Typ Objekt und besteht aus Name (String) und Nummer (int). Die .toString()-Methode liefert mir den Namen des Vereins.
Ich möchte jetzt die Auswahl Speichern und von selectedItem() mein gewähltes Objekt zurückbekommen. 
Ich bekomme allerdings nur immer den String des Vereinsnamens (was ja einerseits auch logisch ist, da unter "htmlption value" ja auch nur Strings stehen)
Also, zur Zeit sieht die .SelectedItem()-Methode des Form wiefolgt aus:


```
public void setSelectedItem(String name)
{
  _name = name; 
}
public String getSelectedItem()
{
  return _name;
}
String _name;
```

und ich baue mir an anderer Stelle mit dem Ausgelesenen Namen mein Objekt neu.
Allerdings finde ich das unschön, da ich ja an die Combobox quasi fertige Objekte übergebe.

Ich hätte also gern irgendwas funktionierendes in der Art von:


```
public void setSelectedItem(Verein verein)
{
  _verein = verein;
}
public String getSelectedItem()
{
  return _verein;
}
Verein _name;
```

so das ich mir nicht das Objekt (was ich ja vorher schon hatte) immer neu bauen muss.
Trotz intensiver Suche konnt ich bis jetzt keine Lösung finden, ich bin mir zur Zeit nicht mal sicher, ob das überhaupt mit ner Combobox funktioniert, da die ja unter "value" irgendwie jedesmal expliziet nen String verlangt.
Wäre echt nett, wenn mir jemand helfen könnte.
Danke.


----------



## tremor4fun (29. Nov 2006)

...uups, in der letzten Quelltextzeile muss es natürlich "Verein _verein" heissen...


----------



## SlaterB (29. Nov 2006)

wie stellst du dir das vor? 
zum Browser wird HTML-Code geschickt,
zurück kommt wieder ein HTML-Request mit der Auswahl,

man kann nur Strings übertragen, mit etwas automatischer Umformung auch Zahlen,
oder auch bye[] für Bilder etc.,

aber Java-Objekte, das geht nicht, 
man könnte die natürlich irgendwie kodieren (Klassenname, Wert aller Attribute),
aber selbst dann hätte man nach dem Zerlegen und wieder zusammenbauen ein anderes neues Objekt,
nicht das gleiche,

das gleiche kriegt man indem man das GANZ NORMAL macht,
indem man ganz sparsam die ganz kurze Id überträgt und danach anhand der Id das Objekt wieder bestimmt,

das ist sparsam (wenig Arbeit für die CPU, kurze Nachrichten im Internet),
und funktioniert in jeder Programmiersprache gleich,
was will man mehr?


----------



## tremor4fun (29. Nov 2006)

Naja, ok
dann werd ich wohl jetzt mit dem selectedItem-String in einer for-Schleife innerhalb der Form über meine Collection laufen und mir hier mit toSting() das richtige Objekt wieder raussuchen.
Hätt ja sein können, das es auch irgendwie anders funktioniert.
Danke Trotzdem.


----------



## HLX (29. Nov 2006)

Es funktioniert auch anders. Speichere die Objekte in einem Object-Array:

Hier ein Beispiel:

JSP:

```
<html:select property="ausgewaehlterKey">
    <html:optionsCollection property="objectArray" label="name" value="key"/> 
</html:select>
```


In die ActionForm gehört:

```
private int ausgewaehlterKey;
private Object[] objectArray;

// + getter und setter für die beiden
```

Das Object, dass in das Array gefüllt wird:

```
public class MyObject {

     private int key;
     private String name;

     // + getter und Setter für die beiden
}
```

Die Parameter label und value aus dem optionsCollection-Tag beziehen sich auf die beiden Attribute aus MyObject. Der Parameter value ist ein int und kann daher auch beim ausgewaehltenKey mit einem int belegt werden.

Man kann also Objekte einer Dropdownlist zuweisen, man muss allerdings innerhalb des Objektes einen "key" (value) und einen String zur Ausgabe (label) festlegen, die dann von Struts der OptionsCollection zugewiesen werden.


----------

