Binding un ArrayList a un DropDownList en JSF

El día de ayer se me hizo la siguiente consulta ¿cómo puedo utilizar un ArrayList como fuente de datos para un DropDownList en JSF?

Al parecer la respuesta no debería ser tan complicada, especialmente si la mayoría de aplicaciones JSF lo he realizado con JDeveloper y ADF, pero el proyecto se está desarrollando en NetBeans, es decir JSF puro.

Les explico un poco la estructura del programa. Tengo un POJO llamado Ubicación (atributos: código, nombre, codigo de país, código postal). Muestro parte del código, hacen falta los métodos set y get para cada atributo.

public class Ubicacion{

private int codigo;
private String nombre;
private String codigoPais;
private String codigoPostal; public Ubicacion(int codigo, String nombre, String codigoPais, String codigoPostal) {

this.codigo = codigo;
this.nombre = nombre;
this.codigoPais = codigoPais;
this.codigoPostal = codigoPostal;

}

….

Dentro del bean de session que crea NetBeans, he creado una propiedad – un ArrayList que contiene elementos de tipo Ubicación y que se denomina ubicaciones, cree los métodos get y set para dicha propiedad e inicialicé con algunos valores el ArrayList.

public class SessionBean1 extends AbstractSessionBean {

private ArrayList<Ubicacion> ubicaciones = new ArrayList<Ubicacion>();

Finalmente la parte visual en donde ubico un dropdownlist o combo, hago el binding especificando el atributo ubicaciones que se encuentra dentro del bean de sesión.

<webuijsf:form binding=»#{Page1.form1}» id=»form1″>

<webuijsf:dropDown binding=»#{Page1.dropDown1}» id=»dropDown1″ items=»#{SessionBean1.ubicaciones}» />

</webuijsf:form>

Hasta ahí, ejecuté la aplicación y lo que obtuve fue una página en blanco ¿que pasó?En ningún momento especifiqué que atributo debería ser el valor del dropdown ni tampoco lo que muestra al usuario.

Investigando llegué a ver que existe una clase Option (com.sun.webui.jsf.model.Option) de la cual deben heredar todas las clases que serán mostradas como elementos dentro de un dropdownlist. Es necesario configurar 2 atributos, value y label. Value indica el valor interno y label es lo que el usuario verá. El código de la clase Ubicación se vería así:

public class Ubicacion extends Option{

private int codigo;
private String nombre;
private String codigoPais;
private String codigoPostal;

public Ubicacion(int codigo, String nombre, String codigoPais, String codigoPostal) {

this.codigo = codigo;
super.setValue(codigo);
this.nombre = nombre;
super.setLabel(nombre);
this.codigoPais = codigoPais;
this.codigoPostal = codigoPostal;

}

Los métodos setValue y setLabel son heredados.

Bueno esto es nuevo para mi y espero que les sirva.

Powered by ScribeFire.

JDeveloper 11g trabajando con colecciones de datos como DataControl

Es común pensar que JDeveloper es una herramienta que únicamente puede trabajar con base de datos Oracle y con ADF BC, pues ésto es falso.

JDeveloper es una herramienta abierta que permite trabajar con otras bases de datos y con otros frameworks para la parte del modelo (dentro de una aplicación que aplique el patrón MVC).

He desarrollado un pequeño ejemplo (y generaré otros más) para demostrar como se puede trabajar con colecciones de datos (en mi caso ArrayList) para crear una aplicación que muestre los datos de dicha colección en una aplicación Web que utiliza ADF Faces.

Lo primero que realicé fue crear una clase POJO denominada usuario que tiene la siguiente forma:

public class Usuario {

private int usuarioId;
private String email;
private String login;
private String nombres;
public Usuario() {

}

public Usuario(int usuarioId1, String email1, String login1,

String nombres1) {

this.usuarioId = usuarioId1;
this.email = email1;
this.login = login1;
this.nombres = nombres1;

}

Luego he creado una segunda clase que contiene el ArrayList, una colección de usuarios, su forma es la siguiente:

public class ProveedorUsuario {

private ArrayList usuarios = new ArrayList();

public ProveedorUsuario() {
usuarios.add(new Usuario(1, «jorgaf@gmail.com», «jorgaf», «Jorge Lopez»));
usuarios.add(new Usuario(2, «j@gmail.com», «j», «J»));
usuarios.add(new Usuario(3, «o@gmail.com», «o», «O»));
usuarios.add(new Usuario(4, «r@gmail.com», «r», «R»));

}

public ArrayList getUsuarios(){

return usuarios;

}

}

Luego creo el DataControl sobre la clase ProveedorUsuario, dando clic derecho sobre la clase y seleccionando «Create Data Control» y listo. Dentro de la pestaña del Data Control puedo seleccionar la opción usuarios y arrastrarlo dentro de una página Web (archivo .jspx creado previamente) y el resultado es el siguiente:

Resultado final

Como se pueden dar cuenta las cabeceras han sido modificadas para que muestre un texto personalizado, que se encuentra en un archivo de propiedades. Para hacer ésto debemos seleccionar (dando doble clic en el archivo) el archivo Usuario.xml que contiene la descripción de la clase Usuario, luego seleccionar cada uno de los atributos y agregar una propiedad dando clic sobre el icono del lápiz que se encuentra en la esquina superior derecha, seleccionar la opción Control Hints y agregar texto en el campo Label Text.

Espero continuar con una serie de éstos ejemplos, hasta llegar a construir una aplicación basada en JPA.

Powered by ScribeFire.