PDA

View Full Version : [JSP] Mi servirebbe un trucchetto per...


Benna80
18-08-2005, 14:50
Ok, dunque, ho una paginetta jsp con 6 checkbox, corrispondenti ai giorni della settimana da lunedi a sabato.
quando clicko sulle checkbox sto ad indicare che seleziono i relativi giorni della settimana.

Per confermare questi giorni ho un bottone di tipo "Salva" che mi rimanda ad un jsp "di servizio", con solamente del codice java, che mi fa certe cose su questi giorni selezionati

io i giorni li ottengo con il metodo request.getParameterValues("nomeDelGruppoDiCheckbox");
e mi restituisce un array di stringhe contenente solo i nomi dei giorni selezionati

La domanda:
C'è un modo per farmi restituire un array con tutti i giorni, selezionati e non?

Esempio, seleziono i giorni lunedi e mercoledi. Vorrei farmi restituire dalla pagina un array del tipo "Lunedi", "niente", "Mercoledi", "niente", "niente", "niente". Mi rsparmierebbe molto lavoro.

Spero di essere stato sufficientemente chiaro

BlueDragon
18-08-2005, 15:45
Esempio, seleziono i giorni lunedi e mercoledi. Vorrei farmi restituire dalla pagina un array del tipo "Lunedi", "niente", "Mercoledi", "niente", "niente", "niente".
Se vuoi necessariamente un array così, potresti mettere nelle prima pagina un javascript per cui quando premi "Salva", ti seleziona automaticamente tutti i checkbox, cambia i valori di quelli che non erano già selezionati a "niente" e poi invia la pagina.

O forse puoi cambiare la form in modo che anziché restituirti i valori "Lunedì", "Martedi"...ti restituisca valori tipo 1, 2, 3 che poi usi come indice su un array in cui hai i nomi di tutti i giorni....questo ti semplificherebbe le cose?

DigitalKiller
18-08-2005, 15:54
Ok, dunque, ho una paginetta jsp con 6 checkbox, corrispondenti ai giorni della settimana da lunedi a sabato.
quando clicko sulle checkbox sto ad indicare che seleziono i relativi giorni della settimana.

Per confermare questi giorni ho un bottone di tipo "Salva" che mi rimanda ad un jsp "di servizio", con solamente del codice java, che mi fa certe cose su questi giorni selezionati

io i giorni li ottengo con il metodo request.getParameterValues("nomeDelGruppoDiCheckbox");
e mi restituisce un array di stringhe contenente solo i nomi dei giorni selezionati

La domanda:
C'è un modo per farmi restituire un array con tutti i giorni, selezionati e non?

Esempio, seleziono i giorni lunedi e mercoledi. Vorrei farmi restituire dalla pagina un array del tipo "Lunedi", "niente", "Mercoledi", "niente", "niente", "niente". Mi rsparmierebbe molto lavoro.

Spero di essere stato sufficientemente chiaro


Mi aggiungo alla discussione...
Mi puoi dire il codice per ottenere solo il valore delle checkbox selezionate?
Io non so dove sbaglio, ma ottengo il valore di tutte le checkbox :mc:

Benna80
18-08-2005, 16:05
Se vuoi necessariamente un array così, potresti mettere nelle prima pagina un javascript per cui quando premi "Salva", ti seleziona automaticamente tutti i checkbox, cambia i valori di quelli che non erano già selezionati a "niente" e poi invia la pagina.

Questa mi potrebbe piacere, riusciresti a postare un po di codice? SOno a digiuno di javascript.

[QUOTE=BlueDragon]O forse puoi cambiare la form in modo che anziché restituirti i valori "Lunedì", "Martedi"...ti restituisca valori tipo 1, 2, 3 che poi usi come indice su un array in cui hai i nomi di tutti i giorni....questo ti semplificherebbe le cose?

mmm questa situazione è analoga a quella in cui sono ora, solo che invece dei numeri ho i giorni della settimana.

Meglio la prima

Grazie
Davide

Benna80
18-08-2005, 16:07
Se vuoi necessariamente un array così, potresti mettere nelle prima pagina un javascript per cui quando premi "Salva", ti seleziona automaticamente tutti i checkbox, cambia i valori di quelli che non erano già selezionati a "niente" e poi invia la pagina.

O forse puoi cambiare la form in modo che anziché restituirti i valori "Lunedì", "Martedi"...ti restituisca valori tipo 1, 2, 3 che poi usi come indice su un array in cui hai i nomi di tutti i giorni....questo ti semplificherebbe le cose?


Scusa, ho fatto casino con i quote.
Cmq, la prima soluzione è l'ideale, riusciresti a postare un po di codice per favore?

Grazie
Davide

Benna80
18-08-2005, 16:10
Mi aggiungo alla discussione...
Mi puoi dire il codice per ottenere solo il valore delle checkbox selezionate?
Io non so dove sbaglio, ma ottengo il valore di tutte le checkbox :mc:

behh io quando specifico ogni checkbox scrivo qualcosa del tipo

<input type="checkbox" name="daysOfWeek" value="lunedi"/>
<input type="checkbox" name="daysOfWeek" value="martedi"/>
<input type="checkbox" name="daysOfWeek" value="mercoledi"/>

così per tutti e sei.
Chiaramente devono essere racchiusi da un tag <form> e </form> che li mandi ad una qualche pagina.

In questa pagina io metto qualcosa del tipo

String daysOfWeek[]=new String[7];
daysOfWeek = request.getParameterValues("daysOfWeek");

e voilà, l'array magicamente si riempie.

NOTA: il parametro name di ogni checkbox deve essere UGUALE per ognuno dei checkbox della settimana

Davide

BlueDragon
18-08-2005, 16:36
@DigitalKiller:
Mi aggiungo alla discussione...
Mi puoi dire il codice per ottenere solo il valore delle checkbox selezionate?
Io non so dove sbaglio, ma ottengo il valore di tutte le checkbox :mc:
Strano che tu ottenga tutto...normalmente, quando invii la form, il browser invia solo i checkbox selezionati. Quindi ovviamente JAVA recupera solo quelli selezionati quando fai request.getParameterValues("nomedeicheckbox");

Esempio:

Codice della form
<form action="test.jsp" method="get">
<input type="checkbox" name="giorniScelti" value="1">Lunedi<br>
<input type="checkbox" name="giorniScelti" value="2">Martedi<br>
<input type="checkbox" name="giorniScelti" value="3">Mercoledi<br>
<input name="invio" type="submit">
</form>
Codice in ricezione:
String[] giorniSelezionati = request.getParameterValues("giorniScelti");

Tu come fai ad ottenere tutto?:)


EDIT: Mentre ero al telefono "qualcuno" ha postato prima di me ;)

BlueDragon
18-08-2005, 16:56
Scusa, ho fatto casino con i quote.
Cmq, la prima soluzione è l'ideale, riusciresti a postare un po di codice per favore?

Grazie
Davide
Provavo a suggerirti una seconda soluzione perché questa dei Javascript non è tanto bella....


Cmq:
function validaForm() {
with (document.MiaForm) {
for (var i=0; i < elements.length; i++) {
if (elements[i].type == 'checkbox' && elements[i].name == 'giorniScelti')
{
if (!elements[i].checked)
{
elements[i].checked = true;
elements[i].value = "niente";
}
}
}
}
}
MiaForm è il nome della tua form e "giorniScelti" il nome del parametro dei checkbox.
Metti un "onSubmit" per invocare il Javascript quando spedisci la tua form ed il gioco è fatto.
Il codice è quasi tutto preso da qui:
http://www.html.it/mailing/archivio/a284/ (A Cesare quel che è di Cesare!)
HTML.it è sempre un'ottima fonte in questi casi :)

DigitalKiller
18-08-2005, 17:05
Questa (http://www.hwupgrade.it/forum/showthread.php?t=982613) è la vecchia discussione che avevo aperto tempo fa, ma nessuno (forse anche per colpa mia, ho espresso male il problema) è riuscito ad aiutarmi :)

BlueDragon
18-08-2005, 17:28
@DigitalKiller:

Ho letto ora la discussione... :)
Quando crei le righe dei record, dai a tutti checkbox lo stesso name, e come value, il valore del loro id.
Es:
<input type="checkbox" name="righeScelte" value="<%=id%>">
Poi al momento della ricezione, anziché fare request.getParameter("righeScelte") (che ti darebbe solo il primo id), fai
String[] idScelti = request.getParameterValues("righeScelte");
che automaticamente ti mette tutti gli id scelti in un array di Stringhe.

Benna80
18-08-2005, 17:33
Provavo a suggerirti una seconda soluzione perché questa dei Javascript non è tanto bella....


Cmq:
function validaForm() {
with (document.MiaForm) {
for (var i=0; i < elements.length; i++) {
if (elements[i].type == 'checkbox' && elements[i].name == 'giorniScelti')
{
if (!elements[i].checked)
{
elements[i].checked = true;
elements[i].value = "niente";
}
}
}
}
}
MiaForm è il nome della tua form e "giorniScelti" il nome del parametro dei checkbox.
Metti un "onSubmit" per invocare il Javascript quando spedisci la tua form ed il gioco è fatto.
Il codice è quasi tutto preso da qui:
http://www.html.it/mailing/archivio/a284/ (A Cesare quel che è di Cesare!)
HTML.it è sempre un'ottima fonte in questi casi :)

innanzitutto grazie.

Poi, non capisco certe cose nel tuo codice:

