# <html:radio



## gimli6 (19. Feb 2005)

Hallo!

Ich lese daten aus einer Datenbank in eine JSP-Seite aus. Dies funktioniert ganz gut.
Zusaetzlich zum auslesen der Daten fuege Radiobuttons meiner Datenzeile hinzu:
quasi so:

```
<html:form action="/MachMalTest.do">
<logic:iterate id="myElement" name="test">
                <tr class="tabledata1">
                    <td>
                      <html:radio property="radioVal"  value="spalte1" />
                    </td>
                    <td>
                      <html:radio property="radioVal"  value="spalte2" />
                    </td>
                </tr>
</logic:iterate> 
<tr>
  <td align="center">
      <html:submit> <bean:message key="general.button.eintragen" bundle="test_KEY" /> </html:submit>
      </td>
</tr>
</html:form>
```

Wenn ich es aber so mache wie oben angegeben, dann habe ich bei mehreren Schleifendurchlauefen zwar viele Radiobuttons, kann aber pro JSP-Seite nur ein Button anwahlen. Das ist ned ganz schoen.
Damit die Radiobuttons gut funktionieren muss ich sie einer gruppe zuorden. 
Ich habe dazu in jedem iterat-durchlauf ueber die Radiobottons ein formular gelegt. Das hatte zur Folge, dass ich zwar pro Datenzeile immer nur ein Radiobutton selektieren konnte, ich aber gleichzeitig x-Formulare hatte, die alle gleich hiessen. Nur konnte ich dann nicht mehr EIN Submit-Button fuer das ganze Formular verwenden.

Dann dachte ich, wenn das nicht funktioniert, dannn erzeuge ich fuer jeden Schleifendurchlauf einen eigenen Propertiesnamen. Soweit die Theorie. Leider funktioniert der Ansatz in der JSP-Seite schon mal nicht mit:

```
<% int i = 0; >
....form
<html:radio property="radioVal + <%= i >"  value="spalte1" />
...
<%= i = i + 1 %>
...formende
```

Wollte dies dann in etwa so in der Action auslesen:

```
String s = request.getParameter("radioVal " + i);
   array.add(s);
   i = i + 1;
```

ABER wenn ich auch die Propertiesnamen zur Laufzeit erzeugen koennte, dann koennte ich ja nich tmehr dynamisch auf die Beans zugreifen, weil ich die Beans ja nicht dynamisch in der Form.java erzeugen kann.

Wo liegt hier der Fehler? Kann da jemand helfen?


----------



## bambi (20. Feb 2005)

Sorry, aber ich versteh' net so ganz, was Du damit sagen willst
und wo Dein Problem genau ist. Warum und was funktioniert denn bei


