Foro sobre Java EE > llenar un selectonemenu desde mysql
Hola man,mira tu problema es clasico :)
El selectonemenu solo acepta "Strings" en su arraylist de valores.
Tu estas llenando de objetos ese arraylist, por lo que al querer mostrar los datos , el selectonemenu esta llamando al metodo toString(), lo cual te devuelve : Prueba.auxpop@5c9f29.
Lo que puedes hacer es Tener dos arraylist. Uno con los objetos ,por ejemplo empleados.
Y otro arraylist con los nommbres de estos empleados.
Este ultimo arraylist lo llenas sincronizadamente con el array de empleados, para que cuando quieras obtener el indice del item que escojas en el selectonemenu, puedas accederlo desde el arraylist de empleados.
En resumen, el selectone usara un arraylist de cadenas para que el usuario elija lo que quiera.
Si tu quieres obtener el empleado cuyo nombre a escogido el usuario desde el selectonemenu, solo deberas acceder al arraylist de empleados.
public static SelectItem[] getSelectItems(List<?> entities,
boolean selectOne) {
int size = selectOne ? entities.size() + 1 : entities.size();
SelectItem[] items = new SelectItem[size];
int i = 0;
if (selectOne) {
items[0] = new SelectItem(null, getMessage("selectOneOption"));
i++;
}
boolean selectDisable = false;
for (Object x : entities) {
items[i++] = new SelectItem(x, x.getName(), x.getDesc(),
selectDisable);
selectedName = null;
}
return items;
}
Hola,
ayer resolvi el problema, efectivamente quitando el list, solo aplique lo sig:
int i = rs.getRow();
nestacion = new String[i];
int j=0;
while (rs.next()) {
nestacion[j] = rs.getString("nestacion");
j++;
}
Creo seria algo paresido a lo tuyo pero mas comprimidon, pero funcionan los 2.
Gracias checolopoztli por el codigo.
Miguel V.
Chihuas, Mex.
Cabe aclarar que puedes emplear cualquier objeto como "itemValue", no necesariamente deben ser Strings. Por ejemplo,
...
Producto p = ProductosMgr.findProductoPorAlgunMedioPorEjemploJPAoJDBC(pk);
items[i] = new SelectItem(p, p.getNombre());
..
Para que esto te funcione, tienes que implementar un Converter específico para esta clase. Lo usarías como:
<h:selectOneMenu value="#{myBean.producto}">
<f:selectItems value="#{myBean.selectItemsProductos"/>
<f:converter converterId="id.del.converter.de.productos"/>
</hselectOneMenu>
Puedes observar que la propiedad value del selectOneMenu está asociada con una propiedad "producto" en el backing bean, que puede ser:
private Producto producto;
public Producto getProducto() { return this.producto; }
public void setProducto(Producto p) { this.producto = p; }
Si te interesa, puedes buscar un tutorial acerca de Converters en JSF.
Saludos,
Hola, espero me puedan ayudar, tengo un problema similar, al que ya se presento aquí, seguí lo que habían indicado en los post anteriores pero no me sale muy bien el resultado, paso a explicar mi problema:
Tengo una clase java (ObtieneDatos.java) que busca unos datos para llenar un selectonemenu, adjunto el codigo:
package utiles;
import utiles.ConexionBD;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
public class ObtieneDatos {
public static String sselect = "select idbanco,descripcion from tbl_bco_corresponsal";
public static ConexionBD cbConexionOracle = new ConexionBD();
public List alListaNombres = new ArrayList();
public List MetodoBuscaBancos(){
try{
cbConexionOracle.conectar();
PreparedStatement psSelect = cbConexionOracle.con_Oracle.prepareStatement(sselect);
ResultSet rs = psSelect.executeQuery();
while(rs.next()){
rs.getString("descripcion"));
alListaNombres.add(new SelectItem(rs.getInt("idbanco") +" & "+ rs.getString("descripcion")));
}
rs.close();
psSelect.close();
}catch(Exception e){
e.printStackTrace();
}
return alListaNombres;
}
}
Esta clase la llamo desde un Bean (NombreBancoBean.java):
package formBeans;
import java.util.List;
import javax.faces.model.SelectItem;
import utiles.ObtieneDatos;
public class NombreBancoBean {
public ObtieneDatos od = new ObtieneDatos();
public List lListaNombres = od.MetodoBuscaBancos();
private SelectItem[] siNombreBanco = { new SelectItem(lListaNombres) };
public SelectItem[] getNombreBanco(){
return siNombreBanco;
}
public void setNombreBanco(SelectItem[] siNombreBanco){
this.siNombreBanco=siNombreBanco;
}
}
Y las líneas donde tengo el selectOneMenu que necesito llenar:
<h:selectOneMenu value="#{nombreBancoBean.nombreBanco}">
<f:selectItems value="#{nombreBancoBean.nombreBanco}" />
</h:selectOneMenu>
Ahora explico mi problema, al llenarse con los datos los datos se me ven de esta forma:
[javax.faces.model.SelectItem@17a7de4,javax.faces.model.SelectItem@df33ae,javax.faces.model.SelectItem@1b9ef36,javax.faces.model.SelectItem@7e80a]
Además de eso los datos se agregan en una sola opcion dentro del selectOneMenu, Con esta forma de hacerlo, ¿Deberían salir los datos cada uno en una posicion distinta dentro del selectOneMenu?.
Espero me puedan ayudar muchas gracias de ante mano.
Saaalaudos shianim.
Mira este ejemplo :
<h:selectOneMenu id="selectCar"
value="#{carBean.currentCar}">
<f:selectItems
value="#{carBean.carList}" />
</h:selectOneMenu>
El atributo "value" es para setear un valor por defecto y no los valores a mostrar, para eso
usas el "f:selectItems"
Tu estas usando el mismo metodo tanto para el valor por defecto como para los valores a
mostrar. Corrige eso.
Ahora el f:selectItems recibe algo tan simple como una coleccion de Objetos SelectItem,
nada mas. Yo he trabajado con arraylist y no tuve problemas.
Estoy viendo tu codigo :
alListaNombres.add(new SelectItem(rs.getInt("idbanco") +" & "+ rs.getString("descripcion")));
El objeto SelectItem tiene 02 constructores, uno de un solo parametro, el que usas y otro que
recibe 02 parametros :
new SelectItem( Object Id, String descripcion)
Prueba con este constructor donde tu id seria rs.getInt("idbanco") y tu descripcion seria :
rs.getString("descripcion").
Con eso deberia funcionar.
hola diskulpen yo cree un proyecto un JPA y JSF con codigo generado y necesito implementar otro metodo k me coja el ide de provincia de un selectOneMenu y busque las ciudades k estan en esa provincia y se liste en otro selectOneMenu las ciudadesn me podrian ayudar en eso xfavor
hola mi problema es el siguietes.
ya puedo cargar y mostrar en los <f:selectItems>;
al momento que llamo mi metodo editar. no logro llenar mi <f:selectItems> ,
me bean
public void cargarDatosVehiculos(){
for(Object estaTmp :controlador.consultarTodo(Estado.class)){
estado=(Estado) estaTmp;
this.listaEstadoSI.add(new SelectItem(estado.getCodEstado(),estado.getEstadoVehi()));
}
xhtml
<p:selectOneMenu id="estado"
value="#{vehiculosBean.estadoPK}">
<f:selectItem itemValue="-1" itemLabel="selecione un estado"
noSelectionOption="true" />
<f:selectItems value="#{vehiculosBean.listaEstadoSI}" />
</p:selectOneMenu>
mi metodo editar es
public String editar(){
if(vehiculoSel != null){
/* acionCargarEstado();*/
}
System.out.println(vehiculoSel);
ExternalContext contextoServlet = FacesContext.getCurrentInstance().getExternalContext();
//Recupero el id vehiculo
Estado estado=new Estado();
String codvehiculo = contextoServlet.getRequestParameterMap().get("vehCod");
try {
/*List<Estado> listaEstado = consultasbd.consultaEstado("codigoEstado");
if(listaEstado.size() >= 1)
return codigoEstado;*/
}
Hola;
Estoy trabajando en un proyecto el cual lee una base de datos y despues llena un
List lista = new ArrayList();
lo lleno con solo una colsulta a mysql, se llena correctamente
lista.add(new auxpop(forsando.toString()));
Ahora cuando selecciono el boton para que llene el selectonemenu, si lo llena pero lo llena referenciando al paquete, la clase y un numero extraño, ejemplo
si son 4 los archivos que regresa, los regresa de la sig manera:
Prueba.auxpop@133bf6d, Prueba.auxpop@5c9f29, Prueba.auxpop@d54a44, Prueba.auxpop@fed27b
Ahora para llenar la lista utilizo otra clase que el constructor se llena
lista.add(new auxpop(forsando.toString()));
Alguien sabe si puedo hacerlo de otra forma ??
Ya lo intente con Vectores, pero me dice que ya es obsoleto el coneccionador :S, de hecho nome deja seleccionarlo desde el *.xhtml.
Miguel V.
Chihuas, Mex.