jueves, 30 de diciembre de 2010

MANEJO API JEXCEL

El otro día me escribieron a mi email una consulta sobre manipulación de ficheros .xls desde Java y recomendé un API ya bastante antigua llamada POI de Jakarta, que era una que había utilizado hace varios años atrás, pero luego pensé y me dije si habrán creado alguna mejor forma para la manipulación de dichos ficheros Excel que son tan populares y me puse a buscar en la Internet la existencia de alguna API nueva y me encontré con una muy buena pero no tan nueva jejeje, llamada JExcel API .
Y justo me puse a entenderla y postear sobre ella. Esta API (http://jexcelapi.sourceforge.net) es una API Opensource para especializado en la manipulación (Read/Write) de ficheros .xls sobre ccualquier sistema operativo donde exista y funcione una máquina virtual Java (es decir, no sólo Windows) puede procesar y entregar las hojas de cálculo Excel. Debido a que es Java, la API se puede invocar desde dentro de un Servlet, dando así acceso a hojas de cálculo Excel a través de aplicaciones Web.

El ejemplo preparado es un proyectito simple de tipo desktop sobre Eclipse, donde ejecuto independientemente dos clases por separado.

- org.java.jexcel.read.test.ReadExcel.java
- org.java.jexcel.write.test.WriteExcel.java

I. ReadExcel.java: Permite la lectura de un archivo Excel que debe de ser ubicado en: C://JAVA_EXCEL.xls (Este archivo lo encuentras en el SourFolder Resources del proyecto adjunto) y su salida de lo leído en consola.


********************************************************************
*************************** FORMA MANUAL ***************************
********************************************************************

- CELDA #C2: NOMBRE
- COLUMNA #C2: 1
- FILA #C2: 1

- CELDA #C2: APELLIDO
- COLUMNA #C2: 2
- FILA #C2: 1

- CELDA #D2: DNI
- COLUMNA #D2: 3
- FILA #D2: 1

- CELDA #E2: EDAD
- COLUMNA #E2: 4
- FILA #E2: 1

********************************************************************
************************* FORMA AUTOMATICA *************************
********************************************************************
OBTENIENDO [LABEL]: A1
OBTENIENDO [LABEL]: A2
OBTENIENDO [LABEL]: A3
OBTENIENDO [LABEL]: A4
OBTENIENDO [LABEL]: A5
OBTENIENDO [LABEL]: B1
OBTENIENDO [LABEL]: NOMBRE
OBTENIENDO [LABEL]: Cesar Ricardo
OBTENIENDO [LABEL]: Catherine Magaly
OBTENIENDO [LABEL]: B5
OBTENIENDO [LABEL]: C1
OBTENIENDO [LABEL]: APELLIDO
OBTENIENDO [LABEL]: Guerra Arnaiz
OBTENIENDO [LABEL]: Cotrina Vasques
OBTENIENDO [LABEL]: C5
OBTENIENDO [LABEL]: D1
OBTENIENDO [LABEL]: DNI
OBTENIENDO [NUMBER]: 41816133
OBTENIENDO [NUMBER]: 48798678
OBTENIENDO [LABEL]: D5
OBTENIENDO [LABEL]: E1
OBTENIENDO [LABEL]: EDAD
OBTENIENDO [NUMBER]: 27
OBTENIENDO [NUMBER]: 25
OBTENIENDO [LABEL]: E5
OBTENIENDO [LABEL]: F1
OBTENIENDO [LABEL]: FECHA
OBTENIENDO [DATE]: 20 12 2010 12:00:00
OBTENIENDO [DATE]: 21 12 2010 12:00:00
OBTENIENDO [LABEL]: F5
OBTENIENDO [LABEL]: G1
OBTENIENDO [LABEL]: G2
OBTENIENDO [LABEL]: G3
OBTENIENDO [LABEL]: G4
OBTENIENDO [LABEL]: G5

II. ReadExcel.java: Permite la creación de un archivo .xls, llamado: C:\\JAVA_EXCEL_CREATED.xls, donde se está incrustando cabeceras de texto simple, link, imágenes, etc.

Para descargar el demo pulsar Aquí

viernes, 24 de diciembre de 2010

MANEJO SPRING JDBC

Que tal en esta oportunidad hablare sobre otra opción para el manejo de la persistencia que viene como aporte de SPRING , este es un módulo de SPRING que brinda conexión a múltiples motores de datos de una forma muy sencilla.

Spring JDBC simplifica el manejo del estándar JDBC, obviando partes importantes que comúnmente a un se le puede pasar como es la de abrir o cerrar sesiones y conexiones (DataSource) respectivas. Funciona para JDK 1.5 (+)

Desde Spring JDBC uno puede heredar de la clase JdbcDaoSupport y acceder a JdbcTemplate que brinda un soporte para un listado de métodos especializados (query, queryForObject, queryForList,etc) , así mismo uno puede manejar acceso a procedimientos almacenados mediante la clase SimpleJbcCall , entre varias otras funcionalidades.

El demo preparada esta bien detallada: Trabaja con Spring 3.0, Maven 2.2.1, Spring JDBC 2.5.6 (JdbcDaoSupport) y para la prueba respectiva hay un JUnit TestCase para un mantenimiento amarrado a: MySql 5.1 (Script en resources).

Para probarlo ejecutar la clase JUnit, descomentando previamente los procesos de cada mantenimiento: src/main/test/org/java/spring/test/TestSpringJDBC.java

Para descargar el demo pulsar Aquí

domingo, 19 de diciembre de 2010

MANEJO SPRING v3.0

Ahora que esta tan de moda el manejo del Framework SPRING mostrare un demo de su manejo, de una forma bien peculiar aplicada a la programación. Cabe recalcar que la idea base la cual me inspiro fue una muy similar que mostró en una exposición mi amigo Lennon Shimokawa de su demo TORTUGAS NINJA en su presentación sobre SpringCore.

El demo actual a mostrar, esta basado en la leyenda de la sobre la batalla MITOLOGICA de la TITANOMAQUIA que habla sobre batalla entre: "LOS DIOSES vs LOS TITANES". En aquella batalla los TITANES se revelan en contra de los OLIMPICOS conformados por los dioses que se reunían a debatir sus hazañas en el famoso monte OLIMPO.

DIOSES:
- ZEUS.
- POSEIDON.
- HELIOS/APOLO/ABEL
- HADES.

TITANES:
- CRONOS.
- REA.
- OCEANA.
- CRIO.

Programaticamente, se va a representar de forma dinámica la batalla mano a mano de c/u, mediante un JUnitTest:

org.java.spring.batalla.TestBatallaMitologica.java

Es importante decir que se utilizo MAVEN para la creación del proyecto JAVA y la IDE Spring Tools Suite v2.5.1 (STS) . Desde este LINK se puede verificar su manejo.

Finalmente, al ejecutar dicha clase se obtendrá una salida en consola similar a esta:

DATOS [DIOS]:
- NOMBRE: ZEUS
- ARMA: LANZA
- PODER: EL RAYO
- NIVEL: 100

DATOS [TITAN]:
- NOMBRE: OCEANA
- ARMA: NO TIENE
- PODER: SUPER FUERZA
- NIVEL: 80

INICIA LA BATALLA:
- EL DIOS: [ZEUS], UTILIZA SU PODER: [EL RAYO], CONTRA EL TITAN: [OCEANA]
- EL TITAN: [OCEANA], UTILIZA SU PODER: [SUPER FUERZA], CONTRA EL DIOS: [ZEUS]
- EL DIOS: [ZEUS], UTILIZA SU ARMA: [LANZA], CONTRA EL TITAN: [OCEANA]
- EL TITAN: [OCEANA], UTILIZA SU PODER: [SUPER FUERZA], CONTRA EL DIOS: [ZEUS]

FINAL:
- GANO EL DIOS: [ZEUS]

Para descargar el demo pulsar Aquí

MANEJO DE MAVEN DESDE (STS).

El tutorial mostrara una forma diferente de manejar MAVEN desde la IDE Spring Tools Suite v2.5.1 (STS), que es en realidad un ECLIPSE v3.6 con un mayor soporte de Plugins.

PASO #I:
Comenzaremos, configurando el MAVEN por defecto que viene con embebido en el Spring Source Tools Suite v2.5.1.

PASO #II:
Ingresamos en la barra de menú a:
Windows/preferences/maven/user preferentes, pulsamos el botón Browse y editamos el archivo:
settings.xml y mapeamos:

[localRepository>]C:\RepositorioMaven[/localRepository]

PASO #III:
Para un mejor control de nuestras librerías de JAVA, vamos a crear nuevo un Repositorio en la ruta:

C:\RepositorioMaven

Y lo registramos en la interfaz mostrada en el paso anterior.

PASO #IV:
Con la IDE ya configurada vamos a crear un nuevo proyecto MAVEN

File/new/other/Maven/Maven Project

PASO #V:
Ingresamos el WorkSpace donde será creado dicho proyecto MAVEN.

PASO #VI:
Filtramos por el archetype: que deseamos utilizar:

ARCHETYPE: maven-archetype-webapp.

PASO #VII:
Registramos datos importantes de lo que será el POM.xml, archivo de configuración del MAVEN.

- GOUPID: org.java.spring
- ARTIFACTID: PROYECT_DEMO_SPRING_XML
- VERSION: 1.0
- PACKAGE: org.java.spring.PROYECT_DEMO_SPRING_XML

PASO #VIII:
Al archivo de configuración POM.xml ingresamos las dependencias de las librerías (.JARs) Spring 3.0 que vamos a utilizar, para su descarga respectiva.

PASO #IX:
Limpiamos el previamente el proyecto MAVEN creado y luego ejecutamos el dicho proyecto, para la validación y descarga de sus dependencias registradas

PASO #X:
Verificamos la descarga de los .JARs realizada en MAVEN DEPENDENCIES dentro del menú izquierdo.

PASO #XI:
Registramos un PLUGIN en el POM.xml para el soporte de JAVA 1.6 al compilar.

PASO #XII:
Limpiamos el previamente y luego ejecutamos el Proyecto MAVEN creado, para la validación y descarga de sus dependencias registradas.

PASO #XIII:
Verificamos el proceso realizado.

PASO #XIV:
Agregamos el soporte de SPRING al proyecto.

PASO #XV:
Creamos los SourceFolder para TEST y para JAVA.

PASO #XVI:
Mapeamos la configuración realizada hasta el momento.

PASO #XVII:
Como se va a manejar Spring en el proyecto creado, creamos el archivo de configuración de Spring:

applicationContext.xml

PASO #XVIII:
Editamos el "applicationContext.xml" creado, y registramos los NameSpace y esquemas con los que Spring trabajara. Así mismo creamos un paquete donde comenzaremos a trabajar y mapeamos el acceso al archivo de configuración "application-entityBean.xml".

PASO #XIX:
Accedemos al archivo de configuración de BEANs de Spring "application-entityBean.xml", aquí se mapearan las entidades simples o anidadas de nuestra aplicación (Lo ingresado es simbólico).

Para un mayor detalle de lo explicado (CAPTURAS DE PANTALLA), descargar el Tutorial de MAVEN(STS) completo pulsar: Aquì

domingo, 17 de octubre de 2010

MANEJO FRAMEWORK "AJAX TAGs v1.5.1"

Luego de postear anteriormente sobre el manejo de AJAX de forma NATIVA, esta vez les mostrare un ejemplo de como manejar este Framework que facilita el manejo de AJAX mediante una serie de TAGs que brinda el acceso al servidor sin la necesidad del clasico PostBack. Esta librería permite la aplicación de funcionalidad AJAX en el desarrollo de componentes como:

- COMBOBOX.
- LISTAS.
- CALLOUT.
- PORLET.
- TOGGLE.
- EDITOR.
- TREE.
- Etc.

La logica de este Framework esta basado al manejo de un Servlet especial que extiende de la clase: BaseAjaxServlet

Aqui el mapeo respectivo en el web.xml: (Ojo por motivos de Visualización he cambiado '<' por '[' & ']' por '>')


[servlet][display-name]AjaxServlet[/display-name]
[servlet-name]AjaxServlet[/servlet-name]
[servlet-class]org.java.servlet.AjaxServlet[/servlet-class]
[load-on-startup]2[/load-on-startup][/servlet]

[servlet-mapping]
[servlet-name]AjaxServlet[/servlet-name]
[url-pattern]/AjaxServlet[/url-pattern]
[/servlet-mapping]

[!-- **** SERVLET: CARGA LAS LIBRERIS DEL 'JAR' **** --]
[servlet]
[servlet-name]sourceloader[/servlet-name]
[servlet-class]net.sourceforge.ajaxtags.servlets.SourceLoader[/servlet-class]
[init-param]
[param-name]prefix[/param-name]
[param-value]/ajaxtags[/param-value]
[/init-param]
[/servlet]

[servlet-mapping]
[servlet-name]sourceloader[/servlet-name]
[url-pattern]/ajaxtags/js/*[/url-pattern]
[/servlet-mapping]

[servlet-mapping]
[servlet-name]sourceloader[/servlet-name]
[url-pattern]/img/*[/url-pattern]
[/servlet-mapping]

[servlet-mapping]
[servlet-name]sourceloader[/servlet-name]
[url-pattern]/css/*[/url-pattern]
[/servlet-mapping]
[!-- ************************************** --]


Para descargar el ejemplo completo, descargarlo de: AQUÌ.

MANEJO DE "AJAX" (FORMA NATIVA)

En esta oportunidad mostrare el manejo de AJAX (Asynchronous JavaScript And XML) de la forma Nativa, pero en dos formas distintas de realizar. Al decir forma Nativa, hago referencia a que no utilizare ningún Framework especializado, sino que me apoyare en funciones JavaScript o mediante un simple fichero .JS.

Lo más resaltante es el diseño del fichero .JS que permitirá el acceso al servidor de forma directa sin la realización de un Post Back, el fichero es el siguiente:

var vAJAX;

/*** GLOBALES ***/
var Id_OBJETO;
var URL_Redirec;
var Id_Mostrar;

function PROCESAR_AJAX( Id_OBJETO2, URL_Redirec2, Id_Mostrar2 ){

this.Id_OBJETO = Id_OBJETO2;
this.URL_Redirec = URL_Redirec2;
this.Id_Mostrar = Id_Mostrar2;

recuperaAjax();
}

function recuperaAjax(){

//CREAMOS EL CONTROL 'XMLHttpRequest', SEGÚN EL NAVEGADOR UTILIZADO:
if( window.XMLHttpRequest ){
vAJAX = new XMLHttpRequest(); //SI NO ES 'INTERNET EXPLORER'
}
else{
vAJAX = new ActiveXObject( "Microsoft.XMLHTTP" ); //SI ES 'INTERNET EXPLORER'
}

//ALMACENAMOS EN EL CONTROL, LA FUNCION QUE INVOCARA CUANDO LA PETICION CAMBIE DE ESTADO
vAJAX.onreadystatechange = funcionCallback; //IMPORTANTE LOS LLAMADOS A LOS METODOS SE HACEN SIN PONER '()'

//ENVIAMOS LA PETICION...
vAJAX.open( "GET", URL_Redirec + "?PERSONA=" + Id_OBJETO , true );
vAJAX.send( "" );
}

function funcionCallback(){
//alert(Id_OBJETO);
alert(URL_Redirec);
//alert(Id_Mostrar);

//COMPROBAMOS SI LA PETICION SE HA COMPROBADO: (TIENE QUE COINCIDIR CON EL ESTADO #4)
if( vAJAX.readyState == 4 ){

//COMPROBAMOS SI LA RESPUESTA HA SIDO CORRECTA: (TIENE QUE COINCIDIR CON 'HTTP 200')
if( vAJAX.status == 200 ){

//ESCRIBIMOS EL RESULTADO DE LA PAGINA 'HTML' MEDIANTE 'DHTML'
if( Id_Mostrar == "IMPRIMIR" ){
document.all.IMPRIMIR.innerHTML = "" + vAJAX.responseText + "";
}
else{
alert("");
}
}
}
}






Para descargar el ejemplo completo, descargarlo de: AQUÌ.

domingo, 10 de octubre de 2010

MANEJO DE 'WEB SERVICE' CON 'JAX-WS'.

Que tal amigos después de un tiempo regreso para postear sobre este tema interesante relacionado a WebService. En esta oportunidad hablare sobre el Framework JAX-WS, este Framework en comparación de otros Frameworks, te facilita la generación WebService vía un simple Servlet y algo muy bueno es que permite a diferencia de otros Frameworks para WS, el manejo de colecciones (ArrayList, List, Vector) como INPUT & OUTPUT de cada una de las operaciones que se declaren en dichos WS.

Los pasos para poder levantar un WS vía JAX-WS son los siguientes:

- Descargar las fuentes Core del JAX-WS pulsando: AQUÌ..

- Ubicar las fuentes descomprimirlas y ubicarlas en la ruta: C:\JAVA\JAX-WS\JAXWS2.a.2.
- Crea la variable de entorno: JAXWS_HOME, que apunte a la ruta donde estaba las fuentes de JAX-WS descargadas: C:\JAVA\JAX-WS\JAXWS2.1.2\jaxws-ri
- Crea un Servlet similar a este:

package org.java.ws.servlet;

import static org.java.ws.util.Constantes.URL_WEBSERVICE;
import java.io.Serializable;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.java.ws.servidor.UsuarioDAOImpl;

/**
* @author cguerra.
* @clase: InicialiadorJAXServlet.java
* @descripción descripción de la clase.
* @author_web: http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: nombre del email del autor.
* @author_company: nombre de la compañía del autor.
* @fecha_de_creación: dd-mm-yyyy.
* @fecha_de_ultima_actualización: dd-mm-yyyy.
* @versión 1.0
*/
public class InicialiadorJAXServlet extends GenericServlet implements Serializable{

private static final long serialVersionUID = -2482469492687227649L;

/**
* Constructor.
*/
public InicialiadorJAXServlet(){
}

/**
* init mètodo que se carga al iniciar el sistema y accede al método que manda a iniciar el Proceso.
* @throws ServletException
*
*/
public void init( ServletConfig configuracion ) throws ServletException{
System.out.println( "DENTRO DE 'init( ServletConfig configuracion )' " );

super.init( configuracion );

try{
this.IniciarWebService();
}
catch( Exception e ){
e.printStackTrace();
}
}

/**
* IniciarWebService, Mètodo que manda a iniciar el WebService.
*/
public void IniciarWebService(){
System.out.println( "DENTRO DE 'IniciarWebService()' " );

try{
String webService = URL_WEBSERVICE;

UsuarioDAOImpl daoImpl = new UsuarioDAOImpl();
daoImpl.inicializaWebService( webService );
}
catch( Exception e ){
e.printStackTrace();
}
}

/**
* service
* @param request
* @param response
*/
public void service( ServletRequest request, ServletResponse response ){
System.out.println( "DENTRO DE 'service( ServletRequest request, ServletResponse response )' " );
}

}


- Crear la Interfase y su clase que Implemente el WS. Además, para la generación en si del WS se puede realizar de 2 formas a continuación detalladas:


GENERAR WEBSERVICE DESDE UNA CLASE 'JAVA'
--------------------------------------------------------------------------


I.- UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:

Ejecutar en Orden:

(FORMA MANUAL)
A.- javac org/java/ws/bean/Usuario.java
B.- javac org/java/ws/servidor/UsuarioDAO.java
C.- javac org/java/ws/servidor/UsuarioDAOImpl.java

(FORMA DINAMICA)
set RAIZ_SRC= .
set JAVA_SRC=%RAIZ_SRC%\org\java\ws\bean\*.java
set JAVA_SRC=%JAVA_SRC%%RAIZ_SRC%\org\java\ws\servidor\*.java
set JAVA_SRC=%JAVA_SRC%%RAIZ_SRC%\org\java\ws\util\*.java
javac %JAVA_SRC%


D.- %JAXWS_HOME%/bin/wsgen -cp . org.java.ws.servidor.UsuarioDAOImpl -s . -verbose -r ..\WebContent\wsdl -wsdl
E.- Ejecutar esta linea de Comandos o desplegar desde el Servidor:
java org.java.ws.servidor.UsuarioDAOImpl
F.- Actualizar el nombre del 'WebService' en el WSDL, ya que luego de generarce no aparece.


GENERAR WEBSERVICE DESDE UN 'WSDL'
--------------------------------------------------------------


I.- UBICARSE DESDE LA RUTA 'RAIZ' DEL PROYECTO EN DOS:
- FORMA#1: wsimport WebContent\WEB-INF\wsdl\music.wsdl -s src -verbose
- FORMA#2: %JAXWS_HOME%/bin/wsimport WebContent\WEB-INF\wsdl\music.wsdl -s src -verbose

II.- UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:
- FORMA#1: wsimport ..\WebContent\WEB-INF\wsdl\music.wsdl -s . -verbose
- FORMA#2: %JAXWS_HOME%/bin/wsimport ..\WebContent\WEB-INF\wsdl\WEB-INF\music.wsdl -s . -verbose

Luego de esto se habrá generado el WS y se apreciaría un mensaje similar a este, al ingresar una URL similar a esta, que significa que el WS esta activo:

http://localhost:8099/ServidorWS_JAXWS_Generado/UsuarioDAOImpl
Web Services
No JAX-WS context information available.

Para el consumo del dicho WS ya desplegado, nos podemos apoyar también con JAX-WS, para ello realizamos lo siguiente:

GENERAR CLIENTE 'WEBSERVICE'
--------------------------------------------------


UBICARSE DESDE LA RUTA 'SRC' DEL PROYECTO EN DOS:

I.- GENERACION DE CLASES:

A.- DESDE 'URL':
%JAXWS_HOME%/bin/wsimport http://localhost:8090/servidorJaxWs/UsuarioDAOImpl?wsdl -s . -verbose

B.- DESDE 'FICHERO':
%JAXWS_HOME%/bin/wsimport ..\WebContent\wsdl\UsuarioDAOImplService.wsdl -s . -verbose


II.- COMPILACION & EJECUCION DE CLIENTE 'WS':

A.- Ejecución desde Consola 'DOS':
- javac org/java/ws/test/ClienteWS.java
- java org/java/ws/test/ClienteWS PARAMETRO

B.- Ejecución desde Clase JAVA:
- Ejecutar desde 'Java Aplication'.

Al ejecutar la clase: ClienteWS se probara dicho WS.

Para descargar el ejemplo completo, descargarlo de: AQUÌ.