SpringBoot 5. Crear proyecto SpringBoot en Eclipse

Crear proyecto Maven

Hay varias formas de crear el proyecto pero lo mas recomendable es utilizar el asistente en linea de Spring.

Vamos a la ruta https://start.spring.io/ Escribimos el Group y el Artifact. En la sección de Search for dependencies agregamos las dependencias Web, Thymeleaf y DevTools. Clic en Generate Project y guardar el archivo en una ruta local.

Descomprimir el archivo y copiarlo al workspace de Eclipse. Abrir eclipse, Clic derecho en el Explorador de Proyectos.

Import -> Import… -> Maven -> Existing Maven Projects

Clic en el botón Next.

Seleccionamos el proyecto kanban con el botón Browse… Clic en Finish.

Se muestra el proyecto en el Explorador de Proyectos.

Archivo pom.xml

Se agregan automáticamente las dependencias:

spring-boot-starter-web Indica que es una aplicación Web. Agrega la funcionalidad de @Controller, @RequestMapping, etc
spring-boot-starter-thymeleaf Plantillas de servidor para Web.
spring-boot-devtools Elimina la necesidad de reiniciar cada que se hace un cambio. Se recomienda solo para ambientes de desarrollo.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.proyecto</groupId>
	<artifactId>kanban</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>kanban</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.3.8.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

Clase principal

Es necesario una clase main como punto de inicio de la aplicación. Esta es com.proyecto.KanbanApplication. La anotación @SpringBootApplication indica en donde inicia la aplicación.

package com.proyecto;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class KanbanApplication {
	public static void main(String[] args) {
		SpringApplication.run(KanbanApplication.class, args);
	}
}

Controladores

Para manejar peticiones Web es necesario crear controladores, los cuales manejan la solicitud a partir de una ruta de acceso. Creamos la clase ControllerIndex en el paquete com.proyecto.controller. Agregamos las anotaciones @Controller y @RequestMapping.

@Controller Indica que es un controlador
@RequestMapping Indica que Controller o método de un Controller tiene que direccionar cada llamada del cliente
package com.proyecto.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class ControllerIndex {
	@RequestMapping(value = "/",method = RequestMethod.GET)
	public String index(){
		return "kanban";
	}
}

Copiar archivos del proyecto anterior

Tomamos los archivos del proyecto anterior y los copiamos al proyecto de SpringBoot. Copiamos las carpetas css y js en la ruta scr/main/resource/static y el archivo kanban.html en scr/main/resource/templates.

Configurar application.properties

En este archivo application.properties que se encuentra en src/main/resource se pueden configurar muchos parámetros. Puede consultarlos en http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html. Solo vamos a agregar,

server.contextPath=/kanba Contexto de la aplicación
server.port=8090 Puerto de la aplicación
# Server
server.contextPath=/kanban
server.port=8090

Ejecutar aplicación

Para ejecutar la aplicación abrimos la clase com.proyecto.KanbanApplication. Clic con el botón derecho.

Run As -> Java Application.

Se inicia la aplicación.

El siguiente mensaje indica que la aplicación se levanto correctamente, además muestra el puerto.

Abrimos un explorador de Internet y tecleamos http://localhost:8090/kanban.

Json desde el Servidor

Creamos el Controller ControllerColumn. Este mostrara todas las columnas en formato Json. Los datos de retorno están hardcore, posteriormente veremos como extraerlos de una Base de Datos.

package com.proyecto.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ControllerColumn {
	@RequestMapping("/column")
	@ResponseBody
	public String index(){
		return "{\"columns\":[{\"titulo\":\"Backlog\",\"article\":[{\"nombre\":\"Nombre\",\"titulo\":\"Titulo\",\"descripcion\":\"Descripcion\"},{\"nombre\":\"Sistema Kanban\",\"titulo\":\"FrontEnd\",\"descripcion\":\"Construir un sistema Kanbad de forma dinamica con json, javascript y jquery\"}]},{\"titulo\":\"Proceso\",\"article\":[]},{\"titulo\":\"Terminado\",\"article\":[]}]}";
	}

}

Si tecleamos en el explorador http://localhost:8090/kanban/column se muestra los datos en json.

