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!!

09 junio 2009

Tabla con textfield editables

Muchas veces intente, tomar los valores de un textField incrustado a un tabla, pero siempre obtenia el valor del dataProvider...

bueno, en este post les diré el truquito para tomar esos valores... que pueden ser de cualquier componente... aunque no lo he probado con todos (solo texField y dropDonws), pero estoy casi seguro que si...

He aqui una imagen del resultado...



Entremos en materia...

Este ejemplo fue realizado con Netbeans 6.5 y GlassFish v2

lo primero que tienen que hacer es crear una nueva pagina JSP


luego arrastran un componente table, lo enlazan con un RowSet... puede ser cualquiera


una vez tengan lista esta parte, solo resta cambiar los componentes que por defecto coloca la tabla, en este caso staticText, lo cambian por textField, esto en las columnas que desea editar...


luego nos dirimos a la ficha Java (a el codigo java de la pagina en cuestion) y agregamos por cada columna editable dos propiedades, en este caso direccion y nDireccionMap de la sgte forma:


//direccion
public String getDireccion() {
    String dirTable = getValue("#{currentRow.value[\'CampoDataProvider\']}").toString();
    TableRowDataProvider rowData = (TableRowDataProvider) getBean("currentRow");
    if (rowData == null) {
        return dirTable;
    } else {
      String rowId = rowData.getTableRow().getRowId();
      String nDir = (String) this.getNDireccionMap().get(rowId);
      if (nDir == null) {
         return dirTable;
      } else {
        return nDir;
      }
    }
}

public void setDireccion(String valor) {
   TableRowDataProvider rowData = (TableRowDataProvider) getBean("currentRow");
   if (rowData != null) {
      String rowId = rowData.getTableRow().getRowId();
      this.getNDireccionMap().put(rowId, valor);
   }
}


//nDireccionMap
private Map nDireccionMap = new HashMap();

public Map getNDireccionMap() {
  return this.nDireccionMap;
}

public void setNDireccionMap(Map nDir) {
  this.nDireccionMap = nDir;
}



Ojo deben reemplazar la frase CampoDataProvider, por el nombre del campo del que tomaran el valor en el dataProvider, ose el valor a Editar.

Ej:


String nomCliente = getValue("#{currentRow.value[\'nombreCliente\']}").toString();

En este caso mi objetivo es retornar un String, pero pueden hacerlo con cualquier tipo, ya sea Int, Double, Boolean etc...

luego de haber agregado las variables necesarias en el codigo java, nos devolvemos a la vista de Diseño... nos dirigimos a la tabla que habiamos agregado anteriormente, le damos clic y pasamos a la ventana Navigator, seleccionamos el objeto correspondiente en este caso un textField, luego pasamos a la ventana Propiedades , buscamos la propiedad text...

le damos sobre los tres punticos [...] y nos aparece lo sgte:

Escogemos Use binding en la parte superior, y nos debe aparecer la variable que agregamos en codigo java, en este caso direccion, la seleccionamos y le damos en OK

Listo y con esto ya podemos acceder a lo valores que toma el textField....

Bueno se preguntaran, pero como tomo los valores??? jajaja no se preocupen ahora le muestro como hacerlo...

Despues de haber agregado los atributos de los objetos en cuestion, en este caso el tableRowGroup, ponemos un boton en el Jsp, y en el action del boton quedaria algo asi:
     public String button_action() {
        //Este caso deseo recorrer todo lo que esta en la tabla
        RowKey[] allRows = getTableRowGroup1().getRowKeys();
        for (int i = 0; i < allRows.length; i++) {
           RowKey rowKey = allRows[i];
           String direccion = ((String) this.nDireccionMap.get(rowKey.getRowId())).toString();
           info("El valor del Textfiel es: " + direccion);
        }
        return null;
     }
Bueno con esto habremos culminado... le dejo un ejemplo que he implementado en mis proyectos... es muy util ahorra mucho tiempo!!!

Amigos... se me olvidaba tambien pueden editar los valores del textField o del componente que usen, de la sgte forma:
public String button_action() {
    //Este caso deseo recorrer todo lo que esta en la tabla
    RowKey[] allRows = getTableRowGroup1().getRowKeys();
    for (int i = 0; i < allRows.length; i++) {
RowKey rowKey = allRows[i];
        //Editanto todos los textField de la tabla...
        this.nDireccionMap.put(rowKey.getRowId(),"Aqui el valor que quieran");
}
    return null;
}

Ahora les dejo una muestra en video de como funciona!!! Dejen sus comentarios, cualquier cosa con gusto les ayudaré. jejeje suerte...