entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Problemas al obtener select de un formulario

Estoy haciendo una aplicación web en java, el problema es que accedo con un usuario de tipo administrador y tiene un apartado de privilegios, en el cuál puedo cambiar los tipos de todos los usuarios registrados a estándar o administrador.

El problema es que como muestro en una tabla todos los usuarios que existen en la BD, me aparecen por cada fila un select con 2 opciones: administrador y estándar. Y pienso que al mandar por el formulario cualquier select sólo obtiene el primer dato que en este caso es administrador y siempre me llega lo mismo al jsp que me actualiza la BD y nunca me llega el valor de estandar, alguna sugerencia?

Muchas gracias!

0voto

Luiggi Mendoza comentado

Sería conveniente que compartas el código relevante de tu JSP para darte una ayuda más específica en tu problema.

0voto

danielreales7 comentado

Ya averigüe el problema, lo comenté más abajo, muchas gracias por todo!

1 Respuesta

1voto

Leonardo-Tadei Puntos227320

Hola Daniel,

por lo que describís, parece que tenés mal armado el formulario que muestra la tabla con los select para la edición.

Por el escenario que describís, o bien tenés que armar un formulario por fila (con un campo oculto con el ID del usuario y el tipo en un select), o un solo formulario para toda la tabla, pero con los select siendo un vector HTML para poder procesarlo del lado del servidor y hacer todos los cambios correspondientes.

Si nos envías el HTML que recibe el navegador, podemos confirmarte la suposición de que es un error en el formulario.

Saludos!

0voto

danielreales7 comentado

Sí se que el problema seguro está en el formulario, y el campo id oculto lo tengo realizado con unos checkbox que tú puedes seleccionar varios y cambiarlos también a la vez, el problema es con los select. Te dejo el código del formulario.

<form method="post" action="editarPrivilegios.jsp">
<table border="1" width="100%">
<tr><td></td><td align="center"><b>Nombre</b></td><td align="center"><b>Tipo Actual</b></td><td align="center"><b>Privilegios</b></td></tr>
<%
String sentenciaSQL2 = "SELECT * FROM usuario";
Statement estatement2 = conexionBD.createStatement();
ResultSet rs2 = estatement2.executeQuery(sentenciaSQL2);
int idPedido2=0;
int contador=0;
String nombreUsuario="";
String tipoUsuario="";
while(rs2.next()){
idPedido2=rs2.getInt("id");
nombreUsuario=rs2.getString("nombre_usuario");
tipoUsuario=rs2.getString("tipo");
contador++;
%>
<tr><td align="center"><input type="checkbox" id="selec" name="selec" value="<%=idPedido2%>" ></td><td align="center"><%=nombreUsuario%></td><td align="center"><%=tipoUsuario%></td><td align="center"><select name="privilegios"><option value="administrador">administrador</option><option value="estandar">estandar</option></select></td></tr>
<%
}
%>
</table>
<p align="center"><input type="submit" name="actualizar" value="Actualizar Privilegios" ><input type="reset" name="resetear" value="Borrar Datos" ><input type="hidden" name="idAdmin" value="<%=admin%>" ></p>
</form>

0voto

danielreales7 comentado

Lo siento es mi primer post aquí y nose poner bien el código, me acabo de dar cuenta que te aparece la tabla como la tengo en mi proyecto, aunque a mí me salen mas campos obviamente.

Espero que lo puedas entender, muchísimas gracias.

0voto

Leonardo-Tadei comentado

Hola Daniel,

para que podamos ver el código, selecciona todo el texto que corresponda y clickeá sobre la herramienta marcada con { }. De esta manera el sitio mostrará el código en vez de dejar que lo interprete el navegador.

Por otra parte, sería bueno que edites tus dos respuestas para convertirlas en "comentario" de mi respuesta (hay un checkbox abajo) así no aparece como que tu pergunta tiene 3 respuestas cuando en realidad tiene solo una y varios comentarios de nuestra conversación.

Las preguntas con pocas respuestas animan a otros usuarios a responderlas.

Saludos!

0voto

danielreales7 comentado

Muchas gracias, te vuelvo a dejar el código:

<form method="post" action="editarPrivilegios.jsp">
                            <table border="1" width="100%">
                                <tr><td></td><td align="center"><b>Nombre</b></td><td align="center"><b>Tipo Actual</b></td><td align="center"><b>Privilegios</b></td></tr>
                                <%
                                    String sentenciaSQL2 = "SELECT * FROM usuario";
                                    Statement estatement2 = conexionBD.createStatement();
                                    ResultSet rs2 = estatement2.executeQuery(sentenciaSQL2);
                                    int idPedido2=0;
                                    int contador=0;
                                    String nombreUsuario="";
                                    String tipoUsuario="";
                                    while(rs2.next()){
                                        idPedido2=rs2.getInt("id");
                                        nombreUsuario=rs2.getString("nombre_usuario");
                                        tipoUsuario=rs2.getString("tipo");
                                        contador++;
                                        %>
                                        <tr><td align="center"><input type="checkbox" id="selec" name="selec" value="<%=idPedido2%>" ></td><td align="center"><%=nombreUsuario%></td><td align="center"><%=tipoUsuario%></td><td align="center"><select name="privilegios"><option value="administrador">administrador</option><option value="estandar">estandar</option></select></td></tr>
                                        <%
                                    }
                                %>
                            </table>
                                <p align="center"><input type="submit" name="actualizar" value="Actualizar Privilegios" ><input type="reset" name="resetear" value="Borrar Datos" ><input type="hidden" name="idAdmin" value="<%=admin%>" ></p>
                            </form>

