Cargar combo jsp desde colección datos

Mil perdones, por error, estoy creo repitiendo la pregunta, debo de haber dado enter, y envíe la pregunta sin terminar.
Con tinuo, te decía que tengo una aplicación que da de altas alumnos a través de un form en jsp, pasa los datos validando un actionform,
No he logrado cargar el nombre de las familias en un combo, pues hay niños que son hermanos, por cuanto quiero relacionarlos a través de su flia, para luego diferenciar al momento del cobro de cuotas,
Por tanto cuando acceda a la página de cargar datos, que estén cargadosen un combo los nombres de las familias, éstas tienen un bean relacionado.
Desde una página de menu, con un botón de un form, llama a un action (solo action, sin actionform dependiente) el cual, recupera desde la base de datos el listado de las "Familias" y si el listado tiene datos, con un forward le paso el Vector con Familias, para que cargue el combo,
para hacer pruebas y no tener toda la estructura de la jsp con todos los datos de los niños, utilice para probar una página que intenta cargar el combo con los datos de la familia, (si logro esto, después agregare el código en la página con todos los datos que requiero),
espero se haya entendido la idea, ahora voy a agregar el código relacionado, para que puedas visualizar mejor, estoy utilizando netbeans 6.5.1, con server jboss 5.0.1.GA, con struts
En la página de menu, utilizo este código
"<form name="form1" method="post" action="CargarIdFamilias.do">
<input type="submit" name="Submit" value="Ingreso de Niños">
</form> "
En struts config, para el action:
"<action path="/CargarIdFamilias"
scope="request"
type="com.myapp.struts.src.controlador.Actions.CargarIdFamilias">
<forward name="listadoFamilias" path="/CargarCombo.jsp"/>
</action>"
El metodo execute del action para cargar el vector con las familias, pasandolo como atributo de request (¿ES correcto? ¿O requiere session?)
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response){
try {
logica = LogicaKombis.getInstance();// singleton de la logica del sistema
Vector<Familias> vec = logica.listarFamilias();
request.setAttribute("NN", vec);
return af = mapping.findForward("listadoFamilias");
} catch (PersistenciaException ex) {
errors.add("PersistenciaException", new ActionMessage("" + ex.getMessage()));
//se envia la coleccion errors a la pagina q los intercepta
request.setAttribute("errores", errors);
return af = mapping.findForward("error");
} catch (FamiliaException ex) {
errors.add("FamiliaException", new ActionMessage("" + ex.getMessage()));
//se envia la coleccion errors a la pagina q los intercepta
request.setAttribute("errores", errors);
return af = mapping.findForward("error");
}
}
La lógica del sistema, utiliza el patrón singleton, luego el método listar familias, obtiene un vector con las familias cargadas en el sistema, obteniendo los datos desde mysql, eso funciona, ya esta probado con junit correctamente
----------------------------------
El bean de los objetos del vector, las Familias:
"
package com.myapp.struts.src.logica;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name = "familias")
@NamedQueries({@NamedQuery(name = "Familias.findAll", query = "SELECT f FROM Familias1 f"),
@NamedQuery(name = "Familias.findByIdFamilia", query = "SELECT f FROM " +
"Familias f WHERE f.idFamilia = :idFamilia"),
@NamedQuery(name = "Familias.findByNombre", query = "SELECT f FROM " +
"Familias f WHERE f.nombre = :nombre")})
public class Familias implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idFamilia")
private Integer idFamilia;
@Column(name = "Nombre")
private String nombre;
@OneToMany(mappedBy = "idFamilia")
private Collection<Alumnos> alumnos1Collection;
/**
* constructor vacio
*/
public Familias() {
}
/**
* constructor unicamente con idFamilia
* @param idFamilia
*/
public Familias(Integer idFamilia) {
this.idFamilia = idFamilia;
}
/**
* constructor con nombre de familia, utilizado para ingresar familias en bd
* @param nombre
*/
public Familias(String nombre) {
this.nombre = nombre;
}
/**
* constructor con todos los parametros, utilizado para recuperar
* objetos Familias desde la bd
* @param idFamilia
* @param nombre
*/
public Familias(int idFamilia, String nombre) {
this.idFamilia=idFamilia;
this.nombre=nombre;
}
public Integer getIdFamilia() {
return idFamilia;
}
public void setIdFamilia(Integer idFamilia) {
this.idFamilia = idFamilia;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Collection<Alumnos> getAlumnos1Collection() {
return alumnos1Collection;
}
public void setAlumnos1Collection(Collection<Alumnos> alumnos1Collection) {
this.alumnos1Collection = alumnos1Collection;
}
@Override
public int hashCode() {
int hash = 0;
hash += (idFamilia != null ? IdFamilia.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Familias)) {
return false;
}
Familias other = (Familias) object;
if ((this.idFamilia == null && other.idFamilia != null) || (this.idFamilia != null && !this.idFamilia.equals(other.idFamilia))) {
return false;
}
return true;
}
@Override
public String toString() {
return "com.myapp.struts.src.logica.Familias1[idFamilia=" + idFamilia + "]";
...

1 respuesta

Respuesta
-1
Si he entendido bien el código, la clase Familias contiene una sola familia, y tú quieres pintar una colección de Familias. Esta colección de familias la pones en un vector que es una propiedad de request. Creo que por aquí te viene el error. Tienes que tener un bean que se llame NN (u otro nombre más adecuado) que es el nombre que le das en el optionsCollection con un método que te recupere la lista de familias y que tienes que declarar en el optionsCollection como atributo "property". Creo que haber preparado el Vector en la acción no te va a ayudar.
Hola, de nuevo, no te había contestado, pues estaba tratando de ver como lo solucionaba, teniendo en cuenta tu respuesta, lo bueno de tu respuesta, para mi caso, es que me diste pautas, y tuve que seguir investigando para encontrar la solución, no fue el código en si, pero ahora de nuevo estoy trancado .
He hecho un bean con un form, desde al action cargo el vector con string, y luego lo llamo desde la jsp,
ListarFamiliasForm --------------------------------------------------------------------------------
------ - - - - - -
package com.myapp.struts.src.controlador;
import java.util.Collection;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
public class ListarFamiliasForm extends org.apache.struts.action.ActionForm {
    private String nombre;
    private Vector<String> collNombresFamilias;
    public ListarFamiliasForm() {
        super();       
    }
    public Vector<String> getCollNombresFamilias() {
        return collNombresFamilias;
    }
    public void setCollNombresFamilias(Vector<String> collNombresFamilias) {
        this.collNombresFamilias = collNombresFamilias;
    }
    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }   
    @Override
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();       
        return errors;
    }
}
ListarFamiliasAction
-          - -
package com.myapp.struts.src.controlador.Actions;
import com.myapp.struts.src.controlador.ListarFamiliasForm;
import com.myapp.struts.src.controlador.exception.FamiliaException;
import com.myapp.struts.src.controlador.exception.PersistenciaException;
import com.myapp.struts.src.logica.Familias;
import com.myapp.struts.src.modelo.LogicaKombis;
import java.util.Iterator;
import java.util.Vector;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMessage;
public class ListarFamiliasActiion extends org.apache.struts.action.Action {
    /* forward path="" */
    private final static String SUCCESS = "success";
    private LogicaKombis logica;
    private ActionErrors errors = new ActionErrors();
    private  ActionForward af=null;
    /**
     * This is the action called from the Struts framework.
     * @param mapping The ActionMapping used to select this instance.
     * @param form The optional ActionForm bean for this request.
     * @param request The HTTP Request we are processing.
     * @param response The HTTP Response we are processing.
     * @throws java.lang.Exception
     * @return
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        Vector<String> st=new Vector<String>();
        try {
            logica = LogicaKombis.getInstance();
            Vector<Familias> vec = logica.listarFamilias();
            ListarFamiliasForm lfrm=(ListarFamiliasForm)form;
            Iterator it=vec.iterator();
            while(it.hasNext()){
                Familias fam=(Familias)it.next();
                st.add(fam.getNombre());
            }
            lfrm.setCollNombresFamilias(st);
           af=mapping.findForward(SUCCESS);
        } catch (PersistenciaException ex) {
             errors.add("PersistenciaException", new ActionMessage("" + ex.getMessage()));
                //se envia la coleccion errors a la pagina q los intercepta
                request.setAttribute("errores", errors);
                return af = mapping.findForward("error");
        } catch (FamiliaException ex) {
             errors.add("FamiliaException", new ActionMessage("" + ex.getMessage()));
                //se envia la coleccion errors a la pagina q los intercepta
                request.setAttribute("errores", errors);
                return af = mapping.findForward("error");
        }
        return af;
    }
}
utilizo la jsp:
CargarCombo.jsp
-          - -
<%@page contentType="text/html" pageEncoding="UTF-8"
import="com.myapp.struts.src.logica.FamiliasBean"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>carga Combo Box</title>
</head>
<body>
<h1>Hello World!</h1>
<p>                  
<html:form action="/listarFamilias">
<table>
<tr>
<td>
                        Seleccione Familia :
                    </td>
<td>
<html:select  property="nombre">
<html:option value="0">
Selecione Familia
</html:option>
<html:optionsCollection
                            property="collNombresFamilias" value="Nombre" label="nombre"/>
</html:select>
                    </td>
</tr>
</table>
</html:form>
        </p>
</body>
</html>
Y este es el error del servidor
Estado HTTP 500 -
type Informe de Excepción
Mensaje
Descripción El servidor encontró un error interno () que hizo que no pudiera rellenar este requerimiento.
Excepción
org. Apache.jasper.JasperException: javax. Servlet.ServletException: javax. Servlet.jsp.JspException: Failed to obtain specified collection
        org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:515)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:322)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:249)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
causa raíz
Javax. Servlet.ServletException: javax. Servlet.jsp.JspException: Failed to obtain specified collection
        org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:852)
        org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
        org.apache.jsp.CargarCombo_jsp._jspService(CargarCombo_jsp.java:96)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:322)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:249)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
causa raíz
javax.servlet.jsp.JspException: Failed to obtain specified collection
        org.apache.struts.taglib.html.OptionsCollectionTag.doStartTag(OptionsCollectionTag.java:176)
        org.apache.jsp.CargarCombo_jsp._jspx_meth_html_005foptionsCollection_005f0(CargarCombo_jsp.java:239)
        org.apache.jsp.CargarCombo_jsp._jspx_meth_html_005fselect_005f0(CargarCombo_jsp.java:168)
        org.apache.jsp.CargarCombo_jsp._jspx_meth_html_005fform_005f0(CargarCombo_jsp.java:124)
        org.apache.jsp.CargarCombo_jsp._jspService(CargarCombo_jsp.java:84)
        org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
        org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:322)
        org.apache.jasper.servlet.JspServlet.service(JspServlet.java:249)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
Nota La traza completa de la causa de este error se encuentra en los archivos de diario de JBoss Web/2.1.2.GA.
JBoss Web/2.1.2.GA
Lo que no entiendo realmente es dentro de la etiqueta options collecctions
(property="collNombresFamilias" value="Nombre" label="nombre")
Que significan o a que corresponden : property, creo que el objeto/colección con los datos, pero después value y label, de algunos ejemplos intente darme cuenta, pero no se realmente que corresponde,
Desde ya muchas gracias de nuevo, por tu pronta anterior respuesta,
un saludo
ignacio
El property representa la clase que usas para materializar la familia. Dentro de esta clase tendrás un getter y un setter que devuelve un valor (el id por ejemplo) y otro que devuelve el label (el nombre de la familia). Lo que hace struts es transformar lo siguiente:
<optionsCollection property="colNombresFamilias" value="id" label="nombre"/>
en una lista de:
<option value="35">Familia Rodríguez</option>
Las familias tienen que agruparse en un List o un Collection que es lo que alimenta el optionsCollection y que se define en el property, por tanto tendrás que tener las siguientes funciones:
List<Familias> getColNombresFamilias() ... devuelve la lista de las familias que pintarán los options del select.
String getId() ... devuelve el id del value del option
String getNombre() ... devuelve el nombre de la familia
Bien, he realizado algunos cambios, pero me da el mismo mensaje el servidor
-------------------------------------
estos son los cambios en el bean, agregue el idFamilia (en el objeto Familias es de tipo int, tiene q ver eso cuando lo llama la jsp, en el value="",
public class ListarFamiliasForm extends org.apache.struts.action.ActionForm {
    private int idFamilia;
    private String nombre;
    private Vector<Familias> collNombresFamilias;
    /**
     *
     */
    public ListarFamiliasForm() {
        super();       
    }
    public Vector<Familias> getCollNombresFamilias() {
        return collNombresFamilias;
    }
    public void setCollNombresFamilias(Vector<Familias> collNombresFamilias) {
        this.collNombresFamilias = collNombresFamilias;
    }
    public String getNombre() {
        return nombre;
    }
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    public int getIdFamilia() {
        return idFamilia;
    }
    public void setIdFamilia(int idFamilia) {
        this.idFamilia = idFamilia;
    }
---------------------
el action cambie para que tomara las familias
 logica = LogicaKombis.getInstance();
            Vector<Familias> vec = logica.listarFamilias();
            ListarFamiliasForm lfrm=(ListarFamiliasForm)form;
            /*Iterator it=vec.iterator();
            while(it.hasNext()){
                Familias fam=(Familias)it.next();
                st.add(fam.getNombre());
            }*/
            lfrm.setCollNombresFamilias(vec);
Siempre se refieren a list como collections, yo utilizo vector de objetos Familias, ¿eso tiene algo que ver?
- - - - - -
en el jsp quedo asi
<html:form action="/listarFamilias">
<table>
<tr>
<td>
                        Select Country :
                    </td>
<td>
<html:select  property="nombre">
<html:option value="0">
Selecione Familia
</html:option>
<html:optionsCollection name="ListarFamiliasForm"
                            property="collNombresFamilias" value="idFamilia" label="nombre"/>
</html:select>
                    </td>
</tr>
</table>
</html:form>
  -------------------------
De nuevo el mismo error el servidor
Estado HTTP 500 -
type Informe de Excepción
Mensaje
Descripción El servidor encontró un error interno () que hizo que no pudiera rellenar este requerimiento.
Excepción
org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: Failed to obtain specified collection org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:515) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:322) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:249) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
causa raíz
javax.servlet.ServletException: javax.servlet.jsp.JspException: Failed to obtain specified collection org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:852) org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781) org.apache.jsp.CargarCombo_jsp._jspService(CargarCombo_jsp.java:96) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:322) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:249) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
causa raíz
javax.servlet.jsp.JspException: Failed to obtain specified collection org.apache.struts.taglib.html.OptionsCollectionTag.doStartTag(OptionsCollectionTag.java:176) org.apache.jsp.CargarCombo_jsp._jspx_meth_html_005foptionsCollection_005f0(CargarCombo_jsp.java:239) org.apache.jsp.CargarCombo_jsp._jspx_meth_html_005fselect_005f0(CargarCombo_jsp.java:168) org.apache.jsp.CargarCombo_jsp._jspx_meth_html_005fform_005f0(CargarCombo_jsp.java:124) org.apache.jsp.CargarCombo_jsp._jspService(CargarCombo_jsp.java:84) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:322) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:249) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
Nota La traza completa de la causa de este error se encuentra en los archivos de diario de JBoss Web/2.1.2.GA.
JBoss Web/2.1.2.GA
Creo que dice que no encuentra la collection, a que se refiere
Saludos
Perdona pero he estado algo liado. ¿Ya está solucionado el problema?
Hola, no te preocupes, por la demora,
Aun no he resuelto el tema con las tags de struts, te agradecería mucho poder hacerlo, he revisado las tags jstl, y ahí algo mejor me ha ido, pero no es lo que quiero
Así que si esta a tu alcance, sera muy bienvenido.
Saludos
Cuéntame en qué estado estás ahora mismo.
Bien,
Fíjate por favor en lo que te he enviado el 21/5, eso no lo pude resolver con las tags de struts y no lo he tocado más
He seguido con otras cosas de la lógica del sist, así que si puedes contestame a eso que no encuentra la collection
Saludos
No pude resolver mi problema.
En tus respuestas nunca obtuve claridad, escabulliste el tema, me diste varios lineamientos muy acertados, pero yo no pude aplicarlos bien y luego hace más de un mes que no me has respondido nada
Con tu reputación, tenia fe de que me ayudaras de mejor forma

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas