sábado, 27 de febrero de 2021

Spring Boot: Página inicial con Bootstrap

 

Este es el segundo artículo de la serie sobre Spring Boot que comenzamos hace dos semanas, si quieres ver el primero puedes acceder pulsando aquí.

En el primer artículo vimos cómo descargar nuestro proyecto configurado para nuestros intereses y listo para ser importado en nuestro IDE (nosotros usaremos Eclipse).

Lo primero que vamos a hacer es importar el proyecto:

  1. File -> Import
  2. Existing Maven Projects
  3. Seleccionamos el fichero pom.xml en la carpeta donde lo hemos descomprimido y esperamos unos segundos
Cuando acabe la importación, esta es la estructura que nos aparecerá:



Con Spring Boot no necesitamos configurar el servidor, ya se encarga él de facilitarnos la vida. Lo único que tenemos que hacer es arrancar la clase BootApplication.java, que se encargará de arrancar Tomcat y dejar nuestra aplicación funcionando en el puerto 8080. 

Y si todo fuera bien, podríamos acceder a través de la URL: http://localhost:8080/

Pero ahora mismo tenemos un error de conexión con base de datos que nos impide que la aplicación arranque.

Vamos a empezar a hacer unas cuantas modificaciones para que todo empiece a funcionar.

Para poder seguir todos los cambios he creado este repositorio en Githubhttps://github.com/tecnificados/boot 

Ahora mismo tiene los siguientes commits:


Los tres primeros commits son la creación del repositorio y la subida del código que descargamos de https://start.spring.io/

El cuarto commit es una corrección para que no nos dé problemas la configuración con la base de datos, si no añadimos estas líneas en el pom.xml, nuestro desarrollo será incapaz de conectarse con la base de datos. 

 <plugin> 

 <groupId>org.apache.maven.plugins</groupId> 

 <artifactId>maven-resources-plugin</artifactId>

 <version>3.1.0</version>

 </plugin>

Los dos últimos commits son los que quiero revisar con vosotros, ya que son los que nos van permitir hacer que la aplicación arranque y trabajar con JSPs, JSTL y añadir Bootstrap a través de sus recursos (css y js).

Cambios para poder trabajar con JSPs (Commit 757e5f2)

Lo primero que vamos a hacer es arreglar el problema con la base de datos. Debemos configurarla. Vamos a utilizar MySQL. Puedes instalarlo directamente, o utilizar la máquina virtual que subimos a Mega hace unas semanas (aquí el artículo). 

No hace falta tener ninguna tabla, simplemente que el servicio esté funcionando.

Vamos a editar el fichero application.properties y dejarlo con la configuración de conexión a BBDD:

#nivel de log en la aplicación
logging.level.root=info

#Configuración de Base de Datos
 
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
#Url donde está el servicio de tu mysql y el nombre de la base de datos
spring.datasource.url=jdbc:mysql://localhost:3306/boot_demo?useSSL=false&serverTimezone=Europe/Madrid
 
#Usuario y contrasena para tu base de datos descrita en la línea anterior
spring.datasource.username=boot_demo
spring.datasource.password=boot_demo
 
#[opcional]Imprime en tu consola todo el SQL.
spring.jpa.show-sql = true

Si todo está bien ya podremos arrancar nuestro proyecto con la clase BootApplication.java

Y al acceder a través de http://localhost:8080/ veremos lo siguiente:


¿Qué es esto? Spring Security en nuestra aplicación, todo va bien.

Apagamos y vamos a decirle a Spring Security que de momento no proteja algunas páginas.

Para eso vamos a crear la clase WebSecurityConfig.java y añadiremos el siguiente contenido:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
    .authorizeRequests()
.antMatchers("/", "/login", "/resources/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
    .loginPage("/login")
    .permitAll()
    .and()
    .logout()
    .permitAll();
}
}

Con esta clase entre otras cosas configuramos el acceso libre a las rutas:
  1. /: la pagina inicial
  2. /resources/**: ruta donde estarán nuestros recursos estáticos
  3. /login: nuestra página de acceso

En el fichero application.properties añadiremos estas líneas:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

Así se configura la ruta a nuestras JSPs.

Ahora vamos a crear un controlador (StartController.java), que será el encargado de capturar las peticiones a la página inicial.

@Controller
public class StartController {
 
    @RequestMapping("/")
    public String mensaje() {
         
        return "index";
    }
}

Lo único que le decimos es que capture las peticiones a la página por defecto y las mande a la JSP index.jsp, que va a tener el siguiente contenido: 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hola</title>
</head>
<body>
Hola con Spring Boot
</body>
</html> 

Y para acabar este punto vamos a necesitar añadir la dependencia que permite ejecutar JSPs en nuestro fichero pom.xml:

<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>


Si ahora arrancamos de nuevo y accedemos a nuestro http://localhost:8080/ ahora deberíamos ver un saludo como este:

Es un poco simple, pero es un comienzo.

Cambios para desarrollar con recursos. Bootstrap añadido (Commit 37cfa22)

Este commit es muy importante, ya que vamos a crear la clase de configuración del proyecto (MvcConfig), donde vamos a poder ir añadiendo 'piezas' según las vayamos necesitando. Y la primera pieza a añadir es decirle a Spring que nos permita servir recursos estáticos como CSS y ficheros JS.

Para empezar vamos a ir por esos recursos, nos vamos a la web oficial de Bootstrap y nos descargamos la versión que nos interese (4.6 por ejemplo): https://getbootstrap.com/docs/4.6/getting-started/download/

Esto nos descargará un zip, vamos a descomprimir su contenido en la carpeta:  "src\main\webapp\resources"

Ahora ya tenemos que ya tenemos los recursos vamos a decirle a Spring dónde están y que nos permita acceder a ellos. Para esto creamos la clase MvcConfig.java


@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}

@Bean
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
}

En el método addResourceHandlers configuramos dónde están nuestros recursos y con InternalResourceViewResolver configuramos dónde están nuestras JSPs. Esto último lo habíamos escrito en las primeras líneas del application.properties, como ahora debe estar aquí, lo borramos de ese fichero.

Ahora vamos a añadir dos dependencias nuevas a nuestro fichero pom.xml:


<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>1.2.6</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>

La primera es para poder usar las etiquetas JSTL en nuestras JSPs (los recursos los añadiremos con c:url) y la segunda es para que si hacemos modificaciones en nuestras páginas, Spring detecte los cambios sin tener que reiniciar.

Y para terminar vamos a modificar nuestra página de inicio para añadir acceso a los recursos que necesitamos y darle un formato un poco más llamativo.

Aquí os dejo un par de ejemplos para que veáis cómo se insertan recursos estáticos:


<script src="<c:url value="/resources/js/vendor/jquery.slim.min.js"/>"></script>

<link rel="stylesheet" href="<c:url value="/resources/css/bootstrap.min.css"/>" >


La página inicial la he modificado basándome en el ejemplo Jumbotron de Bootstrap

De modo que ahora nuestra página de inicio, tiene un aspecto bastante diferente del anterior:


En este punto ya tenemos lista nuestra aplicación para interactuar con nuestra base de datos y poder aplicar seguridad a diferentes páginas. Y lo iremos viendo poco a poco en los siguientes artículos de la serie.

Nos vemos pronto.

sábado, 13 de febrero de 2021

Spring Boot: Introducción

 


Este el primero de una serie de artículos donde nos vamos a meter en Spring Boot.

Aquí en Tecnificados llevamos años trabajando con Spring, así que os voy a contar un poco de qué se trata.

Spring es un framework de desarrollo que contiene muchos proyectos (o módulos) que nos ayudan en el desarrollo de aplicaciones JAVA.

Por ejemplo, el más conocido es Spring MVC, que nos ayuda a generar aplicaciones web siguiendo el Modelo Vista Controlador, ayudado por la inyección de dependencias, que es la autentica revolución de este framework.

También podemos usar Spring Data para ayudarnos con las conexiones de BBDD, o Spring Security para securizar nuestra aplicación de diversas formas,... Si queréis profundizar más acerca de los diferentes proyectos, podéis acceder a esta página: https://spring.io/projects

Volviendo a Spring Boot, vamos a hacer un pequeño repaso a las fase de creación de un proyecto web sin utilizarlo:

  1. Seleccionaríamos las librerías (JARs) que necesitamos.
  2. Empezamos a codificar.
  3. Desplegamos en un servidor web (Tomcat normalmente).

Estas tres fases, normalmente no paran de iterar en un desarrollo, y a veces tenemos pequeños problemas que nos hacen perder tiempo (interacciones con el servidor sobre todo...)

Con Spring Boot esto no pasa, solo te tienes que centrar en la codificación, ya que con un pequeño paso inicial se establecen los parámetros iniciales (librería y servidor), y ya te puedes olvidar de ellos.

Pero no os asustéis, durante el desarrollo se pueden añadir más librerías (algo muy común), o cambiar de servidor (esto menos común).

Hoy os quiero enseñar a dar ese primer paso inicial. Para esto los desarrolladores de Spring han creado una herramienta online, que te permite generar la estructura inicial de tu proyecto con Spring Boothttps://start.spring.io/

Nosotros en la parte de la derecha hemos seleccionado estas opciones:


Las dependencias serán gestionadas con Maven, el desarrollo será en JAVA, utilizaremos la versión 2.4.2 de Spring Boot, y le ponemos nombre a nuestro desarrollo.



Seleccionamos War porque es una aplicación web, y por último seleccionamos JAVA 11.

En la parte de la derecha vamos a elegir nuestras dependencias iniciales:


Para empezar hemos elegido:
  1. Spring Web: desarrollo web, con Spring MVC que además nos permite realizar desarrollos REST.
  2. Spring Security: vamos a añadir una seguridad básica a nuestra aplicación, y controlar que las llamadas REST sean internas.
  3. Spring Data:  toda la gestión de conexión con BBDD la realizará este módulo
  4. MySQL Driver: esta será nuestra BBDD.

En la parte de abajo pulsaremos el botón "GENERATE"


Y esto nos descargará un fichero "boot.zip", para poder abrirlo con nuestro IDE favorito (el mío es eclipse).

Y de momento lo dejamos aquí, nos vemos pronto.




sábado, 6 de febrero de 2021

SQuirreL SQL Client - Un cliente para dominarlos a todos


Llevaba bastante tiempo buscando un cliente SQL (con entorno gráfico) que fuera ligero y que pudiera utilizar con distintas bases de datos (Oracle, SQL Server, PostgreSQL, MySQL, SQLite,...) y buscando un cliente para Apache Derby me he encontrado con esta maravilla.

Toda la información del proyecto se encuentra aquí: http://www.squirrelsql.org

Está desarrollado con JAVA (versión desde 1.8 a 14), para empezar ese es el único requisito que tenemos que cumplir.

En la sección de descargas tenemos que elegir el jar que se ajuste a nuestro sistema operativo. Una vez descargado, hacemos doble click en él, y se inicia un instalador de tipo next, next, next...


En el caso de Windows la ruta por defecto, da un error por permisos:


Yo la he cambiado a "D:\squirrel" y todo ha acabado bien.

Una vez instalado, si lo ejecutamos, veremos una pantalla en blanco, antes de nada debemos pulsar en la pestaña "Drivers" de la izquierda:


Y aquí se despliega una lista con todos los drivers que soporta. En teoría, con cualquier base de datos que soporte un driver JDBC 2.0

Solo tenemos que descargarnos el driver que nos interese para poder añadir su ruta al cliente.

Para este ejemplo he utilizado el driver de MySQL.

Si sabemos dónde descargar el driver, no hay problema, es una de las opciones de cada driver que aparece en el listado:


Una vez descargado se asigna la ruta del driver como se ve en la siguiente imagen


Ahora ya podemos crear nuestra conexión a través de la pestaña "Aliases":



Cuando todo esté bien configurado y nos conectemos veremos toda la información de la base de datos.



Y si queremos lanzar consultas a través de un editor de texto solo tendremos que pulsar aquí:



Y creo que poco más que contar. Espero que os ayude tanto como a mí.

Yo voy a configurar MongoDB y Apache Derby para empezar con cierta migración.

Hasta pronto.










domingo, 31 de enero de 2021

Cambio disco duro a SSD en ordenador portátil


Esta semana he aprovechado para cambiar el disco duro a mi portátil, lo he cambiado por un SSD y los resultados son asombrosos: velocidad absoluta.

Os pongo en antecedentes: es un "Acer Aspire E15", tiene más de cinco años y aunque lo he formateado ya un par de veces, con Windows tardaba unos cinco minutos en estabilizarse para poder trabajar.

Después de desmontar el PC he visto que además de cambiar el disco duro, si compro un adaptador para un disco duro interno ("caddy" para los amigos) puedo dejar el disco duro actual como secundario.

No me apetece volver a formatear el PC, así que voy a comprar un adaptador de SATA a USB. Así podré "clonar" el disco duro actual en el nuevo.

Para realizar esta tarea he necesitado comprar tres elementos:

  • El disco duro: había discos duros más baratos, pero prefiero apostar por una buena marca: Western Digital. Más información.
  • El adaptador de disco duro interno. Más información.

                                 



Para realizar el clonado del disco, he utilizado la herramienta: Macrium Reflect Free (https://www.macrium.com/reflectfree). He probado varias, pero esta es la mejor con diferencia. En este tutorial hay más herramientas, y el proceso a seguir con todas ellas. No tiene pérdida.
Después de esto solo nos queda seguir estos pasos:
  1. Extraer el disco duro original y meterlo dentro del "caddy".
  2. Colocar el nuevo disco donde estaba el original.
  3. Volver a colocar los tornillos y la tapa.
  4. Colocar el caddy y apretar el último tornillo.
Después de esto he conseguido que el PC arranque y esté listo para trabajar en menos de 10 segundos.

¡¡¡Larga vida al SSD!!!

PD: Cuando abrí el portátil la primera vez esto es lo que vi:


Era la primera vez que abría el PC y el ventilador estaba muy sucio, lo limpié con un pincel limpio y seco. En unos minutos no había rastro de polvo y suciedad en las aspas.





domingo, 4 de octubre de 2020

Java 15 ya está aquí

 


Hace unos días que se ha liberado la versión 15 de nuestro lenguaje de programación favorito, y ya podemos probarla y actualizarnos a través de la versión OPENJDK.

Se puede consultar el estado y las novedades que contiene en la URL:  https://openjdk.java.net/projects/jdk/15


Y para descargarla podemos ir al siguiente enlace: https://jdk.java.net/15/

Para actualizarnos (en Windows), sólo tenemos que descargarnos el zip, descomprimirlo y actualizar nuestras variables de entorno:

  • Yo lo he descomprimido en C:\java\OpenJDK15

  • Y he actualizado las variables de sistema "JAVA_HOME":

  • Y "Path":

Para verificarlo, solo tenemos que lanzar un "java -versión" en nuestra consola ("cmd"):


Con esto, ya estamos listos para utilizar las mejoras que trae (tengo muchas ganas de probar los bloques de texto).

Para acabar he hecho un pequeño proyecto de consola para consumir URLs a través del verbo HEAD, con esto podremos controlar de manera rápida si esa URL existe, sin tener que consumirla y gastar recursos (nuestros y del servidor).

Podéis ver el pequeño proyecto en la siguiente URL: https://github.com/tecnificados/urlChecker

Lo iremos evolucionando en los próximos POSTS.

lunes, 29 de junio de 2020

Colaborando en la Guía práctica para la publicación de Datos Abiertos usando APIs



Hace un par de meses contactaron con nosotros para ofrecernos revisar la guía que se estaba confeccionando en https://datos.gob.es para publicar Datos Abiertos a través de APIs.

Fue un placer colaborar con ellos (¡es el Portal Nacional de Datos Abiertos!).

Además se juntaban dos de los temas que más me gustan actualmente: Datos Abiertos y las APIs REST. 

La guía se lee en 20 minutos y repasa los conceptos fundamentales de las APIs REST orientadas a Datos Abiertos. Y al final, sale mi nombre y todo.

El documento se publicó el día 25 y lo tenéis disponible en la siguiente pulsando aquí.

La imagen del título se ha obtenido del portal datos.gob.es en concreto de la URL: https://datos.gob.es/sites/default/files/styles/doc_image/public/doc/image/guia_api_0.jpg

martes, 12 de mayo de 2020

Copias de seguridad con AOMEI Backupper



Con la llegada de la última actualización de Windows 10 tenía claro que quería actualizar, pero pasando antes por un formateo, y según lo que decían los medios especializados, no me atrevía a hacerlo sin hacer un backup total del sistema. 

Estuve buscando alguna herramienta que me permitiera hacer una "imagen" del sistema, que me dejara restaurarla a través un USB autoarrancable y que fuera gratuita.

Y rápidamente llegué a la herramienta AOMEI Backupper, que cumple todo lo que yo buscaba (sólo te piden tu email).

Tienen la versión "free" para el hogar, y la versión "profesional" más orientada a las empresas, yo me quedé con la primera.

Es muy fácil de instalar y se apoya en asistentes para hacer todas las tareas que ofrece, por lo que es muy intuitivo y rápido. Además hace los backups "en caliente", así que puedes estar navegando tranquilamente mientras se genera la copia de seguridad.

Las opciones que ofrece son las siguientes (lo que necesitamos, ni más ni menos):


Si elegimos respaldar, las opciones se multiplican por dos:



Pero como se puede ver, siguen siendo operaciones que comprendemos.

Además nos deja generar un USB para realizar la tarea de respaldo, desde el menú "Herramientas" en la pantalla principal:



Yo seleccioné basado en Windows PE, y funcionó perfectamente.


En definitiva, que pasa a ser una de mis utilidades indispensables.

Si os interesa podéis acceder a su página desde este enlace: https://www.ubackup.com/download.html