1) if (elements[i].type == 'checkbox' && elements[i].name == 'giorniScelti')

il nome elements[i].name è per forza SEMPRE "giorniscelti" dato che ad ogni checkbox assegno io lo stesso nome, giusto? O sto sbagliando concettualmente?

2) perchè se l'elemento non è selezionato (come tu scrivicon questo codice if (!elements[i].checked) ) con l'istruzione dopo selezioni tu manualmente l'elemento?

3) io aggiungerei un ramo else all'if in cui scriverei element[i] = "qui ci va il value del ceckbox attualmente in esame", in modo da avere un array con il nome dei giorni selezionati e un "niente" negli altri

4) come faccio a spedire questo array al jsp che si occuperaà di farci i suoi calcoli sopra?

Grazie tantissime ancora e scusami se ho frainteso la tua soluzione
Davide

BlueDragon
18-08-2005, 17:48
Ti rispondo domanda per domanda.. :)

4) come faccio a spedire questo array al jsp che si occuperaà di farci i suoi calcoli sopra?

Non è un array che crei tu a parte...modificare elements[i] significa modificare gli elementi della form stessa. Quindi modificando la form, modichi i valori che il browser invierà :)
Ad esempio, quando tu fai elements[i].checked = true è come se l'utente stesso avesse selezionato il box...infatti vedrai che subito prima che la pagina scompaia per essere inviata, i checkbox vengono coperti tutti dai "tick" :)


1) if (elements[i].type == 'checkbox' && elements[i].name == 'giorniScelti')
il nome elements[i].name è per forza SEMPRE "giorniscelti" dato che ad ogni checkbox assegno io lo stesso nome, giusto? O sto sbagliando concettualmente?

Hai ragione, ma in teoria tu potresti avere nella stessa form altri checkbox con un altro nome che si riferiscono ad un altra cosa.....Poiché il ciclo itera *tutti* gli elementi della form, per precauzione vi è anche quella condizione :)


2) perchè se l'elemento non è selezionato (come tu scrivicon questo codice if (!elements[i].checked) ) con l'istruzione dopo selezioni tu manualmente l'elemento?

Beh, era quello che volevamo ottenere no? Se l'elemento non è selezionato, selezionalo, affinché il browser mandi tutti gli elementi.
Quelli che però sono stati selezionati dal javascript (e quindi non erano voluti dall'utente) avranno value = "niente" :)


3) io aggiungerei un ramo else all'if in cui scriverei element[i] = "qui ci va il value del ceckbox attualmente in esame", in modo da avere un array con il nome dei giorni selezionati e un "niente" negli altri

Vedi risposta alla domanda 4 :)

Benna80
18-08-2005, 17:54
Ti rispondo domanda per domanda.. :)

Non è un array che crei tu a parte...modificare elements[i] significa modificare gli elementi della form stessa. Quindi modificando la form, modichi i valori che il browser invierà :)
Ad esempio, quando tu fai elements[i].checked = true è come se l'utente stesso avesse selezionato il box...infatti vedrai che subito prima che la pagina scompaia per essere inviata, i checkbox vengono coperti tutti dai "tick" :)


Hai ragione, ma in teoria tu potresti avere nella stessa form altri checkbox con un altro nome che si riferiscono ad un altra cosa.....Poiché il ciclo itera *tutti* gli elementi della form, per precauzione vi è anche quella condizione :)


Beh, era quello che volevamo ottenere no? Se l'elemento non è selezionato, selezionalo, affinché il browser mandi tutti gli elementi.
Quelli che però sono stati selezionati dal javascript (e quindi non erano voluti dall'utente) avranno value = "niente" :)


Vedi risposta alla domanda 4 :)


Grazie, sei stato estremamente chiaro. Ora ti chiedo:

Perchè dici che quest non è una soluzione elegante?
Sai che per ottenere l'array che mi potrei ricavare nel modo che mi hai suggerito ci ho messo 4 ore e 500 righe di codice andando a considerare TUTTI i casi possibili dei giorni della settimana selezionati e non?

Secondo me è molto meno elegante quel modo di costruirsi l'array piuttosto che quello che mi hai appena suggerito. Ora resta da provare se funziona.

Graizie ancora
Davide

BlueDragon
18-08-2005, 18:27
Grazie, sei stato estremamente chiaro. Ora ti chiedo:

Perchè dici che quest non è una soluzione elegante?
Sai che per ottenere l'array che mi potrei ricavare nel modo che mi hai suggerito ci ho messo 4 ore e 500 righe di codice andando a considerare TUTTI i casi possibili dei giorni della settimana selezionati e non?

Secondo me è molto meno elegante quel modo di costruirsi l'array piuttosto che quello che mi hai appena suggerito. Ora resta da provare se funziona.

Graizie ancora
Davide
Non mi piace manipolare i dati in quel punto...se l'utente ti vuole mandare 3 giorni, perché aggiungere dei giorni con scritto "niente" dentro?

Proviamo qualche soluzione alternativa:

Immaginiamo, come base di partenza, che la pagina ti restituisca un'array con gli ID dei giorni della settimana (che a me sembra più comodo)...
Se vogliamo un'array di 7 stringhe che contenga i nomi per quelli selezionati e null per gli altri:

String[] idSelezionati = request.getParameterValues("giorniSelezionati");
String[] giorniSettimana =
{"Lunedi","Martedi","Mercoledi","Giovedi","Venerdi","Sabato","Domenica"};
String[] giorniSelezionati;
for (int x = 0; x < idSelezionati.length;x++)
{
giorniSelezionati[Integer.parseInt(idSelezionati[x])] = giorniSettimana[x];
}

Oppure semplicemente ci facciamo un array di 7 boolean...

String[] idSelezionati = request.getParameterValues("giorniSelezionati");
boolean[] giorniSelezionati = {false,false,false,false,false,false,false};
for (int x = 0; x < idSelezionati.length;x++)
{
giorniSelezionati[Integer.parseInt(idSelezionati[x])] = true;
}


Oppure ci facciamo restituire i nomi dei giorni dalla form...e poi ce li mettiamo comodi comodi in un Vector..o in un HashSet se siamo preoccupati di possibili doppioni.. o comunque in una bella Collection così abbiamo il metodo contains(Object o) :)

String[] giorniSelezionati = request.getParameterValues("giorniSelezionati");
HashSet giorniScelti = new HashSet();
for (int x = 0; x < giorniSelezionati.length;x++)
{
giorniScelti.add(giorniSelezionati[x]);
}

// E' stato scelto il venerdì?

if (giorniScelti.contains("Venerdì"))
{
.............
}


Ovviamente da qualche parte conviene mettere un controllo nel caso l'array dei valori dei parametri sia null o nel caso per qualche ragione strana non ti riporti un intero e quindi vi sia una Format exception (non ricordo il nome completo) quando fai Integer.parseInt(Stringa)).

Benna80
18-08-2005, 21:02
Oppure semplicemente ci facciamo un array di 7 boolean...

String[] idSelezionati = request.getParameterValues("giorniSelezionati");
boolean[] giorniSelezionati = {false,false,false,false,false,false,false};
for (int x = 0; x < idSelezionati.length;x++)
{
giorniSelezionati[Integer.parseInt(idSelezionati[x])] = true;
}

Ok, questa soluzione mi piace un casino, perchè è la stessa che avevo implementato io con la differenza che ci ho messo 4 ore in + di te e 480 righe in +.
Tutto ciò mi fa riflettere su due cose:

1) in giro c'è gente che ne sa a pacchi, e te sei una di queste
2) sono un coglione, perchè, COME AL SOLITO, ho la soluzione davanti agli occhi e non la vedo.

Ho implementato quanto mi hai suggerito e funziona tutto che è una meraviglia, non so come ringraziarti.
Ora ho tutta una serie di problemi collaterali al fatto che devo cambiare diverse cose all'interno del mio codice, perchè il tutto si basava sulla mia soluzione decisamente sbagliata. Torno ad armarmi di tanta pazienza e ripeterò le procedure :muro:

Se sei dalle parti di modena di offro una birra + che volentieri :D

Grazie davvero tante
Davide

BlueDragon
18-08-2005, 21:58
Ok, questa soluzione mi piace un casino, perchè è la stessa che avevo implementato io con la differenza che ci ho messo 4 ore in + di te e 480 righe in +.
Tutto ciò mi fa riflettere su due cose:

1) in giro c'è gente che ne sa a pacchi, e te sei una di queste
2) sono un coglione, perchè, COME AL SOLITO, ho la soluzione davanti agli occhi e non la vedo.

A pacchi? Esagerato :p
Capita di "perdere" tempo di fronte ad un problema quando invece la soluzione è a portata di mano cambiando anche solo di poco il punto vista.... E' per questo che è conveniente avere qualcun altro con un cui discutere di un problema e/o avere la capacità di fare un passo indietro e cambiare angolazione quando ci si trova bloccati.


Ho implementato quanto mi hai suggerito e funziona tutto che è una meraviglia, non so come ringraziarti.
Ora ho tutta una serie di problemi collaterali al fatto che devo cambiare diverse cose all'interno del mio codice, perchè il tutto si basava sulla mia soluzione decisamente sbagliata. Torno ad armarmi di tanta pazienza e ripeterò le procedure :muro:

Beh, magari con l'occasione semplifichi qualche altro passaggio :)



Se sei dalle parti di modena di offro una birra + che volentieri :D

Grazie davvero tante
Davide
Grazie! :)
Se trovo una birra che mi piace e passo da Modena, ti faccio sapere ;)