miércoles, 30 de noviembre de 2016

Resumen videos Spring Boot 101 Parte 3/4. Thymeleaf y Angular

Como siempre damos las gracias a Dan Geabunea y su canal de videos. Hemos visto en una entrada anterior como pasar parámetros al "Model" de Spring. Thymeleaf, que es un sistema de plantillas para mostrar HTML, puede accedeer a estos parámetros del "Model". Veamos un poco como utilizar Thymeleaf, y mas tarde Angular 1.xx para dar mas protagonismo a la parte de la "Vista"

0. Indicar el acceso a una página Thymeleaf

Para ello tenemos que crear un controlador que contenga las anotaciones siguientes:

@Controller:
Anotación de clase que indica que es un controlador

@RequestMapping("/")
Anotación de clase o método  que indica donde localizar un servicio web

Además debemos actualizar el modelo para que Thymeleaf pueda acceder a estas variables que guarda el modelo.

package com.ximodante;

import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.ui.Model;

@Controller
public class ViewController {
 
 private String appMode;
 
 @Autowired
 public ViewController(Environment env){
  appMode=env.getProperty("app-mode");
 }
 
 @RequestMapping("/")
 public String index(Model model){
  model.addAttribute("datetime", new Date());
  model.addAttribute("username", "Informatica Dantesca");
  model.addAttribute("mode", "production");
  return "index";
 }

}


1. Crear una página Thymeleaf


Por otra parte, para mostrar una plantilla de Thymeleaf, tenemos que hacer estos pasos:

1. Colocar las librerías javascript o css que vayamos a utilizar en la carpeta scr/main/resources/static. Si queremos ser mas organizados se podran crear diferentes carpetas dentro de static (por ejemplo una para los "css",  otra para los "js", etc). En nuestro caso vamos a descargar, desde sus respectivas webs:


2. Crear una plantilla Thymeleaf en la carpeta scr/main/resources/static/templates.  En nuestro caso le vamos a llamar index.html .

Vamos a ver pequeños detalles

2. Separación de comportamiento entre producción y desarrollo

En Thymeleaf haremos uso de las clausulas condicionales "if". En el modelo podemos incluir una variable llamada "mode" que tome valores "development" o "production". Si es en desarrollo, vamos a utilizar las librería "bootstrap.min.css", mientras en producción vamos a utilizar "bootstrap.css". Para ello incluimos el siguiente código:

  <link th:if="${mode == 'development'}" rel="stylesheet" href="../static/bootstrap.css" th:href="@{/bootstrap.css}" />
  <link th:if="${mode == 'production'}" rel="stylesheet" href="../static/bootstrap.min.css" th:href="@{/bootstrap.min.css}" />

Thymeleaf también permite formatear variables. En este caso la fecha (que en el modelo la hemos guardado con el nombre "datetime"

  <p th:text="${#dates.format(datetime,'dd MMM yyyy HH:mm:ss')}" class="text-muted">Page was rendered today.</p>

3. Inclusión de código Angular 1.xx en la plantilla

No es mi misión explicar como va Angular. Pero veamos algunos detalles:
Indicación de la aplicación y módulo de código realizados en Angular, en nuestro caso lo hemos indicado en el <body>. Observar que el controlador tiene el alias "vm".


  <body ng-app="app" ng-controller="BookingsController as vm">


Para ver el contenido de las variables en angular hemos utilizado {{vm.variable}} o similar.
Tambien utilizamos la archirepetida cláusula ng-repat

El contenido de la plantilla Thymeleaf va a ser el siguiente:


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">

 <head>
  <meta charset="UTF-8" />
  <title>Hotel Booking App</title>
  <link th:if="${mode == 'development'}" rel="stylesheet" href="../static/bootstrap.css" th:href="@{/bootstrap.css}" />
  <link th:if="${mode == 'production'}" rel="stylesheet" href="../static/bootstrap.min.css" th:href="@{/bootstrap.min.css}" />
  <script type="text/javascript" src="/static/angular.min.js" th:src="@{angular.min.js}"></script>
  <script type="text/javascript" src="/static/app/module.js" th:src="@{/app/app.module.js}"></script>
  <script type="text/javascript" src="/static/app/bookings.controller.js" th:src="@{/app/bookings.controller.js}"></script>
 </head>
 
 <body ng-app="app" ng-controller="BookingsController as vm">
  <header>
   <nav class="navbar navbar-default">
    <div class="container-fluid">
     <a class="navbar-brand" href="#"> Booking Demo JAJAJAJA</a>
    </div>
    <p class="navbar-text navbar-right" th:text="'Signed as ' + ${username}" style="margin-right: 10px:">Signed as Anonymous</p>
   </nav>
  </header>
  
  Hello Bootstrap! How are you Folk? And you, Thymeleaf? 
  <div>{{vm.prova}}</div>
  
  <div>
   <div class="row">
    <div class="col-lg-offset-2 col-lg-8">
     <!-- Get all booking or only affordable ones -->
     <div class = "btn-group" role="group">
      <button ng-click = "vm.getAll()"        type="button" class = "btn btn-default">All</button>
      <button ng-click = "vm.getAffordable()" type="button" class = "btn btn-default">Less than {{vm.min}}</button>
     </div>
     <!--  Display bookings in a table -->
     <table class="table">
      <thead>
       <tr>
        <th>Hotel</th>
        <th>Nights</th>
        <th>Price</th>
        <th>Total</th>
        <th style="width: 90px"></th>
       </tr>
      </thead>
       <tr ng-repeat="booking in vm.bookings">
        <td>{{booking.hotelName}}</td>
        <td>{{booking.nbOfNights}}</td>
        <td>{{booking.pricePerNight}}</td>
        <td>{{booking.totalPrice}}</td>
        <td>
         <button class="btn btn-danger" ng-click="vm.deleteBooking(booking.id)">Delete</button>
        </td>
        
       </tr>
     </table>
    </div>
   </div>
  </div>
  
  <footer class="footer" style="position:absolute; bottom:0;background-color: #f5f5f5;">
   <div class="container">
    <p th:text="${#dates.format(datetime,'dd MMM yyyy HH:mm:ss')}" class="text-muted">Page was rendered today.</p>
   </div>
  </footer>
  
  

 </body>
</html>


4. Creación del código js de ángular

Para ello vamos a utilizar la carpeta scr/main/resources/static/templates para guardar 2 ficheros angular:

  • app.module.js (aplicación)
  • bookings.controller.js (controlador)

Normalmente en angular se tiene una aplicación y varios módulos que dependen de ella. En este caso solo tenemos una aplicación.

Veamos su código


(function(){
 'use strict';
 
 angular.module('app',[]);
})();


Poco puedo decir yo aquí. Veamos el otro código. Aquí hay que remarcar como hacemos peticiones GET y POST con ángular a nuestros servicios REST, que hemos definido

Veamos como hacemos una petición GET que nos devuleve una promesa:


function getAll(){
   var url = "/bookings/all";
   var bookingsPromise = $http.get(url);
   bookingsPromise.then(function(response) {
    vm.bookings = response.data;
   });
  }

Veamos como realiza una petición POST

function deleteBooking(id){
   var url = "/bookings/delete/" + id;
   $http.post(url).then(function(response){
    vm.bookings = response.data;
   });
   
  }


Tambien hay que publicar las funciones creadas:

vm.bookings = [];
  
  vm.getAll = getAll;
  vm.getAffordable = getAffordable;
  vm.deleteBooking = deleteBooking;
  vm.prova="Mi prueba";
  vm.min=23;


Y el contenido final del fichero js booking.controller.js es:

(function () {
 'use strict';
 
 angular
  .module('app')
  .controller('BookingsController',BookingsController);
 
 BookingsController.$inject = ['$http'];
 
 function BookingsController($http) {
  var vm = this;
  
  vm.bookings = [];
  
  vm.getAll = getAll;
  vm.getAffordable = getAffordable;
  vm.deleteBooking = deleteBooking;
  vm.prova="Mi prueba";
  vm.min=23;
  
  init();
  
  function init(){
   getAll();
  }
  
  function getAll(){
   var url = "/bookings/all";
   var bookingsPromise = $http.get(url);
   bookingsPromise.then(function(response) {
    vm.bookings = response.data;
   });
  }
  
  function getAffordable(){
   var url = "/bookings/affordable/" + vm.min;
   var bookingsPromise = $http.get(url);
   bookingsPromise.then(function(response) {
    vm.bookings = response.data;
   });
  }
  
  function deleteBooking(id){
   var url = "/bookings/delete/" + id;
   $http.post(url).then(function(response){
    vm.bookings = response.data;
   });
   
  }
 }
})();

Resumen videos Spring Boot 101 Parte 2/4. Fichero de configuración, JPA

Continuamos con un resumen de lo mas destacado de  nuestro querido amigo Dan Geabunea y su inestimable recurso de Romanian Coder.


1. Fichero de configuración application.properties

En este fichero podemos guardar las siguientes propiedades:

1. Las que afectan a las de documentación JSONDoc que hemos visto en una entrada anterior.

2. Para inidicar donde se guardan los archivos de BD. Por ejemplo para h2 se puede hacer

   spring.datasource.url=jdbc:h2:file:./bookings.db

3. El puerto donde correrá nuestra aplicación

  server.port = 8080


4. Variables que vamos a utilizar para configurar nuestra aplicación

  app-mode = development  (para distinguir entre development o production)

Para el caso de las variables a utilizar en la aplicación se puede hacer referencia a ella mediante 2 métodos que hablaremos mas tarde.

2. Recuperar variables de aplication.properties

Para ello podemos actuar de 2 maneres distintas

MÉTODO 1: Inyección de propiedad


@Value("${app-mode}")
private String appMode;


MÉTODO 2: Inyección de constructor


private String appMode2;
public DemoController (Environment env) {
  appMode2=env.getProperty("app-mode");
}

Siendo DemoController el nombre de la clase sobre la que creamos el constructor.

3. El Model de Spring

Spring proporciona un lugar donde guardar ciertas variables que nos serán útiles para dar un comportamiento concreto al programa. Estas variables se guardan en el "Model".
Para guardar las variables en el Model hay un método que se llama addAttribute. Podemos por ejemplo, añadir al modelo, entre otras, las variables recuperadas de application.properties. Veamos un pequeño ejemplo

package com.ximodante;

import java.util.Date;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.ui.Model;

@Controller
public class ViewController {
 
 @Value("${app-mode}")
 private String appMode;
 
 @RequestMapping("/")
 public String index(Model model){
  model.addAttribute("datetime", new Date());
  model.addAttribute("username", "Informatica Dantesca");
  model.addAttribute("mode", appMode);
  return "index";
 }

}
Aquí estamos adelantando lo que veremos mas adelante, que es mostrar una plantilla Thymeleaf llamada "index.html" cuando llamamos a nuestra aplicación con la ruta "http://localhost:8080"


4. JPA muy simple


PASO 1:
Cuando creamos el proyecto en la entrada anterior le hemos dicho utilizar JPA y h2

PASO 2:
Crearemos una entidad (POJO) y le indicaremos entre otras las siguientes anotaciones:

@Entity:
Anotación a nivel de clase para que JPA sepa que es una entidad a persistir

@Id:
Anotación sobre un atributo numérico para que sea clave única

@GeneratedValue(strategy = GenerationType.SEQUENCE)
Para que sea autogerado e incremental

Veamos la clase en concreto a la cual hemos quitado verbosidad con Lombok


package com.ximodante;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import lombok.Getter;
import lombok.Setter;

@Entity
public class HotelBooking {
 @Id
 @GeneratedValue(strategy = GenerationType.SEQUENCE)
 @Getter private long id;
 @Getter @Setter private String hotelName;
 @Getter @Setter private double pricePerNight;
 @Getter @Setter private int nbOfNights;
        

 public HotelBooking() {
  super();
 }

 public HotelBooking(String hotelName, double pricePerNight, int nbOfNights){
        this.hotelName = hotelName;
        this.pricePerNight = pricePerNight;
        this.nbOfNights = nbOfNights;
 }
    
    
 public double getTotalPrice(){
        return pricePerNight * nbOfNights;
 }

    
}


5. JpaRepository

En Spring podemos heredar de la interfaz JpaRepository y adapatarla a nuestra clase. pero con la "ventaja" que Spring nos da de tener métodos por "convención". Notar el uso de la anotación @Repository  Veamos interfaz adaptada:

package com.ximodante;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BookingRepository extends JpaRepository < HotelBooking,Long >{
 List < HotelBooking > findByPricePerNightLessThan(double price);
}

Mirar el método findByPricePerNightLessThan, el cual no hemos creado en ningún sitio!!! Pero que si que podemos ver en la documentación de Spring.

6. Generador de datos en la BD con CommandLineRunner

Spring proporciona generadores de datos en las BD de prueba. Hay que tener cuidado ya que tal como tenenos nuestro proyecto, está pensado en el desarrollo y no en la producción ya que se borran todos los datos de la BD y se crean solo los que se indican en el generador.

En cualquier caso Spring te permite esta alimentación de la BD mediante la implementación de la intefaz CommandLineRunner y haciendo uso del JpaRepository. Notar las notaciones @Component y @Autowired.
Veamos como guardamos llenamos la BD con información de la entidad mostrada arriba


package com.ximodante;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class DatabaseSeeder implements CommandLineRunner {

 private BookingRepository bookingRepository;
 
 @Autowired
 public DatabaseSeeder(BookingRepository bookingRepository){
  this.bookingRepository = bookingRepository;
 }
 
 @Override
 public void run(String... arg0) throws Exception {
        List <HotelBooking > bookings=new ArrayList<>();
        
     bookings.add(new HotelBooking("Palas",14.5,3));
     bookings.add(new HotelBooking("Ibis",24.5,2));
     bookings.add(new HotelBooking("Atenea",20,5));
     bookings.add(new HotelBooking("Palasiet",200,1));
  
     this.bookingRepository.save(bookings);
 }

}


7. REST con JPA


Nuestro querido amigo, en su tutorial, nos enseña a como integrar todas estas tecnologías. Aquí listo la clase que ofrece las funciones de persistencia a traves de servicios REST. Como los hemos documentado don JSONDoc, podemos verlos tal como lo hicimos en le punto anterior


package com.ximodante;


import java.util.List;

import org.jsondoc.core.annotation.Api;
import org.jsondoc.core.annotation.ApiMethod;
import org.jsondoc.core.annotation.ApiPathParam;
import org.jsondoc.core.pojo.ApiStage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "/bookings")
@Api(
 name = "Hotel Booking API",
 description = "Provides a list of methods that manage hotel bookings",
 stage = ApiStage.RC)

public class BookingController {

 private BookingRepository bookingRepository;
 
 @Autowired
 public BookingController(BookingRepository bookingRepository){
     this.bookingRepository=bookingRepository;
    }

    @RequestMapping(value="/all" ,method = RequestMethod.GET)
    @ApiMethod(description = "Get all hotel bookings from database")
    public List getAll(){
     return this.bookingRepository.findAll();
    }
    
    
    @RequestMapping(value = "/affordable/{price}", method = RequestMethod.GET)
    @ApiMethod(description = "Get all hotel bookings from database whose price is under the provided value")
    public List getAffordable(@ApiPathParam(name = "price") @PathVariable double price){
     return this.bookingRepository.findByPricePerNightLessThan(price);
    }

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    @ApiMethod(description = "Create a hotel booking and save it to the database")
    public List create(@RequestBody HotelBooking hotelBooking){
     this.bookingRepository.save(hotelBooking);
     return this.bookingRepository.findAll();
     
    }
    @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
    @ApiMethod(description = "Deleta a hotel booking whose id is the provided value")
    public List remove(@ApiPathParam(name = "id") @PathVariable long id) {
     bookingRepository.delete(id);
     return this.bookingRepository.findAll();
    }
}








Resumen videos Spring Boot 101 Parte 1/4. Creación del proyecto, Web services y documentacion WS con JSONDoc

Después de seguir con gran deleite y algún tropiezo los magníficos videos de Spring de Dan Geabunea, con su seudónimo Romanian Coder, voy a realizar un pequeño resumen de lo mas imporante.

1. Creación de un proyecto Spring Boot con Eclipse WST


Para ello se hace

File-> New -> Eclipse Starter Project

Se le da nombre al proyecto en este caso springboot001,  y al grupo y paquete en mi caso le doy com.ximodante. a las alturas que estamos creo que es conveniente indicar la versión de Java la 1.8
y por la comodidad que da Maven, es conveniente elegirlo.


Se le da a Next y tenemos la siguiente pantalla

Y se eligen
1. Actuator que es un informador de la aplicación con múltiples indicadores
2. Thymeleaf que es un sistema de plantillas web
3. H2 como BD. Se podría elegir cualquier otra
4. Web para generar entornos web
5. JPA para la persistencia
6. Lombok para evitar la verbosidad de getters i setters

Si se hace por primera vez, no aparecereran con "Frequently Used", sinó  que se tendrá que buscarlos en cada una de sus categorías.




Ahora le damos al Finish y ya tenemos creado el proyecto.

Si entramos al eclipse WTS, ya podemos ver nuestro proyecto, y dentro del src/main/java, aparece nuestro paquete com.ximodante y dentro de él aparece la clase Springboot001Application que se puede ejecutar como "Spring Boot Application"


2. Indicación de las direcciones de acceso nuestro contenido web como servicio REST


Para ello vamos a utilizar las anotaciones;

@RestController:
que es una anotación de clase indicando que va a suministrar información web.

@RequestMapping(value ="/direccion_Contenido/{parametro}", method = RequestMethod.GET)):
Que es una anotación tanto de clase como de  método que especifica donde localizar el servicio REST. Cuando existe esta anatación tanto en la clase como en el método, entonces se concatena la dirección de la clase (como prefijo) a la del método para acceder a dicho método. 
Si indicamos parámetros, estos se especifican entre llaves.
Por omisión, se utiliza el método GET, pero para actualizar valores en un POJO es conveniente utilizar los convenios de REST para estos casos que es POST (hay algunos mas como DELETE, HEAD, PUT, TRACE..)

@PathVariable:
Es una anotación a nivel de parámetro del método para indicar que es el parámetro que se incluye en la dirección tal como se indica en el @RequestMapping con parámetro.  Veamos como queda una clase simple que solo saluda a un amigo cuyo nombre se lo pasamos como parámetro.

package com.ximodante;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value="/hello")
public class DemoController {
 
 @RequestMapping(value="/friend/{name}", method = RequestMethod.GET)
 public String HelloFriend(@PathVariable String name){
  return "Hello! You are my friend " + name + ". Nice to hear from you again!";
 }

}

3. Documentación de los servicios REST con JSONDoc

PASO 1:

Tal como se explicó en una entrada anterior para añadir una nueva dependencia a un proyecto con Maven, se procerá a añadir estas 2:

groupId:     org.jsondoc
artifactId:  spring-boot-starter-jsondoc

y

groupId:     org.jsondoc
artifactId:  jsondoc-ui-webjar

respecto a las versiones se puede consultar a Maven Repository y ver cual es la última

Si se quiere saber mas visitar la web de jsondoc.


PASO 2:

Ahora hay que inidicar en el fichero application.properties de la carpeta src/main/resources, las siguientes entradas

jsondoc.version=1.0
jsondoc.basepath=http://localhost:8080
jsondoc.packages[0]=com.ximodante


Y Indicando que versión es, que PATH es el que se utiliza y en que paquete java se encuentra la clase a utilizar.

PASO 3:

Ahora a la clase principal SpringBoot001Application.java hay que darle esta anotación

@EnableJSONDoc 

quedando

codigo java


package com.ximodante;

import org.jsondoc.spring.boot.starter.EnableJSONDoc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableJSONDoc
public class Springboot001Application {

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


fin codigo java


PASO 4:  Y la clase anterior en cuestión hay que nutrirla con las siguientes anotaciones de JSONDoc



@API (name="nombre", description="descripcion del WS", stage = ApiStage.RC):
Que es una anotación de clase indicando el nombre de la API, descripción de web service y en que estado esta (si deprecada etc)

@ApiMethod( description = "descripción del método"):
Que es una anotación de método donde se indica que hace

@ApiPathParam(name="name"):
Que es una anotación de parámetro del método  que utilizamos

Por tanto nuestra clase queda

package com.ximodante;

import org.jsondoc.core.annotation.Api;
import org.jsondoc.core.annotation.ApiMethod;
import org.jsondoc.core.annotation.ApiPathParam;
import org.jsondoc.core.pojo.ApiStage;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value="/hello")
@Api( name = "Greeting API",
      description = "Provides methods for greeting friends.",
      stage =ApiStage.RC)


public class DemoController {
 
 @RequestMapping(value="/friend/{name}", method = RequestMethod.GET)
 @ApiMethod( description = "Greets friend by name")
 public String HelloFriend(@ApiPathParam(name="name") @PathVariable String name){
  return "Hello! You are my friend " + name + ". Nice to hear from you again!";
 }

}


PASO 5: 

Comprobamos

Ejecutamos nuestra classe principal SpringBoot001Application.java como Spring Boot Application

Abrimos el navegador con la direccion http://localhost:8080/jsondoc-ui.html

Le indicamos el parámetro http://localhost:8080/jsondoc y nos aprece esta pantalla con la documetación de los servicios REST. Cada uno que juegue con ella y pruebe a realizarlos desde esta gtran utilidad.









lunes, 28 de noviembre de 2016

Instalar Insomnia (Cliente REST) en Ubuntu

Veamos los pasos a seguir

1. Descargar el fichero comprimido con extension ".deb" desde la página de descarga de Insomnia.

2. Con el botón derecho se indica abrir con instalación de programas, y ya se instala, ya que las ficheros con extensión .deb los reconoce el instalador de archivos. Más fácil no puede ser

lunes, 21 de noviembre de 2016

JDBC para MS SQL-Server

La última versión del "jar" de de MS para SQL Server no funciona para SQL-Server 2000 o versiones antiguas.

Mirando con Google, he encontrado una referencia para sustituir los jars de MS por los de de jTDS que son "open source".

Si utilizamos Maven


1. Jar de Microsoft


1.  Indicar esta dependencia a Maven

  • group id: com.microsoft.sqlserver
  • artifact id: mssql-jdbc
  • version: 6.1.0.jre8 (o la que haya)
2.  Indicar la clásica sentencia "Class.for.Name"
  • Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
3. Crear la conexión
  • java.sql.Connection con = java.sql.DriverManager.getConnection("jdbc:sqlserver://serverNameOrIP:1433;databaseName=miBaseDeDatos;user=usario;password=xxxx;");
         Siendo : 
     serverNameOrIP: el nombre o dirección IP del servidor de la Base de datos
     1433: el puerto por el que solicitamos peticiones a la Base de datos.
     miBaseDeDatos: el nombre que se ha dado a la base de datos
     usuario: el nombre de usuario a atacar la base de datos
     xxxx: la contraseña de dicho usuario


2. Jar de jTDS


1.  Indicar esta dependencia a Maven

  • group id: net.sourceforge.jtds
  • artifact id: jtds
  • version: 1.3.1 (o la que haya)
2.  Indicar la clásica sentencia "Class.for.Name"
  • Class.forName("net.sourceforge.jtds.jdbc.Driver");
3. Crear la conexión
  • java.sql.Connection con = java.sql.DriverManager.getConnection("jdbc:jtds:sqlserver://serverNameOrIP:1433;databaseName=miBaseDeDatos;instance=MSSQLSERVER;user=usario;password=xxxx;");
         Siendo : 
     serverNameOrIP: el nombre o dirección IP del servidor de la Base de datos
     1433: el puerto por el que solicitamos peticiones a la Base de datos.
     miBaseDeDatos: el nombre que se ha dado a la base de datos
     usuario: el nombre de usuario a atacar la base de datos
     xxxx: la contraseña de dicho usuario


Con esta sustitución, una aplicación que funcionaba con el jar de MS, ahora puede funcionar con el jar de jTDS sin cambiar el resto del códogo (en teoría).


miércoles, 16 de noviembre de 2016

Añadir una nueva dependencia en Eclipse-MAVEN

Dado un proyecto Maven en Eclipse, si queremos añadir una nueva dependencia, en este caso lombok del que ya hemos hablado antes, puede suceder que nos rechace.

Veamos el ejemplo, en este caso editamos el pom.xml y vamos a la pestaña de Dependencies y mediante el boton Add (para añadir la dependencia)




Y metemos la dependencia


pero nos aparece un error que no encuentra la dependencia


Solución

Tal como aparece en este enlace de stackoverflow,  hay que hacer:

(Menu) Window -> Show View -> Other -> Maven -> Maven Repositories
In la ventana que aparece:
Right-click sobre Global Repositories (http://repo.maven.apache.org/maven2)" y seleccionar "Rebuild Index"




Después de bastante tiempo de descarga,  Right-click en el proyecto -> Maven -> Add Dependency y comenzamos a escribir "projectlombok" en los resultados de búsqueda aparece


y ya aparece en las dependencias de Maven, tal como queríamos



viernes, 11 de noviembre de 2016

Instalar STS (Spring Tool Suite) en Ubuntu

Los pasos a seguir son

1. Descargar el fichero comprimido tipo"tar" o el formato que se disponga desde la página de descarga de STS.

2. Indicar a la variable de entorno "PATH", donde se ha descargado (o guardado) el ejecutable (STS).
Para ello podemos crear un fichero sts.sh en el directorio etc/profile.d (siguiendo instrucciones de la entrada anterior) con la siguiente información

export STS_HOME=/ruta completa del directorio padre que contiene STS
export PATH="$PATH:$STS_HOME"

3. Hacer que la aplicación sea visible en el Launcher de Ubuntu, creando el fichero sts.desktop en la carpeta /usr/share/applications, con el contenido que se indica en una entrada anterior, y a funcionar.

4. Si se cree neceario instalar Lombok para no tener que teclear los setters y getters, consultar la esta entrada.

5. Probar a ver si funciona.




miércoles, 9 de noviembre de 2016

Acabemos con la "verbosidad" de Java (I): Proyecto Lombok

Siempre se ha hablado de la verbosidad de Java. Y llevan toda la razón. ¿Para que tanto código "boiler plate"?

Una de las cosas mas estúpidas a mi parecer son los "getters" y "setters" o métodos para leer y asignar los atributos de una clase.

El problema aparece, en que por convenio, la nomenclatura preestablecida de los getters y setters se aprovecha en algunos frameworks, y por tanto, hayq ue descartar el crear los atributos como públicos.

A nuestra ayuda vienen algunas soluciones:

1. Lenguaje Groovy: Es una buenísima opción si no fuera por su lentitud (según he leído, es alrededor de 8 veces mas lento que Java, que de por si ya peca de lento respecto a C)

2. Lenguaje Klotin: Es una alternativa que no descarto hoy en dia, ya que tambien trabaja sobre la JVM y parece ser que tiene los índices de velocidad similares a Java.

3. Proyecto Lombok: Es lo que vamso a utilizar ahora. Para ello se utilizan las anotaciones @Getter y @Setter y no tenenos que crear nada más. Para mi es una buena idea.


Instalación y utilización

1. Primeramente nos descargamos la jar de lombok.

2. Podemos instalarla en nuestro entorno integrado (IDE de Eclipse, STS)  como una especie de plugin ejecutando:

  java -jar lombok.jar

  Seguimos las intrucciones y le indicamos cual es la ruta a nuestro ejecutable (eclipse o STS) y el programa se envarga de insertar una entrada al eclipse.ini o sts.ini que afecta a la máquina virtual (opción -vmargs) mediante el siguiente parámetro.

-javaagent:/home/eduard/sts-bundle/sts-3.8.2.RELEASE/lombok.jar


3. O podemos compilar las clases directamente mediante la orden de compilación

java -cp lombok.jar miclase.java

4. Si creamos una clase como Clas1, con tal de dar las anotaciones @Getter o @Setter y podemos ver el la vista "outline" los dichosos métodos.



Problemas surgidos

Si tenemos nuesto Eclipse o STS recargado con muchos plugins, la mayoria de veces, aunque se instale lombok, no va a funcionar.



Colocar un programa en el Launcher (lanzador) de Ubuntu

Nos hemos desacargado el IDE de Spring STS (Spring Tool Suite). Ahora queremos tenerlo en el Launcher o lanzador de Ubuntu.

Para ello tenemos que realizar 5 pasos.

1. Es conveniente que el PATH apunte al directorio de instalación( en mi caso /home/miusuario/sts-bundle/sts3.8.2) . Para ello actuamos tal y como indicamos en un post anterior. En base a lo que ya dijimos creamos el fichero sts.sh en el directorio /etc/profile.d 

  export STS_HOME=/home/miusuario/sts-bundle/sts3.8.2
 export PATH="$PATH:$STT_HOME"

2. Hay que crear el fichero sts.desktop en la carpeta /usr/share/applications. Que tendrá este contenido:

 [Desktop Entry]
 Name=STS 3.8.2
 Version=1.0
 Type=Application
 Terminal=false
 Comment= "Spring STS IDE 3.8.2"
 StartupNotify=true
 Exec=/home/miusuario/sts-bundle/sts-3.8.2.RELEASE/STS
 Icon=/home/miusuario/sts-bundle/sts-3.8.2.RELEASE/icon.xpm
 Categories=Development;IDE;Java;


Siendo ( Se remarcan en negrita lso valores importantes)

  Name: Un nombre que le damos 
   Version: Versión que le damos
   Type: Es importante que sea Application
   Comment: Pequeño comentario
   Exec: Ruta completa del programa ejecutable (muy importante)
   Icon: Ruta completa del icono
   Categories: Catagorización del programa

3. Añadir permisos de ejecución. Para ello entrar en una ventana de comandos, situarse en el directorio donde está el fichero (/usr/share/applications) u ejecutar:

sudo chmod +x sts.desktop 

4. Con el Nautilus (gestor de ficheros), situarse sobre dicho directorio (/usr/share/applications) y arrastrar el icono al launcher. Con ello colocamos el programa en el launcher.

5. Verificar que el programa se ejecuta en el Launcher.

OBSERVACIONES: Si no realizamos el cuarto paso( arrastarlo al lanzador), puede suceder que ejecutemos el programa STS, y si cuando aprece activo en el lanzador le decimos (con el boton derecho sobre el icono en del lanzador) que lo mantenga en el lanzador, cuando lo lanzamos desde el lanzador, una vez que nos hemops salido del programa, ya no lo lanza y no nos hace caso. Por eso es muy importante arrastrarlo al lanzador desde el Nautilus.

martes, 8 de noviembre de 2016

Spring Boot CLI

Antecedentes

Anteriormente hemos creado entradas para realizar servicios web tipo REST, utilizando el framework Spark y todo ello, a pesar de la sencillez que aportaba este framework, tenemos que apostar por otras herramientas si queremos integerar otras tecnologías de manera más rápida y sencilla. Espero que en posteriores entradas podamos ver como nos han salido las pruebas.

¿Qué es Spring Boot CLI?

Es una interfaz de línea de comandos. (Command Line Interface). Sirve para ejecutar y probar aplicaciones Spring Boot des de la línea de comandos. Preferiblemente del lenguaje groovy pero que tambien funciona en lenguaje java

¿Cómo sabe que configuración y componentes utilizar?

Mediante Spring Boot Starter y Spring Boot Autoconfigurate permite resolver las dependencias que le hacen falta.

También se vale de Groovy y Gradle (que es un gestor de dependencias) para ajustar a Spring Boot Defaults las depencencias automáticamente.

Instalación

Desde la URL de documentación de Spring Boot, podemos acceder a la descarga de un fichero "zip" o "jar". Una vez descomprimido, aparece en la carpeta "/bin" un "spring.bat" para windows o "spring" para linux, que son los que debemos utilizar para ejecutar Spring Boot CLI.

Para tener acceso a ellos hay que indicar su ruta (la del diretorio /bin) a la variable de entorno "PATH". Para ello podemos hacelo en Ubuntu tal como indicamos en una entrada anterior.  Lo que hicimos es crear un fichero llamado "spring" dentro de la carpeta /etc/profiles.d que adicionaba al PATH nuestra ruta al directorio /bin. En mi caso la carpeta es /home/misusuario/spring-2.0.0/bin

export SPRING_HOME=/home/miusuario/spring-2.0.0
PATH="$PATH:$SPRING_HOME:$SPRING_HOME/bin"


Si queremos que nos haga un AUTOCOMPLETAR, hay que establecer un vínculo en el directorio /etc/bash_completion.d para ello nos situaremos en la carptea que contiene a la carpeta shell-completion y ejecutaremos este comando:

sudo ln -s ./shell-completion/bash/spring /etc/bash_completiob.d/spring

Si reabrimos la sesión, ya podrá ver la variable de entorno PATH. O sinó podemos ejecutar las actualizaciones del PATH y a funcionar.

Probamos a ejecutar "spring" desde la línea de comados y tiene que funcionar:

spring --version

y sale 

Spring CLI v2.0.0.BUILD-SNAPSHOT

que indica que parece estar bien instalado.


Prueba

Creamos una carpeta y metemos 2 ficheros, uno en java "HelloWorld.java" y otro en groovy "HelloWorld.groovy"


HelloWorld.java

@RestController
class HelloWorld {
  @RequestMapping("/")
  public String hello() { 
    return "¡Hola informáticos de Java! " 
  }
}  


HelloWorld.groovy

@RestController
class HelloWorld {
  @RequestMapping("/")
  String hello() { "¡Hola informáticos de Groovy! " }
}    

Y ejecutamos dentro de dicha carpeta

spring run HelloWord.java

y aparece una ratahila


donde lo importante es ver que se ha habilitado el puerto HTTP:8080 de la máquina local

si abrimos en el navegador la URL : //localhost:8080/ aprecerá:


si interrumpimos el programa y ejecutamos ahora

spring run HelloWord.groovy

y aparece una ratahila similar y si abrimos el navegador ahora aparecera:

Por tanto ya hemos hecho una pequeña aplicación rest en java y groovy!



Agrademos a Journal Dev esta entrada que nos ha servido de base, y que os animo a consultar pues se explica con más detalle los pasos.


sábado, 5 de noviembre de 2016

Instalar GRADLE en Ubuntu

Si seguimos las instruciones de LinuxGnet basta con instalar un paquete de la siguiente forma

$ sudo add-apt-repository ppa:cwchien/gradle
$ sudo apt-get update
$ sudo apt-get install gradle







Una vez instalado, hacemos una sesión de terminal y ejecutamos

$ gradle tasks




Y vemos que realmente se ejecuta

UBUNTU: Variables de entorno permanentes

Si queremos que se guarden las variables de entorno de forma permanente, una de las formas más sencillas es guardarlas en un fichero con extensión ".sh" dentro del directorio "/etc/profile.d".

Por ejemplo si descargamos "spring boot CLI 2.0.0" en una carpeta, como por ejemplo "/home/miusuario/spring-2.0.0"

Podemos crear un fichero llamado "spring-2.0.0.sh" dentro del directorio /etc/profile.d"

Imaginemos que queremos tener acceso desde el PATH a esta carpeta y una carpeta tipo bin que hay dentro de ella, el contenido de dicho fichero sería:



export SPRING_HOME=/home/miusuario
export PATH="$PATH:$SPRING_HOME:$SPRING_HOME/bin"



Con esto, debemos reiniciar la sesión, y al abrir una sesion de terminal tecleamos

echo $PATH

Veremos que ya contempla esta ruta.

También se hubiera podido hacer

export SPRING_HOME=/home/miusuario
export PATH="$PATH:$SPRING_HOME:$SPRING_HOME/bin"


También se puede utilizar el fichero ~/.profile