Java EE 2. Configurar Eclipse

Introducción

En Java existe una cantidad enorme de librerías que podemos reutilizar para nuestros proyectos, Maven nos proporciona la facilidad de gestionar estas librerías para manejar versiones y dependencias, así como empaquetar y distribuir el proyecto. Para mas detalles: http://www.genbetadev.com/java-j2ee/que-es-maven.

Eclipse ya integra Maven y su uso lo hace muy sencillo. El proyecto Java EE que crearemos será un proyecto Maven

Configurar Eclipse

1. Seleccionar workspace

Al abrir Eclipse por primera vez debemos seleccionar la ruta ../developer/ide/workspace

workspace

2. Crear Archetypes de Maven

Dentro de Eclipse ir a:

Windows -> Preferences -> Maven -> Archetypes

archetype

Clic en el botón Add Remote Catalog.. En el campo Catalog File:  copiamos la ruta: http://repo.maven.apache.org/maven2/archetype-catalog.xml y clic en el botón OK.

archetype2

Se muestra la nueva ruta de Archetypes agregada.

archetype2_1

NOTA: Esta ruta se puede obtener de la pagina oficial de Maven https://maven.apache.org/https://maven.apache.org/archetype/archetype-models/archetype-catalog/archetype-catalog.html

archetype3

3. Configurar el servidor de aplicaciones en Eclipse

Instalar las herramientas de Glassfish.

Dentro de Eclipse ir a:

Help -> Eclipse Marketplace… -> Search

Escribimos glassfish y presionamos el botón Go. Cuando nos muestre  GlassFish Tools damos clic en Install.

glassfishTools

Habilitamos todo y clic en Confirm.

glassfishTools2

Aceptamos la licencia y clic en Finish.

glassfishTools3

Cuando termine  de instalar nos pedirá reiniciar Eclipse. Clic en Yes.

glassfishTools4

NOTA: Si  se muestra un error al instalar el plug-in se puede intentar lo siguiente. https://arieloliva.com/error_glassfish_tools_eclipse/

Configurar GlassFish.

Después de reiniciar Eclipse, seleccionamos la pestaña Servers y clic en No servers are available. Click this link to create a new server…

server

Seleccionamos GlassFish 4 y el nombre del servidor. Presionamos Next.

server2

Seleccionamos la ruta ../developer/server/glassfish4/glassfish donde previamente se descomprimimos el servidor de aplicaciones GlassFish. Clic en Next.

server3

Dejamos el password en blanco y clic en Finish.

server4

Se muestra el servidor. Clic derecho y seleccionamos Start. El servidor debe levantarse.

server6

 

4. Crear proyecto Maven

Dentro de Eclipse ir a:

File -> New -> Other -> Maven -> Maven Project  Next

maven

 Default workspace y clic en Next.

maven2

Escribimos en Filter: J2EE, esperamos a que muestre los Archetype y seleccionamoa webapp-j2ee14 versión 1.3. Clic en Next.

maven3

Escribimos,
 Group Id: paquete inicial del proyecto
 Artifact Id: Nombre del proyecto
Versión: Versión del sistema a desarrollar (1.0.0). Clic en Finish.

maven4

 Clic derecho sobre el proyecto Run As -> 1. Run On Server

maven5

Seleccionamos GlassFish. Clic en Next.

maven6

Pasamos el proyecto a la ventana de Configured y clic en Finish.

maven7

Se muestra la ventana de «hola mundo». Lo cual indica que el proyecto se ejecuto correctamente

maven8

Java EE 1

Antecedentes

Después de programar por muchos años en java, llegue a pensar que dominaba todo el lenguaje, pero me sorprende ver que sólo lo he tocado superficialmente; que sólo utilizo una mínima parte y no he explotado el potencial que tiene. Por esta razón hoy tomo la decisión de profundizar más, específicamente en Java EE (Java Platform, Enterprise Edition). Para los cual iniciare una serie de artículos para implementar esta arquitectura en un proyecto, desde su instalación hasta la construcción de un sistema.

Generar ambiente

Se puede trabajar sobre Linux, Windows o Mac en lo personal me gusta mas Linux (Ubuntu), pero hay que considerar las versiones de las herramientas, así como los detalles específicos; manejo de rutas, tipos de ejecutables  .sh para Linux, .exe para Windows, etc.