> ```
> <% int i = 0; >
> ....form
> <html:radio property="radioVal + <%= i >"  value="spalte1" />
> ...


nicht? Was bekommst Du denn und was soll den rauskommen?

Es waere sicher ganz gut, wenn Du mal sagst, wie die Daten aus Deiner
DB ungefaehr aussehen und wie genau Du sie darstellen willst...

THX  :bahnhof:


----------



## gimli6 (20. Feb 2005)

Hallo!

Also meine Daten aus der Datenbank werden in etwa so in einer Matrixstruktur auf der JSP-Seite ausgegeben:

```
Name    Vorname      Katholik     Protestant    Moslem    ....   Sonstige
Meier    Sepp           O              O           O               O
Huber    Michl          O              O           O               O
Müller   Hans           O              O           O               O
....
```
Damit die Radiobuttons selektierbar sind, mussen Sie in jeder Zeile die gleiche Bezeichnung haben. (Oder pro Zeile von einem Formularfeld umschlossen sein).
Oder anders gesagt die Radiobuttons sind in jeder Zeiler eine Gruppe zugeordnet.

Mein Ziel ist es, dass ich am Ende der Seite einen SUBMIT-Button habe, der mir die gesamte Matrix wieder in die Datenbank zurueckschreibt. Dazu muss ich aber explizit auf jede Zeile zugreifen, bzw. auslesen koennen. 
Das ist auch der Grund warum ich meine Radiobuttons zur Laufzeit pro Zeile einen neuen Namen geben moechte.
Also in der ersten Zeile heissen Sie halt "radioVal1" und in der zweiten dann "radioVal2" usw.

Ich wollte dies ja so machen:
	
	
	
	





```
<% int i = 0; > 
....form 
<html:radio property="radioVal + <%= i >"  value="spalte1" /> 
... 
<%= i = i + 1 %> 
...formende
```

aber da ist offensichtlich ein Syntaxfehler drin, weil mir die JSP_Seite einfach beim auslesen abbricht. Der Tomcat bringt mir dazu keinen Fehler, woraus ich etwaige Rueckschuesse ziehen kann wo der Fehler liegt.


Vielleicht kann man das ja auch anders loesen?? Bin fuer alles offen. Hab da den aehnlichen Ansatz schon einmal mit DynaActionForm und <c:forEach> probiert, das funktioniert bei mir zumindestens auch nicht. Hab da zu aber auch keine gescheite Referenz im Internet gefunden!!!


----------



## bambi (20. Feb 2005)

Also so schlecht sieht das doch gar nicht aus. Ich wuerde da vielleicht
noch einmal genauer suchen, was/wo/wie genau passiert.

Was genau produziert denn Dein Code? Macht er ueberhaupt Radio-Buttons
und bricht dann irgendwo ab oder baut er erst gar keine? Poste doch mal
den ganzen Code fuer die Buttons, falls da gar nichts passiert.

Ich hatte auch mal das Problem, dass ein Teil einer Seite einfach nicht
angezeigt wurde. Vielleicht hast Du einfach irgendwo ein Tag vergessen
oder irgendwie sowas?

Die Zuweisung von i muesste doch eigentlich eher so:

```
<% i++ %> // anstatt "<%=..."
```
aussehen, oder?


----------



## Guest (21. Feb 2005)

Hallo!

Also mein Code sieht so aus:

```
<html:form action="/MachWas.do">
                <logic:present name="user" scope="session">
                <% int i = 0; %>
				<logic:iterate id="myElement" name="user">
                <tr class="tabledata1">
                    <td>
          				<bean:write name="myElement" property="stnr" />  
                    </td>
                    <td>
                    	<bean:write name="myElement" property="name" />
                    </td>
                    <td >
                        <bean:write name="myElement" property="vorname" />
                    </td>
                    <td align="center">
                        <html:radio property="radioVal<% i %>"  value="spalte1" /> 
                    </td>
                    <td align="center">
                        <html:radio property="radioVal<% i %>" value="spalte2" />
                    </td>
                    <td align="center">
                        <html:radio property="radioVal<% i %>" value="spalte3" />
                    </td>
                    <td align="center">
                        <html:radio property="radioVal<% i %>" value="spalte4" />
                    </td>
                    <td align="center">
                        <html:radio property="radioVal<% i %>" value="spalte5" />
                    </td>
                    <td align="center">
                        <html:radio property="radioVal<% i %>" value="spalte6" />
                    </td>
                    <td align="center">
                        <html:radio property="radioVal<% i %>" value="spalte7" />
                    </td>
                    <td align="center">
                        <html:radio property="radioVal<% i %>" value="spalte8" />
                    </td>

                 </tr>
                </logic:iterate> 
                <% i++; %>     
                </logic:present>

                 <tr>
                   <td align="center">
                        <html:submit> <bean:message key="general.button.eintragen" bundle="com_KEY" /> </html:submit>
                   </td>
                </tr>
                </html:form>
            </table>
```

Also die Seite wird leider nicht aufgebaut, sondern wird eiinfach abgebrochen. Der Tomcat bringt keine Fehlermeldung, dennoch erscheint im Logfile von localhost, dass
	
	
	
	





```
2005-02-21 09:54:51 StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
org.apache.jasper.JasperException: No getter method available for property radioVal<% i %> for bean under name org.apache.struts.taglib.html.BEAN
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:254)
```

OK, ich habe dafuer auch keine Getter/Setter angelegt, weil ich ja zur Laufzeit ganz einfach nicht weiss, wieviele ich davon brauche. Oder kann man das dynamische in die Form eintragen lassen?


----------



## gimli6 (21. Feb 2005)

Sorry, hab grad vergessen mich einzuloggen!
Obiges Posting ist aber meines!


----------



## gimli6 (21. Feb 2005)

So, jetzt ist mir das zu bloed geworden mit den Beans. Jetzt habe ich es mal rein HTML-maessig umgesetzt und es funktioniert so:
	
	
	
	





```
<html:form action="/MachWas.do">
                <logic:present name="test" scope="session">
                <% int i = 0; %>

				<logic:iterate id="myElement" name="test">
                <tr class="tabledata1">
                    <td>
                        <bean:write name="myElement" property="stnr" />  
                    </td>
                    <td>
                        <bean:write name="myElement" property="name" />
                    </td>
                    <td >
                        <bean:write name="myElement" property="vorname" />
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte1"> 
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte2">
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte3">
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte4">
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte5">
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte6">
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte7">
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte8">     				
                    </td>

                 </tr>
                 <% i++; %> 
                </logic:iterate> 
                
                <input type="hidden" name="radiocounter" value="<%=i%>">
                    
                </logic:present>
