26 junio 2009

Usando ObjectListDataProvider

En muchos casos tenemos la necesitad de mantener nuestros datos en memoria....
para luego guardar lo que deseamos.

En esta entrada les mostraré un tecnica para realizar esto, usando Netbeans y Glassfish... y la ayuda de una clase muy poderoza ObjectListDataProvider, aqui veran una de los tantos usos que le podemos dar en una aplicacion Web...


Lo primero que haremos será crear un Nuevo Proyecto, en el IDE Netbeans, nos dirigimos a File > New Project... nos aparece la sgte ventana, en Categories escogemos Java Web y en Projects > Web Application damos clic en Next


Luego aparece esta nueva ventana donde nombramos al proyecto en nuestro caso WebObjectList y damos clic en Next


Aparece esta nueva ventana donde escogemos el servidor, en nuestro caso Glassfish y damos clic en Next


Luego escogemos el Frameworks, seleccionamos Visual Web JavaServer Faces y damos clic en Finish

Despues de los pasos anteriores, ceramos la clase que nos permitirá agregar datos al ObjectListDataProvider, En la ventana Projects, seleccionamos nuestra Aplicacion, WebObjectList, creamos un nuevo Java Package (paquete), y lo nombramos myClass...

despues de haber creado el paquete procedemos a crear nuestra clase, sobre myClass damos clic derecho New > Java Class, aparece la sgte ventana, la nombramos dataNames y cliqueamos Finish


agregamos el sgte cdgo:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package myClass;

/**
*
* @author ecanaveras
*/
public class dataNames {

public dataNames(String nombre, String apellidos) {
this.nombre = nombre;
this.apellidos = apellidos;
}

private String nombre;

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

private String apellidos;

public String getApellidos() {
return apellidos;
}

public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}

}

Luego repetimos el proceso sobre el paquete y esta vez crearemos una extencion de la clase ObjectListDataProvider llamada dataNamesDataProvider, sgte imagen:

agregamos el sgte cdgo:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package myClass;

import com.sun.data.provider.impl.ObjectListDataProvider;
import java.util.ArrayList;
import java.util.List;

/**
*
* @author ecanaveras
*/
public class dataNamesDataProvider extends ObjectListDataProvider {

private List<dataNames> dataList = new ArrayList<dataNames>();

//Especificamos que la DataProvider deber ser Tipo dataNames
    public dataNamesDataProvider() {
this.setList(dataList);
this.setObjectType(dataNames.class);
}

//Agrega datos al DataProvider
    public void addNames(dataNames newData){
dataList.add(newData);
}

}

Ahora crearemos una instancia de la clase que acabamos de crear, nos dirigimos a la ventana Projects, seleccionamos nuestro proyecto, y abrimos Source Packages > webobjectlist > SessionBean1.java, y agregamos en el final el sgte Codigo:
private dataNamesDataProvider namesDataProviver = new dataNamesDataProvider();

public dataNamesDataProvider getNamesDataProviver() {
return namesDataProviver;
}

public void setNamesDataProviver(dataNamesDataProvider namesDataProviver) {
this.namesDataProviver = namesDataProviver;
}

Luego creamos una nueva Visual Web JSF Page, agregamos los componentes necesarios...

2 Texfield 1 button 1 table

En los compenentes que se usarán en el codigo Java, damos clic derecho y escogemos Add Binding Attribute, en este caso los textFields y el TableRowGorup de la tabla

Generamos (Build) nuestro proyecto, este paso es necesario para que JSF Page se actualize y conozca de la existencia del ObjectListDataProvider (namesDataProviver) del SessionBean1

ahora regresamos a nuestro JSP, sobre la tabla damos clic derecho, escogemos Table Layout aparece la sgte ventana, en el dropDown Get Data From, selecionamos namesDataProvider, e inmediatamente aparecen los campos de nuestra clase dataNames, y agregamos una nueva columna con un boton (boton Quitar).


nos queda algo parecido a esto: (lo verde es un gridPanel jejeje)

Ahora agregaremos registros a la tabla, en realidad al ObjectListDataProvider, entramos en la accion del boton "Agregar" haciendo doble clic sobre el mismo, y escribimos el sgte codigo:
public String btnAgregar_action() {
//Validar lo campos
    String name = txtName.getText() != null ? txtName.getText().toString() : "";
String apellido = txtApellido.getText() != null ? txtApellido.getText().toString() : "";
//Crear nuevos datos
    dataNames datos = new dataNames(name, apellido);
//Agregar registros al DataProvider
    getSessionBean1().getNamesDataProviver().addNames(datos);
getSessionBean1().getNamesDataProviver().commitChanges();
txtName.setText(null);
txtApellido.setText(null);

System.out.println("Registro add");
return null;
}

Para Quitar resgistros, en la vista Design del JSP nos vamos a la ventana Navigator y navegamos hasta la columna que tiene el boton (Quitar) , damos clic derecho , escogemos Edit Action Event Handler y escribimos el sgte codigo:
public String btnQuitar_action() {
//Quitar Registros

    RowKey rk = getTableRowGroup1().getRowKey();

getSessionBean1().getNamesDataProviver().removeObject(rk);
getSessionBean1().getNamesDataProviver().commitChanges();
return null;
}

Listo con esto ya hemos culminado con la presentacion del ObjectListDataprovider.

si desean el codigo fuente del proyecto aca lo dejo a disposicion!:

WebObjectList.zip

y como siempre les dejo un video del funcionamiento del la Aplicacion desarrollada en esta entrada.



Dejen sus comentarios... cualquier duda me comentan!!

6 comentarios:

  1. Muy bueno!! precisamente lo que estaba buscando.. gracias

    ResponderEliminar
  2. Gracias por el aporte, saludos.

    ResponderEliminar
  3. Hola muy buen aporte.. soy nuevo y quesiera saber como has hecho el cuadro de dialogo al eliminar una de las tuplas, osea la ventanita con los botones de si y no cuando solicita confirmacion.
    GRACIAS!!!

    ResponderEliminar
  4. Hola Denis, si te refieres al boton [Aceptar] y [Caneclar], es muy facil es solo usando un poco de javascript, lo que debes de hacer es buscar la propiedad onClick del boton en que deseas el mensaje y pegar el siguiente codigo:

    if(!confirm('Seguro que desea quitar este registro?')) return false;

    en tu codigo JSP del boton, debe quedar algo asi onClick="if(!confirm('Seguro que desea quitar este registro?')) return false;"

    listo, esto hace que aparezca el mensaje que quieres! al presionar aceptar se envia el codigo java de tu boton, al cancelar simplemente se hace un return false.

    Saludos!

    ResponderEliminar
  5. Hola, con una consulta, esta es mi jsf para mantenimiento de nombres:

    ************************************************
    ingrse nombre para buscar__________ botonBuscar
    *************************************************
    clave nombre boton editar
    ******************************************************
    1 a boton
    2 b boton
    3 c boton
    4 d boton
    *****************************************************
    la opcion es q cuando le de el boton editar este se vaya a otra pagina
    con los datos de la tupla y para jalar esto, uso lo siguiente:

    public String botonModificar()
    {
    try{
    RowKey rk=tableRowGruop.gerRowKey();
    if(rk!=null)
    {
    int
    clave=Integer.parseInt(DataProvider.getValue("clave",rk).toString);
    int
    nombre=Integer.parseInt(DataProvider.getValue("nombre",rk).toString);
    this.getSessionBean.setclave(clave);
    this.getSessionBean.setnombre(nombre);
    }
    }catch(Exception e)
    {
    system.err.println(e);
    }
    return "paginaModificar"
    }

    -tons en la pagina mdoficar jalo los datos con el sessionbean.getclave y getnombre y ya tengo los datos en la otra pagina.

    y esto funciona de maravilla el problema es cuando ingreso el parametro de busqueda y mi table cambia. Ejemplo ingreso c y le doy buscar y mi tabal se pone con el parametro correcto. y todo va bien

    ***********************************************
    ingrse nombre para buscar___c______ botonBuscar
    **************************************************
    clave nombre boton editar
    *****************************************************
    3 c boton
    *****************************************************

    el probema es q cuando el doy al boton modificar a este ya con la busqueda el codigo de arriba me tira lso datos del reguistro en la primera posicion :S

    me tira los datos de clave=1 y nombre =a en vez de tirarme clave=3 y nombre=c,

    como q no cambio a nivel de datos el table sino solo vista, :s

    como puedo obtener esos datos despues de la busqueda?

    Gracias de antemano.

    ResponderEliminar
  6. Hola Amigo.. bueno eso me ha pasado antes, y creo que ha muchos..

    lo que te sucede es lo sgte, tu pagina debe tener alguna consulta en la que estas volviendo a refrescar todos los datos, y cuando presionas el boton Editar, este toma siempre la primera fila que trae esa consulta, debes de evitar que eso suceda.

    en mi aplicacion uso este peq switch..
    tengo una variable en el SessionBean llamada controlRowset, en ella escribo el nombre de la clase que esta ejecutandose, y luego simplemente leo para comparar si estoy en la misma pagina, o me he hido a otra!

    en el metodo prerrender escribo la clase en la estoy...
    @Override
    public void prerender() }
    getSessionBean1().setControlRowset(this.getClass().getName().toString())
    }

    //Controlar cuando cargar el Rowset
    y en el metodo private void _init()...
    if (!getSessionBean1().getControlRowSet().equals(this.getClass().getName().toString())) {
    //cargo el rowset con el query necesario para mostrar todos los datos getSessionBean1().getSlx0013RowSet().setCommand("SELECT * FROM SLEX.SLX0013 WITH UR");
    }
    slx0013DataProvider.setCachedRowSet((javax.sql.rowset.CachedRowSet) getValue("#{SessionBean1.slx0013RowSet}"));

    despues de usar tu boton buscar, debes poner un boton que sea Mostrar Todos o algo asi, y cargas los datos que deseas, ya que solo se mostraran todos lo registros, si abandonas la pagina y vuelves a ingresar!

    espero haberte ayudado Saludos!

    ResponderEliminar

Hola amigo visitante, tu comentario es muy importante, trata de ser claro, y asegurarte que tus palabras sean moderadas!! gracias