/ 20170412164443
// http://localhost:8090/kanban/column

{
  "columns": [
    {
      "titulo": "Backlog",
      "article": [
        {
          "nombre": "Nombre",
          "titulo": "Titulo",
          "descripcion": "Descripcion"
        },
        {
          "nombre": "Sistema Kanban",
          "titulo": "FrontEnd",
          "descripcion": "Construir un sistema Kanbad de forma dinamica con json, javascript y jquery"
        }
      ]
    },
    {
      "titulo": "Proceso",
      "article": [
        
      ]
    },
    {
      "titulo": "Terminado",
      "article": [
        
      ]
    }
  ]
}

Creamos el Controller ControllerKanbanWeb. Este llama a kanbanWeb.xml con el mapeo /Web.

package com.proyecto.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class ControllerKanbanWeb {
	@RequestMapping(value = "/Web",method = RequestMethod.GET)
	public String index(){
		return "kanbanWeb";
	}
}

Duplicamos el archivo kanban.html en la ruta src/main/resource/ y lo nombramos kanbanWeb.html

Abrimos el archivo kanbanWeb.html y cambiamos la ruta del archivo kanban.js a kanbanWeb.js.

<!-- kanban  -->
<script type="text/javascript" src="js/kanbanWeb.js" charset="UTF-8"></script>

Duplicamos el archivo kanban.js en la ruta src/main/resource/static y lo nombramos kanbanWeb.js

Abrimos el archivo kanbanWeb.js y realizamos los siguientes cambios.

  1. Eliminamos las funciones Column y Article, Así como la creación de los arreglos column y articles.
  2. Crear la función buildsKanban que construye las columnas y los articulos de kanban.
    function buildsKanban(data){
    	var columns = data.columns;
    	var varArticle = null;
    	for(var i=0;i<columns.length;i++){
    		varColumna ="<div class=\"panel panel-primary kanban-col\">";
            varColumna+="	<div class=\"panel-heading\">"+columns[i].titulo+" <i class=\"fa fa-2x fa-plus-circle pull-right\"></i></div>";
            varColumna+="   <div class=\"panel-body\">";
            varColumna+="   	<div id=\""+columns[i].titulo+"\" class=\"kanban-centered\">";
            varColumna+="		</div>";
            varColumna+="   </div>";
            varColumna+="   <div class=\"panel-footer\">";
            varColumna+="   	<a href=\"#\">Add a card...</a>";
            varColumna+="   </div>";
            varColumna+="</div>";
    		$("#sortableKanbanBoards").append(varColumna);
    		
    		varArticle	= "";
    		for(var j=0;j<columns[i].article.length;j++){					
    			varArticle	+=  "<article class=\"kanban-entry grab\" id=\"item"+String(i)+String(j)+"\" draggable=\"true\">";
    			varArticle	+=  "  <div class=\"kanban-entry-inner\">";
    			varArticle	+=  "      <div class=\"kanban-label\">";
    			varArticle	+=  "          <h2><a href=\"#\">"+columns[i].article[j].nombre+"</a> <span>"+columns[i].article[j].titulo+"</span></h2>";
    			varArticle	+=  "          <p>"+columns[i].article[j].descripcion+"</p>";
    			varArticle	+=  "      </div>";
    			varArticle	+=  "</div>";
    			varArticle	+=  "</article>";
    		}
    		$("#"+columns[i].titulo).append(varArticle);
    	}
    }
  3. Hacer una llamada ajax para consumir el controller column y llame  a la funcion buildsKanban.
    $.ajax({
        	async:		false, 
            url:		"column",
            type:		'GET',
            dataType: 	'json',
            contentType:'application/json',
            mimeType:	'application/json',
            success: function(data, textStatus, jqXHR) {
            	buildsKanban(data);
            },error: function(jqXHR, textStatus, errorThrown){
            }          
        });

     

Abrimos un explorador de Internet y tecleamos http://localhost:8090/kanban/Web. Nos muestra la aplicación Kanban pero consumiendo los datos desde un servidor.

Se puede descargar el proyecto completo de https://github.com/arielolivagh/kanbanWeb

 

 

 

Java EE 4. Configurar Proyecto

Archivo pom.xml

El archivo pom (Project Object Model) es la unidas principal de un proyecto Maven que contiene información acerca del proyecto, fuentes, test, dependencias, plugins, version, etc.

Cambiar archivo pom.xml la versión más actual

Abrir el archivo en eclipse e ir a la sección build. Lo valores de source y target se deben cambiar a 1.8.

pom

El proyecto marcara un error.

Clic con el botón derecho en el proyecto seleccionar Properties y luego Project Facets. la opción Java debe estar habilitada con la versión 1.8. Apply y OK.

pom2

Clic con el botón derecho en el proyecto seleccionar Maven y luego Update Project… Seleccionar el proyecto y OK.

pom3

El error en el proyecto desaparece.

En la sección de dependencias se muestra:

Selección_121

Vamos a actualizar a las versiones más recientes de los componentes web:

Dependencia para javax.servlet

Ir al link http://mvnrepository.com/ el cual es el repositorio oficial de Maven. Escribir javax.servlet y Search. Se muestran las coincidencias, seleccionar Java Servlet API.

Selección_122

Lo recomendable es elegir el release mas reciente. Clic en 3.1.0.

Selección_123

Muestra la dependencia correspondiente en la sección de Maven. Remplazamos la dependencia en el archivo pom.xml.

Selección_124

Dependencia para javax.servlet.jsp

En el repositorio de Maven buscar javax.servlet.jsp y seleccionar JavaServlet  Pages(TM) API. La ultima versión disponible es la 2.2.

Selección_127

Copiar la dependencia y reemplazarla en pom.xml. El resultado es:

Selección_128

Actualizar descriptor de despliegue

Abrir el archivo web.xml que se encuentra en la ruta nombreDelProyecto/scr/main/webapp/WEB-INF/ dentro del proyecto. La rama <web-app> la reemplazamos por:

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
		 http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

Selección_129

Activar Dynamic Web Module

Con esta opción cuando creamos un servlet no se agregan en el descriptor de despliegue (web.xml) y podemos utilizar las anotaciones. Clic derecho en el proyecto -> Properties -> Project Facets -> Dynamic Web Module.

Selección_130

Dependencia para JPA

Desde el repositorio de Maven buscar eclipseLink, seleccionar EclipseLink JPA. Seleccionar el ultimo release, que es 2.6.2. y agregarlo al archivo pom.xml en la sección de dependencies.

Selección_133

Dependencia para EJB

Desde el repositorio de Maven buscar javax.ejb, seleccionar  Ejb Api. Seleccionar el ultimo release, que es 3.0. y agregarlo al archivo pom.xml en la sección de dependencies.

Selección_136

Dependencia para MySQL

Desde el repositorio de Maven buscar mysql, seleccionar MySQL Connector/J. Seleccionar el ultimo release, que es 5.1.38. y agregarlo al archivo pom.xml en la sección de dependencies.

También descargar el jar y copiarlo en ../developer/deb/. El link esta en Artifact y se llama Download( JAR).

Selección_139

Dependencia para Validator

Permite agregar validaciones en los entitys.

Desde el repositorio de Maven buscar bean validator, seleccionar Bean validator API. Seleccionar el ultimo release, que es 1.1.0.Final. y agregarlo al archivo pom.xml en la sección de dependencies.

Selección_142

Dependencia para jstl

Para evitar usar Scriplets en el proyecto.

Desde el repositorio de Maven buscar jstl, seleccionar Jstl. Seleccionar el ultimo release, que es 1.2. y agregarlo al archivo pom.xml en la sección de dependencies.

Selección_145

Probar que todavía funciona el proyecto

Después de configurar el proyecto se debe validar que sigue funcionando.

  1. Clic derecho sobre el proyecto Run As -> 1. Run On Server
  2. Seleccionamos GlassFish. Clic en Next.
  3. Pasamos el proyecto a la ventana de Configured y clic en Finish.
  4. Se muestra la ventana de «hola mundo», lo cual indica que el proyecto se ejecuto correctamente.

Selección_146

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. http://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.