JSP (Java Server Page) - formularios con checkbox

 
Vista:

formularios con checkbox

Publicado por nepthis (37 intervenciones) el 30/01/2007 17:56:31
Hola de nuevo!
Levo varios días con una cosa, y no consigo solucionarla. He visto ejemplos en php pero no consigo hacerlo funcionar con jsp y servlet.
A ver, yo creo un formulario a base de checkbox sacando, primeramente, mediante un servlet de la bd lo que voy a mostrar, y luego redirecciono a la página jsp que mediante un bean muestra lo que yo quiero:

<%
int i;
for (i=6; i<datosAvisos.size(); i = i + 8) { %>

<p><input type="checkbox" id="aviso" name="aviso" value="" /> <label for="aviso"><%= datosAvisos.elementAt(i) %> </label></p>
<% } %>

PROBLEMA: de esta manera cada name es igual, por lo tanto, cuando recoja los datos del formulario, no sabré diferenciar uno de otro. Cómo lo hago?

Tampoco sé como recoger lo que el usuario ha marcado. Lo va a hacer un servlet, pero no sé cómo identificar lo marcado.

Muchas gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:formularios con checkbox

Publicado por Gonzalo (72 intervenciones) el 30/01/2007 19:47:00
Lo que tienes que hacer son dos cosas:

1. Aunque se llamen igual, lo que tienes que hacer es darle a cada uno un valor (value) diferente. Es que no tiene sentido que tengan el valor en blanco todos... Todos con el mismo nombre, y sin ningún valor... no sirven para mucho.

2. Cuando recibas el formulario en lugar de recoger request.getParameter("aviso") que te devuelve un solo valor, usa request.getParameterValues("aviso"), que te devuelve todos los valores recibidos en un arreglo (String[]).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:formularios con checkbox

Publicado por nepthis (37 intervenciones) el 31/01/2007 19:38:01
Hola! He seguido tus consejos, pero no me funciona.
Este es el código de la página jsp con el formulario

<%
int i;
for (i=8; i<datosAvisos.size(); i = i + 10) { %>

<p><input type="checkbox" id="aviso" name="aviso" value"<%= i%>" /> <label for="aviso"><%= datosAvisos.elementAt(i) %> </label></p>
<% } %>

El código del servlet es

String TITULOS[];
public void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
// Adquisición de los valores del formulario

TITULOS = request.getParameterValues("aviso");

doGet(request, response);

}

public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

{
HttpSession session = request.getSession(false);

if (session != null)
{

session.setAttribute("titulo-seleccionados", TITULOS);
}

Lo único que hago es recogerlo, y luego lo visualizo posteriormente. Es decir, tengo por ahi un servlet de "muletilla" que me muestra los objetos guardados en la session, y lo que me muestra para titulo-seleccionados es

Nombre: titulo-seleccionados Valor: [Ljava.lang.String;@9e0c2d

¿cómo accedo a cada elemento? He intentado acceder con TITULOS[0], por ejemplo, pero no me muestra nada. Además, se supone que este string[] tiene sólo los seleccionados?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:formularios con checkbox

Publicado por Gonzalo (72 intervenciones) el 31/01/2007 21:59:36
No sé si será un error al copiar, pero te falta el = en value="<%= i %>"
Por lo demás, sí, es como has dicho.


En el formulario de envío saldrá algo como:
<input type="checkbox" id="aviso" name="aviso" value="0" /> <label for="aviso">Primero</label>
<input type="checkbox" id="aviso" name="aviso" value="1" /> <label for="aviso">Segundo</label>
<input type="checkbox" id="aviso" name="aviso" value="2" /> <label for="aviso">Tercero</label>
...
<input type="checkbox" id="aviso" name="aviso" value="6" /> <label for="aviso">Séptimo</label>

(Nota: Sería mejor si en el value pusieras algo que tuviera más significado que un simple número. Qué pasa si por cualquier cosa cambias el órden de las opciones? Tendrías que cambiar todos los sitios donde se mirara si la opción es la 3 o la 4 en lugar de usar algo más identificativo. Pero bueno, esto es un detalle nada más.)

Luego cuando lo recibes, request.getParameterValues("aviso") te devuelve un String[] así que puedes acceder a ello normalmente con algo como:

String[] titulos = request.getParameterValues("aviso");
for (int i = 0; i< titulos.length; i++) {
····System.out.println(titulos[i]);
}

Y sí, es correcto, sólo llegarán los valores de los que se han seleccionado al enviar.

Ah, si te sale esto:
Nombre: titulo-seleccionados Valor: [Ljava.lang.String;@9e0c2d
seguramente es porque estás tratando de sacarlo tal cual. Es decir, escribes algo como:
"Nombre: " + nombre + " Valor: " + session.getAttribute(nombre)

El problema es que si intentas hacer eso con un array de cadenas, no te saca todas las cadenas, sólo lo que has visto, que es el identificador del array. Prueba a hacer en tu servlet muletilla algo como:

Object obj = session.getAttribute(nombre);
if (obj.getClass().isArray()) {
····System.out.println("Nombre: " + nombre + " Valores ["+obj.length+"]: ");
····for (int i = 0; i< obj.length; i++) {
········System.out.println(obj[i]);
····}
} else {
····System.out.println("Nombre: " + nombre + " Valor: " + obj);
}
(Cambia System.out.print por lo que necesites para sacarlo como te sea más cómodo)

Si era lo del = que faltaba, pues nada, estupendo. Si te falla algo más, pon los errores que te esté dando o lo que sea.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:formularios con checkbox

Publicado por nepthis (37 intervenciones) el 01/02/2007 22:39:52
Muchas gracias Gonzalo. Efectivamente, lo del = era error mio.Pero sigue sin funcionarme. Voy a explicar paso a paso lo que quiero y cómo lo estoy haciendo:

1º Con un servlet accedo a la base de datos, obtengo el título de los avisos y el código de cada aviso y lo guardo en la sesion. Redirijo la salida a una pagina jsp.
(esta parte funciona)
2º Esta página jsp me muestra un formulario con checkbox para elegir el título de los avisos que deseo borrar.
<jsp:useBean id="datosAvisos" type="java.util.Vector" scope="session" />
<%
if ( (usuario.isRegistrado()) ){
%>
.......
<%
int i;
for (i=8; i<datosAvisos.size(); i = i + 10) { %>

<p><input type="checkbox" id="aviso" name="aviso" value="<%= i%>" /> <label for="aviso"><%= datosAvisos.elementAt(i) %> </label></p>
<% } %>

no tengo otra manera de diferenciar los value porque a priori no se cúantos títulos voy a mostrar. Por eso los saco con un for. (esto también funciona)
3º Recojo lo que el usuario ha marcado. Busco ese título en la lista de titulos y codigos guardada en la sesión(paso1). Cuando lo encuentro, obtengo el código de ese título y accedo a la base de datos para borrar ese anuncio.(esta parte de borrar funciona). Lo que no funciona es la búsqueda del código.

String TITULOS[];
public void doPost ...........
TITULOS = request.getParameterValues("aviso");
doGet(request, response);
}

public void doGet .............
if (session != null)
{

Usuario usuario = (Usuario) session.getAttribute("usuario");

if ((usuario != null) && (usuario.isRegistrado()))

{

Vector datosAvisos = (Vector) session.getAttribute("datosAvisos");
// este es el que tiene los titulos y los códigos correspondientes
if (datosAvisos != null)
{
avisos = new Avisos ();

for (int i = 0; i< TITULOS.length; i++)
{
String titulo2 = TITULOS[i];
for (int j=6; i<datosAvisos.size(); j = j + 8)
{
String titulo = (String) datosAvisos.elementAt(j);
if (titulo2.equals(titulo))
{
String cod_aviso= (String) datosAvisos.elementAt(j=j-1);
String cod_doc= (String) datosAvisos.elementAt(j=j-2);
int codigo_aviso=Integer.parseInt(cod_aviso);
int cod_doctorado=Integer.parseInt(cod_doc);
// borramos de la base de datos
borrado = avisos.BorrarAviso(codigo_aviso,cod_doctorado);

El error que me da es (aunque pase de todas las comparaciones y códigos y ponga: borrado = avisos.BorrarAviso(45,45), con lo que estoy segura de que aunque compila bien, y no da errores de tipos, falla algo al comparar los titulos o al sacar los códigos, lo que pasa es que no lo entiendo

reated MBeanServer with ID: 535b58:1107ebb56f2:-8000:usuario-7e6f7f9:1
java.lang.ArrayIndexOutOfBoundsException: 414 >= 410
at java.util.Vector.elementAt(Unknown Source)
at libreria.BorrarAviso.doGet(BorrarAviso.java:111)
at libreria.BorrarAviso.doPost(BorrarAviso.java:61)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:831)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:639)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1196)
at java.lang.Thread.run(Unknown Source)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:formularios con checkbox

Publicado por Gonzalo (72 intervenciones) el 02/02/2007 00:53:09
Bueno, si
for (i=8; i<datosAvisos.size(); i = i + 10) { %>
····<input type="checkbox" id="aviso" name="aviso" value="<%= i%>" />
y
····TITULOS = request.getParameterValues("aviso");
y
····String titulo2 = TITULOS[i];
y
····String titulo = (String) datosAvisos.elementAt(j);
la comprobación
····if (titulo2.equals(titulo))
me parece que no es lo que quieres.

¿Por qué?
Los valores que recibes en request.getParameterValues("aviso") son un String[] que contiene los values que has puesto antes. Es decir, 1, 3, 4, 8... (los que hayas seleccionado), los índices en el vector.

Después, vuelves a coger el vector y comparas el índice titulo2 con el elemento titulo. Uno es el índice y otro es el elemento. Claramente la comparación no parece buena, ¿no?
Deberías simplemente sacar:
····(String) datosAvisos.elementAt( Integer.parseInt(TITULOS[i]) );
Es decir, usar TITULOS[i] como índice directamente en el vector (transformándolo primero en un int, claro).

Luego está el asunto del Index Out of Bounds.
for (int j=8; i<datosAvisos.size(); j = j + 10)
debería ser
for (int j=8; j<datosAvisos.size(); j = j + 10)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:formularios con checkbox

Publicado por nepthis (37 intervenciones) el 04/02/2007 19:59:26
Gracias Gonzalo! Lo de la comparación de titulo2 y titulo, lo estaba haciendo mal porque no entendía lo que contenía TITULOS, pero gracias a tu aclaración ya lo he solucionado. Respecto a Index Out of Bounds, había mirado mil veces el bucle y no me estaba dando cuenta de esa i !!!
Muchas gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:formularios con checkbox

Publicado por nepthis (37 intervenciones) el 01/02/2007 22:47:51
Me acabo de dar cuenta de que el bucle de las j en el último servlet estaba mal inicializado, sería

for (int j=8; i<datosAvisos.size(); j = j + 10)

como en la página jsp, pero sigue dando el mismo error
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar