Questo documento non ha il pretenzioso scopo di spiegare qualcosa, solo di raccontare come ho risolto un problema che altre persone possono avere, infatti l'idea di questo articoletto è nata proprio sul forum di JavaPortal.
Il problema che ho dovuto risolvere è il seguente: gestire il submit di un form di n righe in cui una proprietà è rappresentata da un radiobutton.
Ad esempio recupero da un database un elenco di nominativi, li mostro in un form, e poi eseguo un update di quei dati.
Schema d'esempio:
database ---> action + actionForm ---> jsp (mostra i dati)
jsp ---> action + actionForm ---> database (update dei dati )
Un html form di questo tipo avra' associato un formBean le cui proprietà sono di tipo String array.
Esempio form: n righe del tipo
<input type="text" name="nome" >
<input type="radio" name="sex" value="m" >
<input type="radio" name="sex" value="f" >
Per ogni riga devo utilizzare gli stessi name per i campi, cosi' Struts precompilerà un formBean del tipo:
public class myForm extends ActionForm {
String[] nome;
String[] sex;
// relativi setter e getter omessi
}
Il problema nasce nel momento in cui ho appunto piu' di una riga nel form html: il radiobutton sarà mutualmente esclusivo per tutto il form e non per ogni singola riga; questo è dovuto al fatto che su ogni riga i radiobutton hanno gli stessi nomi.
Per ovviare a questo inconveniente utilizzo una indexed property per descrivere i radiobutton sia nel bean che nel form html.
Il nuovo bean sara':
public class myForm extends ActionForm {
String[] nome;
String[] sex;
public void setStringIndexed( int index, String value ) {
this.sex[index] = value;
}
public String getStringIndexed( int index ) {
return this.sex[index];
}
// setter e getter per nome invariate
}
La action precompila il formBean con i dati derivanti da database.
Quando dovra' precompilare il campo "sex" chiamerà il metodo setStringIndexed settando un valore diverso per ogni entry.
Ad esempio:
........
// ciclo per ogni record derivante da database
int i = 0;
while( rs.next() ) {
formBean.setStringIndexed(i, ""+i);
i++;
}
.......
L'importante è che ogni valore di stringIndexed sia univoco.
Cosi' facendo (anche se non ho il campo "sex" nel database) ho un formBean con proprietà String array di lunghezza n, e uno stringIndexed con valori tutti diversi.
Nella jsp invece avro' qualcosa del tipo:
<%
(for int i = 0; i < formBean.getNome().length; i++){
%>
<input type="text" name="nome" >
<input type="radio" name="<%=myForm.getStringIndexed(i)%>" value="m" >
<input type="radio" name="<%=myForm.getStringIndexed(i)%>" value="f" >
<%
}%>
Questo è tutto!.
Nella action recupero il formBean come sempre fatto, e recupero una ad una le proprietà.
Spero che questo documento possa essere intellegibile ed utile a qualcuno.
I consigli e suggerimenti sono sempre ben accetti.
link di riferimento all'how to ufficiale di struts:
http://jakarta.apache.org/struts/faqs/indexedprops.html