Para generar el ambiente de trabajo requerimos lo siguiente.

1. Estructura de carpetas

Lo más conveniente es generar una estructura de trabajo como la siguiente:

Nivel 1 Nivel 2 Nivel 3 Descripción
developer Carpeta raíz
db Base de Datos y los drivers de conexión.
ide
eclipse Instalación de Eclipse
workspace Espacio de trabajo de Eclipse
server Servidor de aplicaciones

Por ejemplo:

estructuraCarpetas

Esta nos permite tener completamente organizado todo el ambiente de trabajo y ubicar perfectamente donde esta cada componente. Por ejemplo si quisiéramos pasarlo a otra maquina bastaría con copiar toda la estructura de carpetas.

2. Descargar las siguientes herramientas

  1. Eclipse.
  2. Glassfish.
  3. JDK 8 de Java.
  4. MySQL Community Server.
    • Link. http://dev.mysql.com/downloads/mysql/
    • Versión. Dependiendo de su Sistema Operativo.
    • Instalación. Descargar el archivo y ejecutarlo. Solo solicita la contraseña del usuario root.
  5. MySQL Workbench.

 

Crear con java documentos XML para timbrar CFDI

Introduccion

Para realizar el timbrado de Factura o Nominas se deben contruir documentos XML que cumplan con las especificaciones del SAT.

El SAT proporciona los esquemas de Factura y Nomina en documentos xsd. Con estos tenemos la posibilidad de comprobar que el documento XML cumple con la estructura requerida.

Los esquemas que proporciona, entre otro, son:

XMLBeans

XMLBeans es una tecnologia de Apache para tener acceso a un XML en lenguaje de Java. Mediante está, usamos directamente objetos Beans con sus set y get para contruir un documento XML.

Pasos para contruir XML con las especificaciones del SAT

  1. Descargar la ultima versión de XMLBeans http://www.apache.org/dyn/closer.cgi/xmlbeans/binaries
  2. Descomprimirlo en una carpeta
  3. Pasarse a la carpeta bin
  4. Ejecutar el comando scomp para obtener los jar respectivos. Es necesario tener java instalado:
    • Para Factura:
      scomp -compiler javac cfdv3.xsd -out cfdv3.jar

      Para obtener Código Fuente:

      scomp -src cfdv3 -compiler javac cfdv3.xsd -out cfdv3.jar
    • Para nomina:
      scomp -compiler javac nomina11.xsd -out nomina11.jar

      Para obtener Código Fuente:

      scomp -src nomina -compiler javac nomina11.xsd -out nomina11.jar
  5. Con esto obtenemos los jar que podemos importar a nuestro proyecto para usar sus métodos.

Dentro del proyecto

Dentro del proyecto podemos empezar a contruir el XML .

Comprobante comprobante = null;
comprobante.setVersion("3.2");
comprobante.setFolio("674566");
comprobante.setSello("");
comprobante.setFormaDePago("PAGO EN UNA SOLA EXHIBICION");
comprobante.setNoCertificado("");
comprobante.setCertificado("");
comprobante.setSubTotal(BigDecimal.valueOf(700.01).setScale(2));
.
.
.

Otros ejemplos:

Crear emisor

Emisor emisor = comprobante.addNewEmisor();
emisor.setNombre("Juan Penas");

Crear ubicación del emisor

TUbicacionFiscal ubicacionFiscal = emisor.addNewDomicilioFiscal();
ubicacionFiscal.setCodigoPostal("1023454");

Imprimir

File f = new File(RutaDelXml);
XmlOptions xmlOptions = new XmlOptions();
xmlOptions.setCharacterEncoding("UTF-8");
xmlOptions.setSavePrettyPrint();
xmlOptions.setSavePrettyPrintIndent(4);
comprobante.xmlText(xmlOptions);
comprobante.save(f);

Referencias

Las reglas  para construir el XML se pueden consultar en:

La ultima versión tiene fecha de mayo del 2015.

Conocer la versión y ruta de Java en linux

        Para conocer la versón y la ruta donde esta instalado Java, es suficiente con abrir una consola y ejecutar el comando: update-alternatives –config java

update-alternatives

update-alternatives

       Pueden existir varias versiones de Java, pero la que esta seleccionada con el asterisco es la que se encuentra actualmente activa. Pulsando el botón Enter finalizas el comando o puedes seleccionar un numero con la versión de java que desees activar.

 

Mascara de moneda mientras se escribe

    El Post describe el código en JavaScript para crear una mascara de tipo moneda mientras se escribe en un cuadro de texto. El separador de millares es ‘,’ y acepta solo dos números decimales.

Mascara de Moneda

Mascara de Moneda

    La función principal es «cpf«, la cual se explica a continuación.:

	function cpf(v){     
		v=v.replace(/([^0-9\.]+)/g,''); 
		v=v.replace(/^[\.]/,''); 
		v=v.replace(/[\.][\.]/g,''); 
		v=v.replace(/\.(\d)(\d)(\d)/g,'.$1$2'); 
		v=v.replace(/\.(\d{1,2})\./g,'.$1'); 
		v = v.toString().split('').reverse().join('').replace(/(\d{3})/g,'$1,');    
		v = v.split('').reverse().join('').replace(/^[\,]/,''); 
		return v;  
	}  

Linea 2. Acepta solo números y el punto.
Linea 3. Quita punto al inicio.
Linea 4. Elimina dos puntos juntos.
Linea 5. Si encuentra el patrón .123 lo cambia por .12.
Linea 6. Si encuentra el patrón .1. o .12. lo cambia por .1 o .12.
Linea 7. Pone la cadena al revés Si encuentra el patrón 123 lo cambia por 123,.
Linea 8. Si inicia con una coma la reemplaza por nada.

    La llamada a la función se realiza en el evento «onkeypress» del cuadro de texto.

	onkeypress="mascara(this,cpf)"

    La instrucción «onpaste» con retorno falso sirve para que al cuadro de texto no se pueda pegar texto directamente.

	onpaste="return false"

Mascara de moneda en  un numero

    Cuando ya se tiene un numero y se quiera aplicar la mascara de moneda, se puede realizar lo siguiente. Se eliminan las comas.

	varMonto = varMonto.replace(/[\,]/g,'');

    Se parsea a tipo «Float» con el metodo «toFixed(2)» para que muestre el numero con dos decimales.

	varMonto = parseFloat(varMonto).toFixed(2)

    Se llama a la funcion «addCommas», la cual agrega las comas cada tres posiciones.

	varMonto = addCommas(varMonto);

    La función «addCommas» se muestra a continuación .

	function addCommas(nStr){
            nStr += '';
            x = nStr.split('.');
            x1 = x[0];
            x2 = x.length > 1 ? '.' + x[1] : '';
            var rgx = /(\d+)(\d{3})/;
            while (rgx.test(x1)) {
               x1 = x1.replace(rgx, '$1' + ',' + '$2');
            }
            return x1 + x2;
        }

    La siguiente imagen muestra tres campos de texto. El campo «importe» crea una mascara de tipo moneda mientras se escribe. Los campos «IVA» y «SubTotal» se calculan a partir del dato del campo «importe», cuando el cursor del mouse sale.

mascaraEnNumero

Mascara de Moneda en numero

    En el siguiente enlace se muestra todo el código, solo se tiene que descomprimir y ejecutar el archivo este-mascaraMoneda.html en un Explorardor web. este-mascaraMoneda.rar

Intercambio entre listas

  El Post describe el código en JavaScript para realizar el intercambio de datos entre 2 listas.

Intercambio de datos entre dos listas

Intercambio de datos entre dos listas

Consta de cuatro botones, los cuales tienen las siguientes funciones, de acuerdo a su posición:

  1. Pasa todo el contenido de la lista izquierda a la lista derecha. Ordena la lista destino.
  2. Pasa los registros seleccionados de la lista derecha a la lista izquierda. Ordena la lista destino.
  3. Pasa los registros seleccionados de la lista izquierda a la lista derecha. Ordena la lista destino.
  4. Pasa todo el contenido de la lista derecha a la lista izquierda. Ordena la lista destino.

  El funcionamiento de los 4 botones es similar por lo tanto solo explicare el primero.

	$("#agregar").click(function() { 
            $("#selectGrupos option:selected").each(function(i){                    
            	var $x  = $("select#selectResult");
                var tot = $("#selectResult option").length;
                var  y  = $x.get(0)
                y.options[tot] = new Option; 
                y.options[tot].text = $(this).text(); 
                y.options[tot].value = tot; 
                }).remove(); ordenarCombos2();}); 