0voto

Leonardo-Tadei comentado

Hola Daniel,

te respondo en la respuesta original

0voto

Leonardo-Tadei comentado

Hola Daniel,

es la primera de mis suposiciones: tenés un solo FORM html y nombre de campos repetidos. Esto significa que el servidor solo recibirá uno de todos los que se llamen igual (dependiendo del navegador, el primero o el último).

También estás generando código HTML inválido, ya que no puede haber dos elementos con el mismo ID, como pasa con el CHECKBOX y el SELECT. Podrías por ejemplo concatenear al ID del elemento el ID del usuario devuelto por la query, para que sean todos disintos.

Para solucionarlo tenés dos caminos: hacer que los SELECT tengan todos distinto NAME, de manera tal que el navegador envíe todos. Esto es lo más simple para no cambiar demasiado tu código:

<input type="checkbox" id="selec" name="selec-<%=idPedido2%>" value="<%=idPedido2%>">
...
<select name="privilegios-<%=idPedido2%>">
   <option value="administrador">administrador</option>
   <option value="estandar">estandar</option>
</select>

De esta forma, recorrés todos los datos que te llegan que empiecen con "select-" y obtenés el ID correspondiente, y con ese ID obtenés el valor del elemento "privilegios-ID".

Con un poco de parseo de los datos recibidos tenés todo lo que hace falta para hacer el proceso.

El otro camino es que los elementos repetidos sean un vector HTML:

<input type="checkbox" id="selec" name="selec[]" value="<%=idPedido2%>">
...
<select name="privilegios[]">
   <option value="administrador">administrador</option>
   <option value="estandar">estandar</option>
</select>

con lo que ahora, solo agregando corchetes al nombre, los elementos "sele" y "privilegios" enviados por POST son un vector, con lo que podés acceder a cada valor del formulario.

Esto tiene en tu caso un efecto colateral molesto, que es los checkbox HTML no tildados no se envían, con lo que no es fácil relacionar el checkbox con el select corerspondiente, cosa que en el caso anterior se hacía analizando los nombres.

Según el camino que elijas podemos serguir refinando la solución. Si el problema que et surge pasa a otra parte del código, considera crear una nueva pregunta.

Saludos!

0voto

danielreales7 comentado

Te voy a dejar también el código donde recibo estos datos, porque en realidad desde el otro jsp almaceno los checkbox seleccionados en un array, e intento modificar los que selecciona nada más.