```

Und ueber das versteckte Feld weiss ich auch gleich sofort wie oft ich meine Zeilen abfragen muss. 
Haette ich es gleich so gemacht, dann haette ich mir zwei tage Spielerei gespart... ;-(


----------



## gimli6 (21. Feb 2005)

Hallo!

Wie ja schon einaml erwahnt moechte ich die ausgelesenen Zeilen wieder auswerten und zurueck in die Datenabnk schreiben.
Die Auswertung mache ich in der Action so:
	
	
	
	





```
countvalue = req.getParameter("radiocounter");
        try {
            int intcount = Integer.parseInt(countvalue);
            // nur zum testen in try!
            for (int i = 0; i <= intcount; i++ ) {
                radiobuttonstatus = req.getParameter("radioVal" + i);
                 // Hier erfolgt Zugriff auf Beans (stnr, name, vorname)
                 // finktioniert aber nicht so!!!                        
                String stnr = req.getParameter("myElement");
                
                radiobutton(radiobuttonstatus);                           
            }
        } catch (Exception ex) {
            errors.add("radioVal", new ActionError("general.error.radiobuttonvalue"));
        }
```

Ich kann zwar jetzt die Radiobuttons auswerten, aber die drei Werte in der Bean (stnr, name vorname), die ich aus der Datenbank mit einer collection auslese, darauf habe ich keinen Zugriff mehr. :-(
Ein ebenfalls dynamisches Benennen der "myElement"-Namen funktioniert ja n icht zur Laufzeit.

Wie kann ich das dennoch machen, dass ich Zugriff auf die Beans habe?


----------



## bambi (22. Feb 2005)

Sorry - hatte ein langes WE... 

Eine Frage: wie stellst Du denn die Beziehung zwischen Deinen Beans und den 
Radio-Buttons her? Du brauchst ja irgendwas, um dann beim Auslesen der 
Werte wieder zu wissen welcher Radio-Button-Wert zu welcher Person gehoert.

Was ist den die stnr - ist das eine eindeutige ID fuer jede Person? Falls nicht - hast
Du eine ID oder sowas, das immer eindeutig ist?


----------



## gimli6 (22. Feb 2005)

bambi hat gesagt.:
			
		

> Sorry - hatte ein langes WE...
> 
> Eine Frage: wie stellst Du denn die Beziehung zwischen Deinen Beans und den
> Radio-Buttons her? Du brauchst ja irgendwas, um dann beim Auslesen der
> ...



Ja Hallo!
Also "stnr" ist meine Personen-ID,  aber das ist eigentlich nebensachlich, weil ich sie nur fuer meine DB-Eintraege brauche und nicht fuer die Ausgabe in der JSP.

Die Beziehung zwischen Radiobuttons und Person wird ganz einfach dadurch hergestellt, dass ich beim auslesen Zeile fuer Zeile meine JSP auslese. Somit bekomme ich immer eine Person mit einem Radiobutton. Der Radiobutton hat halt nur unterschiedliche Values. Aber das ist ja so gewollt, weil irgendwas muss ich ja in der JSP auswerten koennen.
ABER ich greife da nicht auf die Beans zu!!! Sondern werte die uebergebenen namen aus mit getProperty!
Modifizierter Code in JSP:

```
<td>
                        <bean:write name="myElement" property="stnr" />
                        <input type="hidden" name="stnr<%= i %>" value="<bean:write name="myElement" property="stnr" />">
                    </td>
                    <td>
                        <bean:write name="myElement" property="name" />
                        <input type="hidden" name="name<%= i %>" value="<bean:write name="myElement" property="name" />">
                    </td>
                    <td >
                        <bean:write name="myElement" property="vorname" />
                        <input type="hidden" name="vorname<%= i %>" value="<bean:write name="myElement" property="vorname" />">
                    </td>
                    <td align="center">
                        <input type="radio" name="radioVal<%= i %>" value="spalte1">
                    </td>
```

Code in Action!

```
countvalue = req.getParameter("radiocounter");
        try {
            int intcount = Integer.parseInt(countvalue);
            for (int i = 0; i <= intcount; i++ ) {
                radiobuttonstatus = req.getParameter("radioVal" + i);
                String stnr = req.getParameter("stnr" + i);
                .....
                .....
```

Ob das eine "saubere" Loesung ist wage ich mal zu bezweifeln, aber es funktioniert zumindestens! 

Das andere Problem ist natuerlich, und das habe ich bisher noch nicht loesen koennen, wie ich meine Daten aus der DB so auswerte, dass mir beim oeffnen der Seite schon bereits selektiere Werte ausgegeben werden.

Wenn z.B. schon ein Eitrag fuer eine person vorliegt, wie ich die in die HTML-Radiobuttons uebergeben kann.
Da waere ich wirklich fuer Ideen offen...


----------



## bambi (22. Feb 2005)

Kannst Du nicht einfach eine if-Abfrage machen, um die selektierten Felder
zu bekommen? Wenn ich's recht sehe, dann ist der Wert fuer selektierte 
Felder doch 1, oder?

Also sowas wie

```
if (value == 1)
    <input type="radio" ... checked>
```
Muesste doch eigentlich gehen, oder?

Also wegen Deiner Beans: die koenntest Du doch eingentlich in Deiner Session
mit weitergeben, oder? Dann musst Du sie nicht extra nochmal beim Auslesen
der Radio-Button-Werte nochmal suchen.


----------



## gimli6 (22. Feb 2005)

Hallo @bambi!
Danke fuer Deine Hilfe!

Wenn ich bei mir ein Radiobutton anwaehle, dann erhaelt er bei mir einen Wert "spalte1, spalte2,.... Dies werte ich ich dann mit einer if-Schleife aus und wandle die Werte fuer mich um, dass ich sie in die DB schreiben kann.


Aber wenn ich die Datenbank auslese erhalte ich eine Lisite, in der alle Daten drinstehen. Diese Liste reiche ich dann an ein TransferableObjekt weiter und diese gebe ich dann in der JSP aus. 

Soweit so gut. Aber ich muesste quasi einen bestimmten Paramter rausfiltern und ihm z.B. den Wert "spalte1" geben und wieder zurueck in das TO schreiben, die ja dann wieder von der JSP ausgelesen wird.
Soweit einmal die Theorie.  -> oder meinst du etwas anderes?
Mir ist allerdings im Moment noch schleierhaft wie ich das in meiner Action umsetzen kann....


----------



## bambi (22. Feb 2005)

Ich muss sagen, dass ich bei solchen Sachen immer mit JavaBeans arbeite.
Ist halt einfach sehr praktisch mit den Getter und Setter Methoden. Mehr 
brauch man ja im JSP eigentlich auch nicht. Aber Wurscht...

Wie genau sieht denn Dein TO aus? Kannst Du's mal posten?

THX


----------



## gimli6 (22. Feb 2005)

Hallo, mein TO sieht im Prinzip genauso aus wie eine Form, aber guckst Du selbst:

```
public class PersonTO implements Serializable {
    private String stnr = "";
    private String name = "";
    private String vorname = "";

    /**
     * Show the content of the Person.
     */
    public String toString() {
        StringBuffer sb = new StringBuffer()
            .append("stnr: ").append(stnr).append("\n")
            .append("name: ").append(name).append("\n")
            .append("vorname: ").append(vorname).append("\n")
        return sb.toString();
    }

	/**
	 * @return Returns the name.
	 */
	public String getName() {
		return name;
	}
	/**
	 * @param name The name to set.
	 */
	public void setName(String name) {
		this.name = name;
	}
	/**
	 * @return Returns the stnr.
	 */
	public String getStnr() {
		return stnr;
	}
	/**
	 * @param stnr The stnr to set.
	 */
	public void setStnr(String stnr) {
		this.stnr = stnr;
	}
	/**
	 * @return Returns the vorname.
	 */
	public String getVorname() {
		return vorname;
	}
	/**
	 * @param vorname The vorname to set.
	 */
	public void setVorname(String vorname) {
		this.vorname = vorname;
	}
}
```
[/code]


----------



## bambi (22. Feb 2005)

Ja supi - ist ja 'ne JavaBean - brav so!  :wink:  
Das macht das ganze doch eingentlich viel einfacher, oder? Ich wuerde einfach noch 
die boolean-Felder "spalte1" bis "spalteX" - oder wie Du sie nennen magst - einfuegen 
und die Getter und Setter schreiben.

Dann kannst Du die Daten doch einfach beim Auslesen setzen, oder? Da hast 
Du's dann auch einfacher beim schreiben der Radio-Buttons - 

```
<input type="radio" ...
<%
if (person.isSpalte1())  {
   %>checked<%
}
%>
...>
```
Ich wuerde an Deiner Stelle aber vielleicht lieber statt "spalte1" und so ... die echten Bezeichnungen 
verwenden. Das macht's lesen vom Code einfacher - also lieber isKatholik() und is...()  Das ist 
vielleicht auch weniger fehleranfaellig.
Dann kann's nicht passieren, dass Du vielleicht Spalte1 einliest und einen ganz anderen Wert setzt...  :wink: 

Mal 'ne Frage: schreibst Du mit Eclipse?


----------



## bambi (22. Feb 2005)

gimli6 hat gesagt.:
			
		

> Wie ja schon einaml erwahnt moechte ich die ausgelesenen Zeilen wieder auswerten und zurueck in die Datenabnk schreiben.
> ...
> Ich kann zwar jetzt die Radiobuttons auswerten, aber die drei Werte in der Bean (stnr, name vorname), die ich aus der Datenbank mit einer collection auslese, darauf habe ich keinen Zugriff mehr. :-(
> ...
> Wie kann ich das dennoch machen, dass ich Zugriff auf die Beans habe?



Meintest Du damit, dass Du die CMPs an die JSP weitergeben moechtest, um dann gleich die DB-Daten zu
aendern, wenn Du die Radio-Buttons ausliest?

Falls Du das so meintest: Mach's nicht. Ganz schlechter Stil. Ich wuesste jetzt auch gar nicht, ob das ueber-
haupt geht - hab's noch nicht getestet. So wie Du's geloest hast ist genau richtig - mit der JavaBean und
dann die Daten spaeter in die DB schreiben.  :toll:


----------



## gimli6 (22. Feb 2005)

bambi hat gesagt.:
			
		

> ...
> 
> Mal 'ne Frage: schreibst Du mit Eclipse?



JA, ich programmier mit Eclipse. Wieso fragst Du? ...weil alles so schoen sauber aussieht oder wie? ;-)

Du meinst auch, dass ich in meiner TO Beans mit "spalte1" - "spalteX" (oder aehnliches) anlegen soll, die ich dann in der Action einfach fuelle... 

Der Grund warum ich die Werte "spalte1".. usw. verwende ist ganz einfach, weil ich die in eineer Klasse auswerte, die ich fuer solche sachen oefters verwende. Wollte nicht jedesmal den Code kopieren in die einzelenen Klassen.


----------



## bambi (22. Feb 2005)

gimli6 hat gesagt.:
			
		

> JA, ich programmier mit Eclipse. Wieso fragst Du? ...weil alles so schoen sauber aussieht oder wie? ;-)


Dacht' ich's mir doch. Irgendwie siehts halt einfach schoen nach Eclipse aus. Ich code auch mit Eclipse - hab' noch nichts besseres gefunden... 


			
				gimli6 hat gesagt.:
			
		

> Du meinst auch, dass ich in meiner TO Beans mit "spalte1" - "spalteX" (oder aehnliches) anlegen soll, die ich dann in der Action einfach fuelle...


Jo, ist am einfachsten. Dann kannst Du's auch einfacher wieder in die DB schreiben.


			
				gimli6 hat gesagt.:
			
		

> Der Grund warum ich die Werte "spalte1".. usw. verwende ist ganz einfach, weil ich die in eineer Klasse auswerte, die ich fuer solche sachen oefters verwende. Wollte nicht jedesmal den Code kopieren in die einzelenen Klassen.


Na denn...


----------