Linea 1. Se ejecuta al hacer clic al botón correspondiente.
Linea 2. Selecciona los datos habilitados de la lista original -o todos si no tiene la instrucción selected
Lineas 3 a 8. Obtiene la longitud de la lista destino y agrega los datos habilitados a la lista destino.
Linea 9. Remueve los datos habilitados de la lista origen. Ejecuta la función ordenarCombos2, la cual ordena los datos de la lista destino.

El siguiente recuadro muestra el script completo.

	$(document).ready(function(){    
		$("#agregar").click(function() { 
            $("#selectGrupos option:selected").each(function(i){                    
            	var $x  = $("select#selectResult");
                var tot = $("#selectResult option").length;
                var  y  = $x.get(0)
                y.options[tot] = new Option; 
                y.options[tot].text = $(this).text(); 
                y.options[tot].value = tot; 
                }).remove(); ordenarCombos2();}); 
         $("#agregarTodo").click(function() { 
            $("#selectGrupos option").each(function(i){                    
            	var $x  = $("select#selectResult");
                var tot = $("#selectResult option").length;
                var  y  = $x.get(0)
                y.options[tot] = new Option; 
                y.options[tot].text = $(this).text(); 
                y.options[tot].value = tot; 
                }).remove(); ordenarCombos2();}); 
             
     	$("#quitar").click(function() { 
        	$("#selectResult option:selected").each(function(i){                    
                var $x  = $("select#selectGrupos");
                var tot = $("#selectGrupos option").length;
                var  y  = $x.get(0)
                y.options[tot] = new Option; 
                y.options[tot].text = $(this).text(); 
                y.options[tot].value = tot; 
               }).remove(); ordenarCombos1();}); 
               
                
     	$("#quitarTodo").click(function() { 
        	$("#selectResult option").each(function(i){                    
                var $x  = $("select#selectGrupos");
                var tot = $("#selectGrupos option").length;
                var  y  = $x.get(0)
                y.options[tot] = new Option; 
                y.options[tot].text = $(this).text(); 
                y.options[tot].value = tot; 
               }).remove(); ordenarCombos1();}); 
   	});
   	
   	function ordenarCombos1(){	
		var mylist = $("select#selectGrupos");
		var listitems = mylist.children("option").get();
		listitems.sort(function(a, b) {
   			var compA = $(a).text().toUpperCase();
   			var compB = $(b).text().toUpperCase();
   			return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
		})
		$.each(listitems, function(idx, itm) { mylist.append(itm); });
	}
	function ordenarCombos2(){	
		var mylist = $("select#selectResult");
		var listitems = mylist.children("option").get();
		listitems.sort(function(a, b) {
   			var compA = $(a).text().toUpperCase();
   			var compB = $(b).text().toUpperCase();
   			return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
		})
		$.each(listitems, function(idx, itm) { mylist.append(itm); });
	}

Para la llamada a la función se requieren dos select «selectGrupos» y «selectResult» y cuatro botones agregarTodo, agregar, quitar y quitarTodo

	



En el siguiente enlace se muestra todo el código, solo se tiene que descomprimir y ejecutar el archivo este-IntercambioDeDatosEntreListas.html en un Explorardor web. eseste-IntercambioDeDatosEntreListas.rar

Paginador javascript

  Este Post describe el código en JavaScript para realiza el paginado de datos, tomados desde un arreglo. Las siguientes imágenes muestra como se vera al ejecutarlo.

Paginador

Paginador

 

Paginador 2

Paginador 2

Es una modificación que realice a partir de un código de Jorge Zazo de la Encarnación, el cual también se incluye en el paquete de ejemplo que se puede descargar al final del Post.

Paginador Original

Paginador Original

En el siguiente recuadro se muestra el código completo con los comentarios de algunas lineas para entender las funciones principales.

function pinta(num,inicio){//función creada por Jorge Zazo de la Encarnación http://www.forosdelweb.com/1201706-post4.html
	//Modificaciones Ariel Oliva arieloliva.com
	var pagNow = inicio;
	var limSup;
	var numPaginasFSt = "";
	var DatoI;
	var DatoF;
	var pagAnt;
	var pagSig;
	var rutaIma=""; //Ruta base de las imagenes
	var numPaginas = misDatos.length /num; //Detecto el número "entero" de páginas
	numPaginas = numPaginas.toString();
	numPaginas = numPaginas.split(".");
	numPaginasF = eval(numPaginas[0]);

	if (misDatos.length % num != 0){ //Si el resultado de la división anterior no es exacto le añado manualmente una página más
		numPaginasF ++;
	}


	if((pagNow + 1) != numPaginasF){//Establezco el número de datos a mostrar si la última página no tiene el mismo número de datos
		limSup = -1;
	} else {
		limSup = (misDatos.length - (numPaginasF * num))-1;
	} 

	DatoI = pagNow * num;//Establezco el dato inicial y el dato final de la paginación
	DatoF = DatoI + (num+limSup);


	if (pagNow == 0){//Establezco cual es la página anterior y la siguiente
		pagAnt = 0;
	} else {
		pagAnt = pagNow - 1;
	}
	if (pagNow == (numPaginasF-1)){
		pagSig = pagNow;
	} else {
		pagSig = pagNow + 1;
	}

	for (i=0;i<numPaginasF;i++){//Pinto la cadena con el número de páginas y sus correspondientes enlaces
		numPaginasFSt += ""+ (i+1) +" ";
	}

	if (primera == 0){//Establezco si es la primera vez que se crean los elementos
		var creo = document.createElement("span");
		document.getElementById("contenido").appendChild(creo);
		var cadena = "

«; for (i=0;i<encabeza.length;i++){//crea cabeceras cadena = cadena + «»; } cadena = cadena + «»; for (DatoI;DatoI<=DatoF;DatoI++){//Pinto todos los elementos con cada dato… cadena = cadena + «» for(j=1;j<=encabeza.length;j++){ var obtDatos = «misDatos[DatoI].dato»+j; cadena = cadena + «»; } cadena = cadena + «» } cadena = cadena + »

 «+encabeza[i]+»
 «+eval(obtDatos) + «

«; contenido.innerHTML = cadena; var pagina = document.createElement(«span»);//… y la paginación. document.getElementById(«paginacion»).appendChild( pagina); paginacion.innerHTML += »
Primero » +»Anterior » + numPaginasFSt +»Siguiente » +»Ultimo «; primera = 1; } else { borra();//Borro las capas ya pintadas en la primera vez var creo = document.createElement(«span»); document.getElementById(«contenido»).appendChild(creo); var cadena = »

«; for (i=0;i<encabeza.length;i++){//crea cabeceras cadena = cadena + «»; } cadena = cadena + «»; for (DatoI;DatoI<=DatoF;DatoI++){//Pinto todos los elementos con cada dato… cadena = cadena + «» for(j=1;j<=encabeza.length;j++){ var obtDatos = «misDatos[DatoI].dato»+j; cadena = cadena + «»; } cadena = cadena + «» } cadena = cadena + »

 «+encabeza[i]+»
 «+eval(obtDatos) + «

«; contenido.innerHTML = cadena; var pagina = document.createElement(«span»);//… y la paginación. document.getElementById(«paginacion»).appendChild( pagina); paginacion.innerHTML += »
Primero » +»Anterior » + numPaginasFSt +»Siguiente » +»Ultimo «; } } function borra(){ contenido.innerHTML = «»; paginacion.innerHTML = «»; }

 

Para la llamada a la función, primeramente creamos la función «datos«, en la cual pasamos como parámetros la cantidad de columnas que existirán. En la variable «encabeza» agregamos el titulo de cada columna. En el arreglo «misDatos» cargamos los valores con un indice que ira creciendo de acuerdo a la cantidad de registros que deseemos. En el cuerpo del documento deberán existir los div «contenido» y «paginacion«. Finalmente se hace el llamado a la función «pinta(param1,param2)«, donde «param1» es la cantidad de registros que se mostraran por hoja y «param2» es la pagina+1 que se mostrara al cargar el paginador, por ejemplo para que se muestre inicialmente la primera pagina el parámetro deberá valer 0.

	
Paginación en local

 

 


En el siguiente enlace se muestra todo el código, solo se tiene que descomprimir y ejecutar el archivo este-paginadorJavaScript.html en un Explorardor web. eseste-paginadorJavaScript.rar