try{
    Class.forName(driver);
    conexion = DriverManager.getConnection(url,"root","trebujena");
    Statement estatement = conexion.createStatement();
    int idAdmin = Integer.parseInt(request.getParameter("idAdmin"));
    String tipo = request.getParameter("privilegios");
    if(request.getParameterValues("selec")!=null){
    String array[]=request.getParameterValues("selec");
        for(int x=0;x<array.length;x++){
                String cadena2 = "UPDATE usuario SET tipo='"+tipo+"' WHERE id='"+array[x]+"'";
                estatement.executeUpdate(cadena2);
        }
    }
%><jsp:forward page="privilegios.jsp">
        <jsp:param name="id" value="<%=idAdmin%>" />
    </jsp:forward><%

0voto

Leonardo-Tadei comentado

Hola Daniel,

request.getParameterValues("selec") devolverá un array solo si el nombre en el HTML es selec[] y no solo selec

Además de esto, el select "privilegios" al no ser tampoco un array, tendrá el valor del primero o del último, y eso es lo que tu código asignará a todos los seleccionados, porque estás tratando con un solo valor de "tipo", en vez de tratar cada valar de cada línea correspondiente a su "selec" asociado.

En mi respuesta anterior te indico que no tenés el HTML necesario para procesar la respuesta: mientras no corrijas eso, no recibirás los valores que te hacen falta para hacer el proceso.

0voto

danielreales7 comentado

Entonces poniendo en el checkbox como name=selec[] y en el name del select name=privilegios[] puedo manejarlos en array.

Lo que no sé es como almacenarlos en el otro jsp.
Estoy intentando hacerlo con:

String array[]=request.getParameterValues("selec");
    String tipo[] = request.getParameterValues("privilegios");

Pero no consigo lograrlo.
Me cuesta mucho entenderlo por aquí, losiento y muchas gracias por contestar a todo!

0voto

Leonardo-Tadei comentado

El código que ponés en el comentario de arriba se ve bien. Tenés ahora un vector array con todos los selec y un vector tipo con todos los privilegios.

Ahora debuguéalos para ver qué es lo que recibes, y con eso rearmar el bloque de código que hace el update.

Tené en cuenta que en HTML, un checkbox no tildado no se envía al servidor: noes un fallo de tu código, es el funcionamiento que debe tener el HTML.

Suerte!

PD: si la respuesta te ha servido, seleccionala como "la mejor" así el tema queda marcado como solucionado.

0voto

danielreales7 comentado

Teniendo en el name=selec[] con corchetes no me entra aquí el programa:

if(request.getParameterValues("selec")!=null)

Entonces no puedo poner eso como tú dices sino normal poniendo selec.

Y no entiendo porque una vez que tengo todos los privilegios en el array privilegios ejecutando la sentencia update de esta forma:

String cadena2 = "UPDATE usuario SET tipo='"+tipo[x]+"' WHERE id='"+array[x]+"'";

No me llega hacer nada... estoy ya tan liado que no sé ni lo que tengo que hacer para que esto funcione correctamente y lo más probable es que sea una tontería, pero no doy con ella ahora mismo.

0voto

Leonardo-Tadei comentado

Envianos un vuelco del contenido de las variables request.getParameterValues("selec") y request.getParameterValues("privilegios") para que veamos lo que recibís.

Indicanos también cuál es exactamente el name del atributo en HTML, si selec o selec[] y si privilegios o privilegios[] para el vuelco de contenido de variables.

0voto

danielreales7 comentado

Mira he realizado esto mismo en otro proyecto diferente y me devuelve con request.getParameterValues("selec") un numero (en este caso el valor del for) y en request.getParameterValues("privilegios") me devuelve administrador o estandar, según lo que seleccione.

Pero en mi proyecto me sigue cambiando el tipo nada más que administrador y a estándar no lo devuelve nunca.

En mi proyecto tengo selec nada mas como name y en privilegios igual.

Y la sentencia que te puse antes también es la misma, así que no entiendo aún porque no me sale, porque debería de salir.

0voto

danielreales7 comentado

Ya sé de donde viene el fallo y es de la sentencia update:

String cadena2 = "UPDATE usuario SET tipo='"+tipo[x]+"' WHERE id='"+array[x]+"'";

No puede ser tipo[x], porque sino siempre me devuelve administrador que es el primer elemento que existe en tipo (en este caso porque el primer usuario es administrador), por eso es el problema, así que tengo que decir que en vez de tipo[x], que se posicione según el valor del otro array en el array tipo.

0voto

Leonardo-Tadei comentado

No te sigo... tipo[x] debería ser justamente el valor del vector tipo en la posición x, y por tanto como el for recorre todos los elementos del vector, cada tipo[x] asume el valor que le corresponde.

Te insisto en que parece que no estás recibiendo todos los valores a procesar, sino como si existiera una sola línea de la tabla HTML...

Si tenés un rato, me gustaría que cambies los name del formulario a select[] y a privilegios[], en el código que recibe los datos los rescibas como:

String[] selec = request.getParameterValues("selec");
String[] privilegios = request.getParameterValues("privilegios");

y nos envíes los valores que toman los vectores selec y privilegios

0voto

danielreales7 comentado

Ya lo he conseguido hacer, mira te comento:

En primer lugar tipo[x] como bien dices me recorre cada elemento dentro del for pero para esa consulta que estoy haciendo yo, estoy diciendo con tipo[x] que me coja el elemento 0 de tipo, es decir, en el array tipo me recoge todos los elementos que existen según los usuarios que haya y mi primer usuario en la base de datos es de tipo administrador y los demás estándar.

Entonces en el array tipo[x] tendría administrador la primera vez que recorre el for la segunda vez tendre estandar y así sucesivamente.

Para eso ya tengo otro array, en mi caso array[] y ahí voy almacenando los valores del checkbox.

Entonces lo que necesito es la siguiente línea para que me lo haga correctamente:

String cadena2 = "UPDATE usuario SET tipo='"+tipo[Integer.parseInt(array[x])-1]+"' WHERE id='"+array[x]+"'";

Ahí estoy diciendo que en el array tipo[] (tengo que parsear el otro array que es de String a entero para que me busque dentro de tipo el valor que recibo del checkbox en este caso el id de dicho usuario y menos 1, porque al hacer debugger en netbeans me fijé en las variables que me estaba cogiendo un valor de más como ya sabes) donde el id en la base de datos está almacenado en array[x].

Espero que lo hayas entendido y muchas gracias por todo! Llevo un largo día rayado pero al fin he conseguido sacar esto y acabar mi proyecto un saludo!

0voto

Leonardo-Tadei comentado

Hola Daniel,

Me alegra que lo hayas solucionado!
por tu planteo original, me parecía que los checkbox tenían un dato y los select tenían otro en tu HTML. Pasa a veces porque uno quiere plantear el problema de laforma más concisa posible, y luegoacemos asunciones sobre el contecto.

En cualquier caso, me alegra de veras que esta interacción te haya servido para ver qué debuguear y encontrar el erro.

Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta