martes, 3 de agosto de 2010

Grid en SwingX (Java)

Hola:

Después de unos cuantas dias sin tener alguna entrada en mi blog he decidido  hacer una sobre swing en este caso hay un api llamada swingx de swinglabs.

Paso 1. Crear un proyecto en netbeans con el nombre que mas les agrade (ejemplo: MiPrimeraAplicacion, es broma).


Paso 2 . Descargar el jar de swingx de este lugar http://swinglabs.org/  espero que funcione porque la mayor parte el servidor esta abajo, pero pueden buscarlo en google.
Paso 3 . Agregar los componentes de swingx a la papeleta de netbeans:
Despues de descargar los jars de swingx, los jars que necesitamos son los siguientes:
 - swingx-beaninfo-1.6.jar
 - swingx-1.6.jar
En la barra de herramientas de Netbeans nos dirigimos a la opción Tools/Palette/Swing and AWT Componets, como lo muestra la imagen de abajo.


Abrira una ventana llamada Palette Manager que es la encargada de adminitrar la Paleta, en esta damos clic al boton New Category y creamos una nueva categoria que se llama swingx.

Despues de dar clic en Ok nos creara un foldercito con el nombre de nuestra categoria llamada swingx, para agregar nuestros componentes de swingx seleccionamos nuestra categoria y damos clic en el boton Add  from Jar mostrara una ventana con el titulo Install Components to Palette, en esta ventana seleccionamos donde estan nuestros dos jars swingx-beaninfo-1.6.jar y swingx-1.6.jar.

Dar next y mostrara una panel donde tenemos que elegir los componentes que se agregaran a la paleta, elegimos en la opción de radio button Show Marked Java Beans


Damos nuevamente next, aparecera una otro panel en donde elegiremos la categoria que creamos anteriormente llamada swingx.



Por ultimo damos clic en boton Finish


Paso 4. Ahora en nuestro proyecto vamos a crear un JPanelForm, tenemos que ir New File/Swing GUI Forms/JPanelForm


Damos next y mostrara un panel donde le pondremos el nombre a nuestro JPanelForm para este ejemplo llamare a la clase JPanelGrid.

Despues de crear la clase JPanelGrid damos doble clic sobre ella y nos abrira el panel en modo diseño, tambien tiene un boton para ver el codigo fuente, del lado derecho esta la Palette con nuestra categoria llamada swingx, en esta se encuentra nuestra JXTable que ocuparemos para este ejemplo, para colocarla en nuestra panel solo debemos arrastrar y soltar y el componente en nuestro panel.





Hasta este punto ya tenemos un grid de swingx pero hace falta agragar datos y tambien crear su main, eso sera parte 2.

Dedicado a mi princesita.

jueves, 24 de junio de 2010

JQuery ui

Hola:

JQuery es mi framework favorito  para el desarrollo de paginas web interactivas, ademas de tener exelentes herramientas en su web, en esta entrada les mostrare como usar JQuery ui el cual pueden personalizar desde este sitio http://jqueryui.com/themeroller/.

Paso 1. Configurar nuestro theme en con las opciones que están en las pestañas y despues dar click en download theme.


Después se mostrara una pagina como la siguiente  den click en download , seleccionen todas las opciones. 


 Descomprimir el zip con nombre jquery-ui-1.8.2.custom, tendrá los siguientes archivos. 


Paso 2. Creamos un archivo html llamado prueba.html y otro dentro de la carpeta css que se llame prueba.css

Codigo de prueba.html:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>jQuery UI Example Page</title>
        <link type="text/css" href="css/le-frog/jquery-ui-1.8.2.custom.css" rel="stylesheet" />   
        <link type="text/css" href="css/prueba.css" rel="stylesheet" />   
        <script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
        <script type="text/javascript" src="js/jquery-ui-1.8.2.custom.min.js"></script>

</head>
    <body>

<div id="ui_contededor" class="ui-widget">


<div id="ui_1"  class="ui_1">
    <h3 class="ui-widget-header ui-corner-all">Widget</h3>
    <div class="ui-widget-content ui-corner-top">
        <a>Prueba</a>
    </div>
</div>

<div id="espacio" class="espacio"></div>

<div id="ui_2"  class="ui_2">
    <h3 class="ui-widget-header ui-corner-all">Widget</h3>
    <div class="ui-widget-content ui-corner-top">
    <a>Prueba</a>       
   
</div>

</div>
</div>


</body>
</html>

Codigo de prueba.css

body{ font: 62.5% "Trebuchet MS", sans-serif; margin: 50px;}

.espacio{
padding: 4px;
width: 1%;
margin-left: 2px;
float: left;
}


.ui_1{
float: left;
width: 400px;
}

.ui_2{
float: left;
width: 400px;
}


Salida:

En este link ahi mas información sobre css y themes de jquery.

En este ejemplo creamos dos widgets por medio de dos div  la manera de como se logra esto es por medio de los css, ejemplo: para poner en encabezado ocupamos lo siguiente
<h3 class="ui-widget-header ui-corner-all">Widget</h3>
y para el contenido:
<div class="ui-widget-content ui-corner-top">
Pero podemos empezar a jugar con los css de jquery algunos son los siguientes:


Widget Containers

.ui-widget: Crea un contenedor de Widgets (Aplica estilos css)

.ui-widget-header: Crea un encabezado de un widget  (Aplica estilos css)

.ui-widget-content: Aplica estilos al contenido del widget

 

Misc Visuals


Corner Radius helpers (Estilos de bordes)

  • .ui-corner-tl: Applies corner-radius to top left corner of element.
  • .ui-corner-tr: Applies corner-radius to top right corner of element.
  • .ui-corner-bl: Applies corner-radius to bottom left corner of element.
  • .ui-corner-br: Applies corner-radius to bottom right corner of element.
  • .ui-corner-top: Applies corner-radius to both top corners of element.
  • .ui-corner-bottom: Applies corner-radius to both bottom corners of element.
  • .ui-corner-right: Applies corner-radius to both right corners of element.
  • .ui-corner-left: Applies corner-radius to both left corners of element.
  • .ui-corner-all: Applies corner-radius to all 4 corners of element.

 En nuestro ejemplo el contenido solo tiene borde redondeado en la parte de arriba, pero si queremos que tenga solo del lado derecho, solo es cuestion de ocupar el estilo correspondiente ejemplo:

 <div id="ui_1"  class="ui_1">
    <h3 class="ui-widget-header ui-corner-right">Widget</h3>
    <div class="ui-widget-content ui-corner-top">
        <a>Prueba</a>
        <a>Prueba</a>
    </div>
</div>

 Con el nuevo estilo el encabezado tiene borde redondeado solo a la derecha, es fácil y rápido.








miércoles, 16 de junio de 2010

Verano 2000

Una vez más aquella piscina, aun espera...

Nunca es bastante de aquello, nunca es suficiente...

Cuando papa corrió y me dijo yo podía...

Que aun intentando de todas maneras tendría que funcionar así, como el espacio vacío, de aquel corazón lleno de odio, dime que esta vez no fuiste, ve a casa, y de todas maneras se que esta vez todo saldrá bien, que aquella vez que solía estar mojado, y preocupado, sobre aquella estupidez de aquel verano, tú lo sabes y el también; dime que aun te acuerdas de aquel parque cuando ella corrió, de alguna extraña razón sus ojos verdes te hacían sentir bien, su lindo cabello en fin, yo pude haber llegado a casa noche, pero sin saber porque somos tan perfectos amigos, se que alguna vez te hice sentir el más estúpido, pero sé que tu cuentas historias de mi, al igual que yo, porque después de 8 largos años me doy cuento, que no necesito recordarte , créeme, porque ya eres parte de mi vida, en fin un buen día descubriremos que todo ha pasado; por todo lo hemos estado angustiado a concluido, que aquella pelea era de amigos, sabes que me va gusto ser tu amigo...

Te acuerdas de aquella pekora que me hizo llorar hace tiempo, aquella que solía ser como un fantasma, o de aquellos tres imaginarios chicos que nunca nadie pensó de que podían lograr algo , que alguna vez platicamos por una noche entera en aquella camioneta de todo que sería de nosotros, sin darnos cuenta que estamos haciendo nuestro destino...

Aquella grabadora nostálgica tocando aun la canción de los smashing pumkins, aquel agujero esperando,…

Aun la llamado telefónica mía

-Cómo te llamas amigo

-Isaac

-Que rola te gustaría escuchar

-Pues no lo sé una de placebo, ohhh... de...mmmm...radiohead...

-Muy buenas bandas, pero cual te gustaría escuchar

-bueno ya se una de los deftones...

O mejor aun esperando por días para justamente el sábado fuera el cumpleaños de ella y papa no me dejara ir

Creo que si me perdí un par fiestas, aun enojado prendía la t.v y aquel especial de Mc de radiohead para

Variar...que riza...

Para llegar el lunes a la escuela y enterarme de todas las babosadas que hicieron sin mi...

O mejor aun encerrado el ropero con ella, dime que no te acuerdas de todas las estupideces que hacíamos juntos

, aquel ropero oscuro lleno de alegría...

Para mis mejores amigos…gracias totales

(Lo puse como entrada en Live hace un par de años dedicado especialmente a mi amigo Miguel Angel Ordoñez(Alvin), Raul Cardenaz Vasquez, La Vaca(Baltazar), Andrea, Cesar, Judith, Lucia, Luis Bacilio y a mi princesita)

lunes, 17 de mayo de 2010

Archivo de properties en Java (Proyecto Isaacrobot parte I)

Hola:

Por lo regular en nuestros proyectos tenemos la necesidad de crear variables que quizas en algún momento puedan llegar a cambiar y no seria óptimo tenerlas en una base de datos, para esto java creo un tipo de archivos llamados ejemplo.properties en los cuales se pueden manejar propiedades y valores.

El código es el siguiente:


import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;


/**
*
* @author mew
*/
public class FileProperties {

private Properties properties;

public void loadFileProperties(String name){

properties = new Properties();
try {
properties.load(this.getClass().getResource(name+".properties").openStream());
} catch (IOException e) {
e.printStackTrace();
}
}

public String getProperty(String property){
String property_= "";
property_ = properties.getProperty(property);
property_=(property_!=null)?property_:"";

return property_;
}

public static void main(String[] args) throws FileNotFoundException {

FileProperties properties = new FileProperties();
properties.loadFileProperties("baseDeDatos");
System.out.println(""+properties.getProperty("port"));


}


El archivo de properties debe de estar en la misma ruta donde esta esta clase:
para este ejemplo seria algo como esto baseDeDatos.properties y tendria lo siguiente:

host=localhost
port=1521
sid=prueba
user=prueba
password=1234567

La salida sera algo como esto:
1521

martes, 11 de mayo de 2010

Música para despertar dragones (Cortometraje)

Hola:

Música para despertar dragones es el primer cortometraje en que tengo participación, la verdad fue una experiencia bien chida y no la cambiaría por nada, la historia luego la contare, pero primero nombre la lista de los que participamos.

Directores : Carlos (Mi primo) y Bernardo
Guión: Bernardo
Reparto :
Cindy, Alicia, Luisa y Erick
Camarógrafo: Jorge Ortega .
Ayudantes en general: Lupita, Fito, Fo, Arien, Lalo ,Vicente y yo.
Locación: Hacienda la esperanza (Tlachaloya Edo de Méx).





miércoles, 5 de mayo de 2010

Obtener día, mes y año de una fecha en java con Date y Calendar

Hola:

Este en un ejemplo de una clase Java que puede servir para no usar lo siguiente:

       DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        Date date = null;


        try {
            date = formatter.parse(fecha);
        } catch (ParseException ex) {
            Logger.getLogger(ImpuestoEstadoDeMexico.class.getName()).log(Level.SEVERE, null, ex);
        }

       
        date.getDay();
        date.getMonth();
        date.getYear();

Estos métodos ya son obsoletos para las versiones mayores a la JDK 1.1 y por eso se recomienda el uso de Calendar.

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author mew
 */
public class Fecha {

    private String fecha;
    private int dia;
    private int mes;
    private int anio;

    public int getAnio() {
        return anio;
    }

    public void setAnio(int anio) {
        this.anio = anio;
    }

    public int getDia() {
        return dia;
    }

    public void setDia(int dia) {
        this.dia = dia;
    }

    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {

        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        Date date = null;


        try {
            date = formatter.parse(fecha);
        } catch (ParseException ex) {
            Logger.getLogger(ImpuestoEstadoDeMexico.class.getName()).log(Level.SEVERE, null, ex);
        }



        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);


        int anio_ = calendar.get(Calendar.YEAR);
        int mes_ = calendar.get(Calendar.MONTH)+1;
        int dia_ = calendar.get(Calendar.DAY_OF_MONTH);

        this.setAnio(anio_);
        this.setDia(dia_);
        this.setMes(mes_);

        this.fecha = fecha;
    }

    public int getMes() {
        return mes;
    }

    public void setMes(int mes) {
        this.mes = mes;
    }


    public static void main(String[] args) {
        Fecha fecha = new Fecha();
        fecha.setFecha("28/03/2010");
        System.out.println(fecha.getAnio()+" "+fecha.getMes()+" "+fecha.getDia());
    }


}
La salia sera algo como lo siguiente:

2010 3 28

Esta es la aportación de para el blog:

// Objeto grafico
JCalendarCombo calendarCombo = new JCalendarCombo();
calendarCombo.setBounds(210, 102, 172, 20);
add(calendarCombo);

// Formateando la fecha para que le guste a mySQL
Calendar calendario = calendarCombo.getCalendar();
String fecha = calendario.get(calendario.YEAR) + "-"
+ (calendario.get(calendario.MONTH) + 1) + "-"
+ calendario.get(calendario.DAY_OF_MONTH);


lunes, 12 de abril de 2010

Leer un PDF con PDFBox


Hace poco tiempo me tope con la necesidad de leer pdf's desde un servidor para obtener el texto del pdf y sus propiedades, por lo que tuve que investigar con que herramientas podría leer un pdf para convertirlo en un String y después manipular el contenido para obtener solo el texto que me interesaba, me tope con un muy buen blog el cual te explica como hacerlo con PDFBox a mi parecer esta muy entendible y me sirvió para mi propósito, lo único que hice fue modificarlo un poco:
este es el link del blog que mencione anteriormente: http://noelia-java.blogspot.com/2009/07/leer-pdf-desde-java.html

Estas son las clases que genere yo:


/**
*
* @author nany
*/
public class EntidadPDF {
private String titulo;
private String autor;
private int numeroDePaginas;
private String tema;
private String palabrasClave;
private String creador;
private String productor;
private String contenido;//el contenido completo del documento

public String getAutor() {
return autor;
}

public void setAutor(String autor) {
this.autor = autor;
}

public String getContenido() {
return contenido;
}

public void setContenido(String contenido) {
this.contenido = contenido;
}

public String getCreador() {
return creador;
}

public void setCreador(String creador) {
this.creador = creador;
}

public int getNumeroDePaginas() {
return numeroDePaginas;
}

public void setNumeroDePaginas(int numeroDePaginas) {
this.numeroDePaginas = numeroDePaginas;
}


public String getPalabrasClave() {
return palabrasClave;
}

public void setPalabrasClave(String palabrasClave) {
this.palabrasClave = palabrasClave;
}

public String getProductor() {
return productor;
}

public void setProductor(String productor) {
this.productor = productor;
}


public String getTema() {
return tema;
}

public void setTema(String tema) {
this.tema = tema;
}

public String getTitulo() {
return titulo;
}

public void setTitulo(String titulo) {
this.titulo = titulo;
}

}


El método que leera el pdf dada una url esta contenido en al siguiente clase

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentInformation;
import org.pdfbox.util.PDFTextStripper;

/**
*
* @author nany
*/
public class ContenedorPDF {

private FileInputStream file = null;
private PDDocument document = null;

/**
* Abre el archivo especificado en la ruta para generar un objeto de tipo EntidadPDF
* @param archivo
* @return
* @throws org.pdfbox.exceptions.CryptographyException
* @throws org.pdfbox.exceptions.InvalidPasswordException
*/
public EntidadPDF convertirAModelo(String archivo) {
EntidadPDF entPdf = new EntidadPDF();
try {

//leemos el pdf del articulo lo efectivo
URL url = new URL(archivo);
InputStream is = url.openStream();

PDFParser parser = new PDFParser(is);

parser.parse();
document = parser.getPDDocument();

//Obtenemos todo el contenido del pdf
PDFTextStripper stripper = new PDFTextStripper();
entPdf.setContenido(stripper.getText(document));


//obtenemos la informacion de las propiedades del pdf
PDDocumentInformation info = document.getDocumentInformation();

entPdf.setTitulo(info.getTitle());
entPdf.setAutor(info.getAuthor());
entPdf.setNumeroDePaginas(document.getNumberOfPages());
entPdf.setTema(info.getSubject());
entPdf.setPalabrasClave(info.getKeywords());
entPdf.setCreador(info.getCreator());
entPdf.setProductor(info.getProducer());


} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {//no se pudo abrir el archivo
e.printStackTrace();
} finally {
if (file != null) {
try {
file.close();
} catch (IOException e) {//no se pudo cerrar el archivo
e.printStackTrace();
}
}
if (document != null) {
try {
document.close();
} catch (IOException e) {//no se pudo cerrar el documento
e.printStackTrace();
}
}
}

return entPdf;
}


}

Bien espero y le sea de ayuda, le dejo otro link de otras librerías que permiten la manipulación del pdf
http://www.qoppa.com/Enlace

viernes, 9 de abril de 2010

Seleccionar un parte especifica de un String en Java con Scanner

Hola:

Muchas veses cuando desarrollamos sistemas nos topamos con problemitos como el siguiente:

Queremos extraer los caracteres o fracmentos en rojo de un String como este:
2o. Marzo-Abril

Seria una buena idea hacerlo con StringTokenizer pero tambien hay otra manera sensilla y elegante para hacerlo, solo tenemos que saber algo de expresiones, por ejemplo

para el caracter 2 bien podria ser un 3,4,5,6... por lo tanto la expresion para esta seria que siempre este caracter es un digito \d esta es la expresion para un digito

Marzo y Abril bien podrian ser Enero y Febrero, por lo tanto sabremos que siempre con palabras, me refiero que puede ser [a-z] y [A-Z], aqui se puede ocupar mas de una expresion pero para este ejemplo ocuparemos \w

Por lo tanto nuestra expresion completa seria esta:

String input = "2o. Marzo-Abril";
String expr="(\\d)o.\\s(\\w+)-(\\w+)";

Los parentesis son porque queremos obtener tres grupos que cumplan con la expresion que esta dentro de ellos.

String input = "2o. Marzo-Abril";
String expr="(\\d)o.\\s(\\w+)-(\\w+)";


Scanner s = new Scanner(input);
s.findInLine(expr);
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(i+" "+result.group(i));
s.close();

El resultado seria este:

1 2
2 Marzo
3 Abril


Pero que pasaria si el input fuera este:

String input = "40o. Marzo-Abril";

1 0
2 Marzo
3 Abril

en el grupo 1 obtenemos el 0 pero nosotros esperariamos un 40, pero es logico
puesto que nuestre expresion solo es \d que espera solo una posicion de un digito, para que sean varios necesitariamos \d+

String input = "40o. Marzo-Abril";
String expr="(\\d+)o.\\s(\\w+)-(\\w+)";


Scanner s = new Scanner(input);
s.findInLine(expr);
MatchResult result = s.match();
for (int i=1; i<=result.groupCount(); i++)
System.out.println(i+" "+result.group(i));
s.close();


Resultados:
1 40
2 Marzo
3 Abril

Saludos.



miércoles, 3 de marzo de 2010

PL SQL ARRAY (Oracle sqlDeveloper)

Hola:

En esta entrada me gustaría compartir lo poco que se de PL SQL, que desde el día de hot voy aprender, enseñare el uso de Array o arreglos que son como tablas temporales creadas al momento de ejecutar el PL SQL.
------------------------------------------------
DECLARE

TYPE array_enteros IS TABLE OF NUMBER;
Un_array array_enteros := array_enteros (10102, 10127, 10122, 10104, 10105 ,10106, 10107 ,10108 , 10109 ,10114 ,10110, 10124 ,10125 ,10112 ,10113, 10116 , 10123 ,10115 , 10117 , 10118 ,10119 , 10121 ,10120 , 10128, 10129, 10130);

BEGIN

FOR i IN Un_array.FIRST..Un_array.LAST
LOOP
dbms_output.put_line('elemento '||Un_array(i));
end loop;


EXCEPTION
/*Parte de excepciones*/
WHEN OTHERS THEN
dbms_output.put_line('Se ha producido un error');

END;
-----------------------------------------------------

Para mostrar los datos en sql Developer se tiene que hacer lo siguiente:

Seleccionar el codigo del PL SQL en el editor.


Después para mostrar los datos hacemos lo siguiente: En las pestañas de abajo hay varias opciones vamos ala que dice Salida de DBMS, despues activamos la salida DBMS como se muestra en la imagen.




Después ejecutamos el bloque SQL y vamos nuevamente ala pestaña de Salida de DBMS, y nuestros datos ya están en la salida.

martes, 2 de marzo de 2010

Gwt Rcp, parte II (Grid Gwt-Ext)



Parte I. (Recomendable)

Hola, lo prometido es deuda, para esta entrada lo primero que necesitamos saber es sobre un formato para el intercambio de datos llamado JSON , no entrare en detalles ni en discusiones si es mejor que el xml, quizás ese sea una entrada para mi blog, para entender como este formato de datos y como se trabaja con java ya hay un API que te permite convertir un Objeto java a un objeto JSON y el link es el siguiente: http://blog.pontt.com/json-con-java/introduccion-java-y-json-primera-parte-con-ejemplo/ una entendido el ejemplo y descargo la API vamos a ver el formato JSON que recibirá nuestro grid de GWT-EXT.
{"totalCount":N, "data":[ {"atributo1"=valor1,..},{},{},......,
{
"atributoN"=valorN,..
} ]}






El diagrama muestra la colaboración de clases Java necesarias para llenar los con datos un grid.

Este el formato general que recibe un grid de Gwt-Ext para funcionar, desde luego que hay mas atributos pero eso los veremos después.

Una vez definido lo que tenemos que hacer pasaremos a recordar como estaba configurado el proyecto.


Paso 1. Crear la clase que va convertor nuestra modelo o objetos Json's con la ayuda de gson(API), para esto crearemos un paquete llamado json en org.aplication.json y otro org.aplication.datagrid

Creamos un Bean llamado DataGridUsuario dentro de org.aplication.datagrid

------------------------------------------------------
package org.aplication.datagrid;

import java.util.List;
import org.aplication.client.modelo.Usuario;

/**
*
* @author mew
*/
public class DataGridUsuario {

private String totalCount;
private List data;

public List getData() {
return data;
}

public void setData(List data) {
this.data = data;
}

public String getTotalCount() {
return totalCount;
}

public void setTotalCount(String totalCount) {
this.totalCount = totalCount;
}



}

-----------------------------------------------------

Creamos la clase JsonUsuario, debemos de agregar la libreria de gson al proyecto.

-----------------------------------------------------
package org.aplication.json;

import com.google.gson.Gson;
import org.aplication.datagrid.DataGridUsuario;
import org.aplication.server.servicio.GWTServiceUserImpl;

/**
*
* @author mew
*/
public class JsonUsuario {

public String getJsonDataGridUsuarios(){
String jsonOutput ="";

if(GWTServiceUserImpl.usuarios!=null){
DataGridUsuario dataGridUsuario = new DataGridUsuario();
dataGridUsuario.setTotalCount(GWTServiceUserImpl.usuarios.size()+"");
dataGridUsuario.setData(GWTServiceUserImpl.usuarios);
Gson gson = new Gson();
jsonOutput = gson.toJson(dataGridUsuario);
}


return jsonOutput;
}

}

---------------------------------------------------------------

Paso 2. Crear un jsp que va a servir como especia de Web Service entre nuetra aplicación y el cliente (Grid).

Por nombre tendra: dataJson.jsp
-------------------------------------------------------------------
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="org.aplication.json.JsonUsuario" %>
<% JsonUsuario jsonUsuario = new JsonUsuario(); out.clear(); out.print(jsonUsuario.getJsonDataGridUsuarios()); %>
------------------------------------------------------------------

El proyecto hasta aqui debe estar parecido a este:



Paso 3. Probar la aplicación: Den run a proyecto

Creamos un par de usuarios.

Ejemplo:


Usuario 1:


Usuario 2:

Usuario N..................

Para comprobar que el Json y el WebService responde bien lo probaremos antes de llamarlo con el grid:

http://localhost:41846/WebGwtRcp/dataJson.jsp

-------------------------------------------------------
{"totalCount":"5","data":[{"nombre":"pruena","apellido":"dsfsf","edad":10,"cve":1},{"nombre":"pruena","apellido":"dsfsf","edad":10,"cve":2},{"nombre":"pruena","apellido":"dsfsf","edad":10,"cve":3},{"nombre":"Nancy","apellido":"Mondragon","edad":25,"cve":4},{"nombre":"Pedro","apellido":"Perez","edad":12,"cve":5}]}
----------------------------------------------------------------------


Paso 4. Crear la GUI para el grid y el manejo de eventos sobre los datos del grid, como podemos notar nosotros no queremos mostrar quizas la cve del usuario, quizas solo querramos el nombre y apellido, cve!=password para este ejemplo la cve es una secuencia pero quizas en una aplicación mas en forma podria ser la pk de una tabla de la base de datos.


Paso 5. CREACION DEL GRID DE GWT-EXT

Bueno tenemos que reemplazar el codigo de estas clases con el codigo siguiente posteriromente explicare como funciona cada clase que ocupa el grid.


org.aplication.client en este paquete reemplazar la clase MainEntryPoint por lo siguiente codigo:
----------------------------------------------------------------

package org.aplication.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.ClickListener;
import org.aplication.client.view.GuiUsuario;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.data.*;
import com.gwtext.client.widgets.Panel;
import com.gwtext.client.widgets.grid.ColumnConfig;
import com.gwtext.client.widgets.grid.ColumnModel;
import com.gwtext.client.widgets.grid.GridPanel;

/**
* Main entry point.
*
* @author isaac
*/
public class MainEntryPoint implements EntryPoint {


private Panel formPanel;
private static GridPanel grid;
private static Store store;
private static ColumnModel columnModel;
private static HttpProxy dataProxy;
private static RecordDef recordDef;
private static JsonReader reader;

/**
* Creates a new instance of MainEntryPoint
*/
public MainEntryPoint() {
}

/**
* The entry point method, called automatically by loading a module
* that declares an implementing class as an entry-point
*/
public void onModuleLoad() {

final Button button = new Button("New User");

button.addClickListener(new ClickListener() {

public void onClick(Widget w) {
GuiUsuario guiUsuario = new GuiUsuario();
Window winUsu = guiUsuario.getWindow();
winUsu.show();
}
});





RootPanel.get().add(getFormPanel());
RootPanel.get().add(button);

}

public Panel getFormPanel() {


formPanel = new Panel();
formPanel.setId("idGrid");
formPanel.setFrame(false);
formPanel.setBorder(false);
formPanel.setTitle("Usuario");

dataProxy = new HttpProxy("dataJson.jsp");
recordDef = new RecordDef(new FieldDef[]{
new StringFieldDef("nombre", "nombre"),
new StringFieldDef("apellido", "apellido"),
new StringFieldDef("edad", "edad"),
new IntegerFieldDef("cve", "cve")
});
reader = new JsonReader(recordDef);
reader.setRoot("data");
reader.setTotalProperty("totalCount");

store = new Store(dataProxy, reader, true);
store.load();

columnModel = new ColumnModel(new ColumnConfig[]{
new ColumnConfig("nombre", "nombre", 100, true),
new ColumnConfig("apellido", "apellido", 75, true)
});

grid = new GridPanel();
grid.setStore(store);
grid.setColumnModel(columnModel);
grid.setWidth(375);
grid.setHeight(350);
grid.setTitle("Json Grid");
grid.setFrame(true);
grid.stripeRows(true);
grid.setIconCls("grid-icon");


//grid.reconfigure(store, columnModel);

formPanel.add(grid);

return formPanel;
}

public static void reloadDatosGrid(){
reader = new JsonReader(recordDef);
reader.setRoot("data");
reader.setTotalProperty("totalCount");

store = new Store(dataProxy, reader, true);
store.load();
grid.reconfigure(store,columnModel);
}

}


----------------------------------------------------
En el paquete org.aplication.client.view reeplazar la clase GuiUsuario por lo siguiente:

----------------------------------------------------


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

package org.aplication.client.view;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Position;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.TextField;
import org.aplication.client.MainEntryPoint;
import org.aplication.client.modelo.Usuario;
import org.aplication.client.servicio.GWTServiceUser;
import org.aplication.client.servicio.GWTServiceUserAsync;

/**
*
* @author isaac
*/
public class GuiUsuario {

private Usuario usuario;
private Window window;
private FormPanel formPanel;
private TextField nombre;
private TextField apellido;
private TextField edad;
private static GWTServiceUserAsync service;

public FormPanel getFormPanel() {


formPanel = new FormPanel();
formPanel.setFrame(true);
formPanel.setTitle("Usuario");
nombre = new TextField("Nombre", "nombre", 230);
apellido = new TextField("Apellido", "apellido", 230);
edad = new TextField("Edad", "edad", 230);
formPanel.add(nombre);
formPanel.add(apellido);
formPanel.add(edad);


return formPanel;
}

public Usuario getUsuario() {
return usuario;
}

public Window getWindow() {

window = new Window();
window.setTitle("Layout Window");
window.setClosable(true);
window.setWidth(600);
window.setHeight(350);
window.setPlain(true);
window.setCloseAction(Window.HIDE);
window.add(getFormPanel());

Button buttonNewUser = new Button("Nuevo Usuario");
buttonNewUser.addListener(new ButtonListenerAdapter(){

@Override
public void onClick(Button button, EventObject e) {
Usuario u = new Usuario();
u.setEdad(Integer.parseInt(edad.getText()));
u.setNombre(nombre.getText());
u.setApellido(apellido.getText());

insertaUsuario(u);

}

}
);


window.setButtonAlign(Position.CENTER);
window.addButton(buttonNewUser);



return window;
}

public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}



public void insertaUsuario(Usuario usuario) {


// Create an asynchronous callback to handle the result.
final AsyncCallback callback = new AsyncCallback() {

public void onSuccess(Object result) {
String respuesta = (String) result;

MessageBox.alert(respuesta);
MainEntryPoint.reloadDatosGrid();

}

public void onFailure(Throwable caught) {
MessageBox.alert("Error " + caught);
}
};

getService().nuevoUsuario(usuario, callback);

}


public static GWTServiceUserAsync getService() {
service = (GWTServiceUserAsync) GWT.create(GWTServiceUser.class);
ServiceDefTarget endpoint = (ServiceDefTarget) service;
String moduleRelativeURL = GWT.getModuleBaseURL() + "servicio/gwtserviceuser";
endpoint.setServiceEntryPoint(moduleRelativeURL);
return service;
}



}


--------------------------------------------------------------------

Paso final run al proyecto.

---------------------------------------------
Podemos ver que la primera vez que que se llama al la clase MainEntryPoint hace una peticion a nuestro webservice (http://localhost:41846/WebGwtRcp/dataJson.jsp?_dc=1267849099045) y tiene un parametro que fue concatenado por new HttpProxy("dataJson.jsp"); es que quien hace la petición a nuestro jsp, pero como nuestra lista ( public static List usuarios) de la clase GWTServiceUserImpl esta en null no responde con nada.




Cuando damos click en en new user aparece nuesta GUI que crea los usuarios, llenamos los campos a damos la click en el boton usuario nuevo, notamos que aparece un letrero que dice que se a creado el usuario en la parte de atras se puede ver que el grid ya tiene el dato insertado.

¿Como se logro esto?

Respuesta 1. Con magia.
Respuesta 2. La computara piensa.
Respuesta 3. Quien sabe no me importa, mientras funcione.

Si tu respuesta fue alguna de las anteriores hasta aqui termino la parte de mostrar los datos en el grid si no en la semana explicare paso a paso como funciona cada componente.

Dedicado a mi princesita, porfavor perdoname por ser un moustruo, no fue mi intencion herirte, te amo.

miércoles, 17 de febrero de 2010

Ordenar elementos de List en java con Collections.sort

Hola:

Todos alguna vez nos topados con ordenar elementos de una List de java (java.util.List) yo se que muchos van a decir que se podria hacer con la base de datos agregando un order by campo_de_tbl, pero muchas aplicaciones no lo requieren y para lograr esto ocuparemos java.util.Comparator.

Paso 1. Crear un bean, para fines prácticos todos los atributos serán String :

public class Concepto {

private String id;
private String cve;
private String descripcion;
private String valor;


public String getValor() {
return valor;
}
public void setValor(String valor) {
this.valor = valor;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCve() {
return cve;
}
public void setCve(String cve) {
this.cve = cve;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}



}

Supongamos que queremos ordenas nuestros datos de nuestra List atravez del atributo cve.

Paso 2. Crear la clase que ConceptoComparator que implementa la interfaz Comparator

import java.util.Comparator;


public class ConceptoComparator implements Comparator{

public int compare(Object arg0, Object arg1) {
Concepto conA = (Concepto) arg0;
Concepto conB=(Concepto)arg1;

Long cveConA = Long.parseLong(conA.getCve());
Long cveConB = Long.parseLong(conB.getCve());

if(cveConA < cveConB)
return -1;

else
if (cveConA > cveConB)
return 1;


return 0;
// TODO Auto-generated method stub

}

}

java.util.Comparator int compare(T a, T b) compara dos objetos y proporciona un valor negativo si a va antes que b, cero si se consideran idénticos en el orden de clasificación, y un valor positivo si a va después de b.

Paso 3 : llamar al metodo Collections.sort(...)

List conceptos = new ArrayList();

Concepto con1 = new Concepto();
con1.setCve("10017");

Concepto con2 = new Concepto();
con2.setCve("20001");

Concepto con3 = new Concepto();
con3.setCve("10001");

conceptos.add(con1);
conceptos.add(con2);
conceptos.add(con3);
System.out.println("sin ordenar ");

for(Concepto con : conceptos){
System.out.println(" "+con.getCve());
}

Collections.sort(conceptos, new ConceptoComparator());

System.out.println("ordenados ");
for(Concepto con : conceptos){
System.out.println(" "+con.getCve());
}


el resultado sera algo como esto:
sin ordenar
10017
20001
10001
ordenados
10001
10017
20001

martes, 2 de febrero de 2010

Md5 en java (java.security.MessageDigest)

Hola aquí pongo un código que estaba buscando hace tiempo ocupando la API (java.security.MessageDigest) de java para encriptar una cadena.

----------------------


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Md5 {

private MessageDigest alg;
private String md5;


/**
*
* @param mensaje
* @throws NoSuchAlgorithmException
*/

public void md5(String mensaje) throws NoSuchAlgorithmException{
alg = MessageDigest.getInstance("MD5");//implementa el algoritmo especificado
byte[] bytes = mensaje.getBytes();
computeDigest(bytes);
}


public String getMd5() {
return md5;
}


public void setMd5(String md5) {
this.md5 = md5;
}
/**
* Realiza la digestion del algoritmo MD5
* @param bytes
*/

public void computeDigest(byte[] bytes){
String cad="";
alg.reset();//restaura el resumen
alg.update(bytes);//actualiza el resumen, empleando los bytes especificados
byte[] hash = alg.digest();//completa el calculo del codigo de dispersivo
for(int i = 0; i < hash.length;i++){
int v = hash[i] & 0xFF;
if(v < 16) cad+="0";
cad+=Integer.toString(v,16).toUpperCase()+"";
}

this.setMd5(cad);
}


}

----------------------------------------------------

La manera de ocupar la clase seria la siguiente:

Md5 md5 = new Md5();
md5.md5("Hola mundo");
String md5String = md5.getMd5();
System.out.print(" md5 "+md5String);

lunes, 1 de febrero de 2010

RCP en Gwt (Netbeans gwt-ext)

Hola:

Para esta entrada es necesario que tengan configurado previamente un proyecto con gwt en Netbeans y también configurado en plugin de gwt-ext (jar).

Primero me gustaría hablar de las ventajas de Gwt y después hablar de las desventajas.

- Todo lo programas en Back End, lo que quiere decir que no tienes que aprender forzosamente html, css, javaScript solo tienes que saber java, el Front End lo programas en Back End aunque suene extraño asi es, el compilador de gwt se encarga de generar un codigo optimo en js para tu aplicación.

- La manera de hacer peticiones asíncronas se hacen de manera rápida por medio de RCP.

- La curva de aprendizaje es rápida.

- Las aplicaciones funcionan en la mayoría de los navegadores (IE,Firefox).

Bueno después de esta breve introducción vamos a crear una aplicación que de administre usuarios un CRUD.

Paso 1: Como siempre crear un bean que es parte del modelo para este ejemplo se llamara el clásico usuario, es muy importante que lo coloquen en el paquete donde van a poner su Gwt Modulo.

Para nuestro ejemplo tendremos que crear nuestro paquete del modelo y view al nivel de: org.aplication.client donde va todo en codigo que se convierte en Front End.

Despues creamos un clase de llamada Usuario dentro del paquete org.aplication.client.modelo


Creamos una clase llamada Usuario.

package org.aplication.client.modelo;

import com.google.gwt.user.client.rpc.IsSerializable;

/**
*
* @author isaac
*/
public class Usuario implements IsSerializable{

private String nombre;
private String apellido;
private int edad;
private int cve;

public String getApellido() {
return apellido;
}

public void setApellido(String apellido) {
this.apellido = apellido;
}

public int getCve() {
return cve;
}

public void setCve(int cve) {
this.cve = cve;
}

public int getEdad() {
return edad;
}

public void setEdad(int edad) {
this.edad = edad;
}

public String getNombre() {
return nombre;
}

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



}

Esta clase implementa IsSerializable de gwt que es la que encargara de serializar nuestra clase y permite la comunicación entre en cliente y el servidor.

Paso 2. Creamos un paquete llamado view (org.aplication.client.view) y una clase llamada GuiUsuario, el diagrama de clase Uml para esta clase sera mas o menos como este aunque despues iremos agregando mas metodos o clases.



Bueno primero crearemos nuestro formulario y despues nuestro rcp.


package org.aplication.client.view;

import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Position;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.TextField;
import org.aplication.client.modelo.Usuario;

/**
*
* @author isaac
*/
public class GuiUsuario {

private Usuario usuario;
private Window window;
private FormPanel formPanel;
private TextField nombre;
private TextField apellido;
private TextField edad;

public FormPanel getFormPanel() {
formPanel = new FormPanel();
formPanel.setFrame(true);
formPanel.setTitle("Usuario");
nombre = new TextField("Nombre", "nombre", 230);
apellido = new TextField("Apellido", "apellido", 230);
edad = new TextField("Edad", "edad", 230);
formPanel.add(nombre);
formPanel.add(apellido);
formPanel.add(edad);
return formPanel;

}

public Usuario getUsuario() {
return usuario;
}
public Window getWindow() {
window = new Window();
window.setTitle("Layout Window");
window.setClosable(true);
window.setWidth(600);
window.setHeight(350);
window.setPlain(true);
window.setCloseAction(Window.HIDE);
window.add(getFormPanel());

Button buttonNewUser = new Button("Nuevo Usuario"); buttonNewUser.addListener(new ButtonListenerAdapter(){
@Override public void onClick(Button button, EventObject e) {

MessageBox.alert("prueba de evento");


}
} ); window.setButtonAlign(Position.CENTER);
window.addButton(buttonNewUser); return window; }

public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}



}

El metodo getWindow() se encarga de crear la ventana y tambien de crear el FormPanel por medio del metodo getFormPanel(), despues solo hace falta llamar a nuestra Gui desde el EntryPoint que sera la clase MainEntryPoint que esta en el paquete org.aplication.client.


package org.aplication.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.ClickListener;
import com.gwtext.client.widgets.Window;
import org.aplication.client.view.GuiUsuario;

/**
* Main entry point.
*
* @author isaac
*/
public class MainEntryPoint implements EntryPoint {
/**
* Creates a new instance of MainEntryPoint
*/
public MainEntryPoint() {
}

/**
* The entry point method, called automatically by loading a module
* that declares an implementing class as an entry-point
*/
public void onModuleLoad() {

final Button button = new Button("Click me!");

button.addClickListener(new ClickListener(){
public void onClick(Widget w) {
GuiUsuario guiUsuario = new GuiUsuario();
Window winUsu = guiUsuario.getWindow();
winUsu.show();
}
});

RootPanel.get().add(button);

}
}



winUsu.show(); Este metodo de la clase Window hace que la ventana se visualize en el navegador del cliente.

Depues damos run a proyecto y deberiamos tener algo como esto.



Paso 3. Crear el RCP damos click derecho en new / other depues aparecera la opcion de gwt y una lista donde esta gwtrcp damos click y despues nos pedira en nombre del servicio en paquete donde lo pondremos.


Creación del servio: Lo llamaremos GWTServiceUser y estará dentro del paquete org.aplication.client.servicio

Después tendremos una estructura como la siguiente:


Un rcp de gwt necesita de 3 clases principales y un mapeo en el web.xml que ya hace por defecto el ayudante de netbeans.

dentro del paquete org.aplication.client.servicio
- interface GWTServiceUserAsync
-interface GWTServiceUser
y del lado del servidor en el paquete org.aplication.server.servicio esta la clase:
-class GWTServiceUserImpl

El diagrama de clases para la creación de usuarios desde el cliente al servidor es la siguiente:

El código para cada clase es el siguiente:

package org.aplication.client.servicio;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
import org.aplication.client.modelo.Usuario;

/**
*
* @author isaac
*/
@RemoteServiceRelativePath("servicio/gwtserviceuser")
public interface GWTServiceUser extends RemoteService {
public String nuevoUsuario(Usuario usuario);
}

---------------

package org.aplication.client.servicio;

import com.google.gwt.user.client.rpc.AsyncCallback;
import org.aplication.client.modelo.Usuario;

/**
*
* @author isaac
*/
public interface GWTServiceUserAsync {
public void nuevoUsuario(Usuario usuario, AsyncCallback callback);
}

--------------------------------------

package org.aplication.server.servicio;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
import org.aplication.client.modelo.Usuario;
import org.aplication.client.servicio.GWTServiceUser;

/**
*
* @author isaac
*/


public class GWTServiceUserImpl extends RemoteServiceServlet implements GWTServiceUser {

private static List usuarios = null;
private static int contCve = 0;

public String nuevoUsuario(Usuario usuario) {
contCve++;
usuario.setCve(contCve);

if(usuarios==null){

usuarios = new ArrayList();
usuarios.add(usuario);

}else
usuarios.add(usuario);

for(Usuario u:usuarios){
System.out.println("usuario "+u.getNombre());
}

return "Se ha creado el usuario";
}




}

-------------------------------------------------------------


package org.aplication.client.view;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.gwtext.client.core.EventObject;
import com.gwtext.client.core.Position;
import com.gwtext.client.widgets.Button;
import com.gwtext.client.widgets.MessageBox;
import com.gwtext.client.widgets.Window;
import com.gwtext.client.widgets.event.ButtonListenerAdapter;
import com.gwtext.client.widgets.form.FormPanel;
import com.gwtext.client.widgets.form.TextField;
import org.aplication.client.modelo.Usuario;
import org.aplication.client.servicio.GWTServiceUser;
import org.aplication.client.servicio.GWTServiceUserAsync;

/**
*
* @author isaac
*/
public class GuiUsuario {

private Usuario usuario;
private Window window;
private FormPanel formPanel;
private TextField nombre;
private TextField apellido;
private TextField edad;
private static GWTServiceUserAsync service;

public FormPanel getFormPanel() {


formPanel = new FormPanel();
formPanel.setFrame(true);
formPanel.setTitle("Usuario");
nombre = new TextField("Nombre", "nombre", 230);
apellido = new TextField("Apellido", "apellido", 230);
edad = new TextField("Edad", "edad", 230);
formPanel.add(nombre);
formPanel.add(apellido);
formPanel.add(edad);


return formPanel;
}

public Usuario getUsuario() {
return usuario;
}

public Window getWindow() {

window = new Window();
window.setTitle("Layout Window");
window.setClosable(true);
window.setWidth(600);
window.setHeight(350);
window.setPlain(true);
window.setCloseAction(Window.HIDE);
window.add(getFormPanel());

Button buttonNewUser = new Button("Nuevo Usuario");
buttonNewUser.addListener(new ButtonListenerAdapter(){

@Override
public void onClick(Button button, EventObject e) {
Usuario u = new Usuario();
u.setEdad(Integer.parseInt(edad.getText()));
u.setNombre(nombre.getText());
u.setApellido(apellido.getText());

insertaUsuario(u);

}

}
);


window.setButtonAlign(Position.CENTER);
window.addButton(buttonNewUser);



return window;
}

public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}



public void insertaUsuario(Usuario usuario) {


// Create an asynchronous callback to handle the result.
final AsyncCallback callback = new AsyncCallback() {

public void onSuccess(Object result) {
String respuesta = (String) result;

MessageBox.alert(respuesta);

}

public void onFailure(Throwable caught) {
MessageBox.alert("Error " + caught);
}
};

getService().nuevoUsuario(usuario, callback);

}


public static GWTServiceUserAsync getService() {
service = (GWTServiceUserAsync) GWT.create(GWTServiceUser.class);
ServiceDefTarget endpoint = (ServiceDefTarget) service;
String moduleRelativeURL = GWT.getModuleBaseURL() + "servicio/gwtserviceuser";
endpoint.setServiceEntryPoint(moduleRelativeURL);
return service;
}



}

----------------------------------------

- La parte importante que debemos entender de los rcp de gwt es que podemos mandar beans desde los clientes hasta nuestro servidor de manera clara sin necesidad de ocupar
request.

La menera que se logra esto es atravez de del siguiente metodo de la clase
GuiUsuario.

public static GWTServiceUserAsync getService() {
service = (GWTServiceUserAsync) GWT.create(GWTServiceUser.class);
ServiceDefTarget endpoint = (ServiceDefTarget) service;
String moduleRelativeURL = GWT.getModuleBaseURL() + "servicio/gwtserviceuser";
endpoint.setServiceEntryPoint(moduleRelativeURL);
return service;
}

y para llamarlo ocupamos el metodo siguiente dentro de la misma clase:

public void insertaUsuario(Usuario usuario) {

// Create an asynchronous callback to handle the result.
final AsyncCallback callback = new AsyncCallback() {
public void onSuccess(Object result) {
String respuesta = (String) result;

MessageBox.alert(respuesta);

}

public void onFailure(Throwable caught) {
MessageBox.alert("Error " + caught);
}
};

getService().nuevoUsuario(usuario, callback);

}

Cuando se ejecuta este metodo llama directemente a metodo getService() el cual tiene un metodo llamado nuevoUsuario que ha este le mandamos como parametro el usuario y el callback que su tarea va ser recibir la respuesta del rcp del servidor en este caso de la clase GWTServiceUserImpl que sobreescribe el método nuevoUsuario que es donde creamos la lista y insertamos elementos a ella y esta responde con el mensaje return "Se ha creado el usuario" el cual es recibido por el callback en:

public void onSuccess(Object result) {
String respuesta = (String) result;

MessageBox.alert(respuesta);
.
.
.

Por ultimo necesitamos el evento del boton de la GuiUsuario para crear el usuario y llamar al método insertaUsuario

Button buttonNewUser = new Button("Nuevo Usuario");
buttonNewUser.addListener(new ButtonListenerAdapter(){

@Override
public void onClick(Button button, EventObject e) {
Usuario u = new Usuario();
u.setEdad(Integer.parseInt(edad.getText()));
u.setNombre(nombre.getText());
u.setApellido(apellido.getText());

insertaUsuario(u);

}

}
);

Después damos run al proyecto y nuestra aplicación esta lista para crear usuarios yo puse una lista estática de usuarios pero bien se pueden insertar en una base de datos con hibernate o con jdbc.


Bueno eso es todo despues crearemos un grid ....

Dedicado a mi princesita.


Segunda Parte