Introducción al curso
Introducción
Antes de comenzar
Herramientas necesarias
Instalación del Spring Tools Suite IDE
Uso del foro para las dudas
¿Cómo realizar preguntas?
Recursos de introducción
Spring MVC
Creando un proyecto Web con Spring Boot
Estructura de una aplicación Spring Boot
Creando el controlador y la vista
Errores comunes a tener en cuenta
Pasar datos a la vista
Anotación @RequestMapping sobre el controlador
Introducción MVC
El objeto Model
Directiva if de Thymeleaf
Directiva each (foreach) de Thymeleaf
Anotación @ModelAttribute
Anotacion @RequestParam
Obtener varios parámetros de la URL con @RequestParam
Anotación @PathVariable
Obtener varios parámetros de la ruta con @PathVariable
Agregando recursos estáticos y estilos CSS personalizados
Inyectar valores usando la anotación @Value
Agregando otros archivos properties personalizados para los textos
Retornando redirect y forward como respuesta en métodos del controlador
Despliegue y ejecución desde terminal (deploy)
Recursos de Spring MVC y la Inyección de Dependencia
Descargar Código Fuente
Inyección de Dependencias
Creando nuevo proyecto y la clase de servicio
Inyectando mediante la interface
Introducción al contenedor y la inyección de dependencias
Inyección de dependencias vía constructor y métodos setters
Anotación @Primary
Anotación @Qualifier
Registrando componentes usando clase de configuración y la anotación @Bean
Ejemplo Factura y relaciones entre sus componentes
Registrando componente ItemsFactura
Creando el controlador FacturaController y su vista
Registrando otras lineas para la factura
Ciclo de vida del componente
Contextos (Scope) de los componentes
Descargar Código Fuente
Spring MVC & Data JPA: Desarrollando una aplicación desde cero
Creando el proyecto
Creando la clase Entidad JPA anotada con @Entity
Creando la clase de Acceso a Datos o DAO con Entity Manager - @Repository
Creando controlador con la acción handler listar
Creando la vista listar.html
Decorando la vista listar con estilos CSS Bootstrap
La consola H2 Database
Agregando crear en Repositorio Dao y Controlador
Creando la vista crear y formulario
Mejorando formulario con estilos Bootstrap CSS
Agregando campo fecha en formulario
Agregando reglas de validación usando anotaciones
Agregando mensajes de errores personalizados
Agregando mensajes de errores sobre el formulario
Agregando editar
Agregando eliminar
Agregando la clase Service
Implementando el Dao con la interface CrudRepository
Instalando MySQL
Cambiando Datasource a MySQL en el proyecto
Descargar Código Fuente
Recursos sobre persistencia y base de datos en Spring
Spring MVC & Data JPA: Mejorando la aplicación
Bonus track: Layout usando fragments en Thymeleaf
Bonus track: Layout usando fragments en Thymeleaf - Parte II
Bonus track: Flash Messenger
Bonus track: Paginador desde cero - Usando PagingAndSortingRepository - Parte I
Bonus track: Paginador desde cero - La clase PageRender y controlador - Parte II
Bonus track: Paginador desde cero - La vista fragmento paginator-nav - Parte III
Bonus track: Paginador desde cero - Agregando estilos Bootstrap - Parte IV
Descargar Código Fuente
Spring MVC & Upload de archivos: Subida de imagenes en nuestro proyecto
Antes de empezar - Demostración
Configuraciones y preparando la aplicación
Agregando campo file en formulario y procesar MultipartFile en el Controlador
Agregando método handler ver imagen en el Controlador
Creando la vista ver para visualizar la imagen
Agregar directorio uploads externo al proyecto (Resource Handler)
Agregar directorio absoluto y externo en raíz del proyecto
Cargando imagen programáticamente en la respuesta HTTP - con ResponseEntity
Eliminar archivo de imagen
La clase UploadFileService
Inicializando directorio uploads automáticamente usando CommandLineRunner
Descargar Código Fuente
Spring MVC + Data JPA + jQuery: Desarrollando un Sistema de Facturación
Demostración de lo que lograremos al finalizar la sección
Análisis y Diseño OO con UML Diagrama de Clases del Dominio
Asociaciones: ManyToOne Bidireccional - Clases Entity Factura y Cliente
Asociaciones: OneToMany Unidireccional - Clases Entity Factura y ItemFactura
Asociaciones: ManyToOne Unidireccional - Clases Entity ItemFactura y Producto
Analizando y revisando las tablas y relaciones en MySQL Workbench
Listando las facturas en la vista de detalle del Cliente - ver.html
Creando controlador FacturaController con la acción handler crear
Creando la vista formulario de la factura
Links para acceder al formulario factura
Escribiendo código JavaScript para el Autocomplete usando jQuery UI
Consulta JPA para buscar productos en el Autocomplete
Creando la plantilla fragment para crear los items de la factura con jQuery
Creando las líneas de la Factura usando jQuery y la plantilla de ítems
Calculando el total de la línea o importe
Incrementando cantidad de un producto existente en el detalle de la factura
Eliminar linea de la factura
Calculando Gran Total de la Factura
Creando Crud Repository Factura e implementando save en clase Service
Implementando método para buscar productos en el serviceservice
Implementando método handler guardar en FacturaController
Validando el formulario de la factura
Creando método ver detalle en FacturaController
Creando la vista ver detalle: Parte 1 Datos de la Factura
Creando la vista ver detalle: Parte 2 Líneas de la Factura
Creando la vista ver detalle: Parte 3 Observación de la Factura
Eliminando la factura y sus líneas
Analizando configuración Cascade All en guardar y eliminar factura
Descargar Código Fuente
Mejorando la aplicación Sistema de Facturación
Optimizando consulta JPQL en Factura con JOIN FETCH para obtener los items
Optimizando consulta JPQL en Cliente con JOIN FETCH para obtener las facturas
Descargar Código Fuente
Spring Security
Demostración de lo que lograremos al finalizar la sección de Spring Security
Breve introducción a Spring Security
Añadiendo las dependencias necesarias
Implementando la clase SpringSecurityConfig para registrar usuarios
Añadiendo método configure(HttpSecurity http) para las reglas ACL en las rutas
Añadiendo configuración para el formLogin y logout
Creando la clase controladora LoginController
Añadiendo la vista personalizada login.html
Validando LoginController con los mensajes de error
Añadiendo los links del login y logout en el layout para iniciar y cerrar sesión
Manejo de errores de acceso denegado AccessDeniedPage
Añadiendo seguridad en nuestras vistas y botones del CRUD
Implementando la clase SuccessHandler para personalizar el mensaje de éxito
Obteniendo el usuario autenticado en el controlador
Obteniendo programáticamente el role (s) del usuario en el controlador
Chequear autorización con SecurityContextHolderAwareRequestWrapper
Agregar seguridad en el controlador usando anotaciones @Secured o @PreAuthorize
Descargar Código Fuente
Spring Security: Autenticación JDBC - Base de datos usando
BCrypt password encoder
Creando el esquema de tablas de base de datos
Configurando JDBC Authentication
Descargar Código Fuente
Spring Security: Autenticación con JPA
Creando las entidades necesarias Usuario y Role
Creando el repositorio JPA IUsuarioDao
Creando la clase de servicio JpaUserDetailsService
Configurando y registrando JpaUserDetailsService
Descargar Código Fuente
Locale y Multilenguaje I18N
Demostración de lo que lograremos al final de la sección internacionalización
Configuración de nuestro sistema multilenguaje y el Locale
Creando archivos de idiomas para los diferentes lenguajes (es_ES, en_US, de_DE)
Crear links en el menú navegación para cambiar el idioma
Creando el controlador LocaleController
Traducciones en los controladores
Menú desplegable para seleccionar el idioma
Traduciendo los textos del paginador
Traducción completa de nuestra aplicación y su descarga
Descargar Código Fuente
View Technologies: Exportar a PDF
Demostración visual exportando a PDF como una tecnología de vista
Configuraciones necesarias y dependencias de OpenPDF (fork de iText)
Creando la vista PdfView para la factura
Creando el link para exportar a documento PDF
Escribiendo el código de las líneas de la Factura en la vista PDF
Mejorando el diseño y look and feel de la vista PDF
Traduciendo la vista PDF a diferentes idiomas (internacionalización I18N)
Descargar Código Fuente
View Technologies: Exportar a Excel
Demostración exportando a planilla Excel
Configuraciones necesarias y dependencias
Implementando la clase de vista FacturaXlsxView para la factura
Escribiendo el código del detalle de la Factura en la vista Excel
Mejorando el diseño y look and feel de la planilla Excel
Traduciendo la vista Excel a diferentes idiomas (Internacionalización)
Descargar Código Fuente
View Technologies: Exportar a CSV (Archivo plano)
Configuración y creando la clase de vista ClienteCsvView
Implementando la clase ClienteCsvView y Link en vista listar clientes
Tener más de una vista con @Component y media types
Descargar Código Fuente
View Technologies: Convertir a Documento XML
Introducción y dependencias Maven
Agregando dependencia JAXB-API solo para JDK 9 o superior
Configuración y creando la clase XML Wrapper
Creando la clase view ClienteListXMLView
Implementando Link en vista listar clientes
Descargar Código Fuente
View Technologies: Convertir a JSON
Creando la clase view ClienteListJsonView
Modificar las clases Entities con anotaciones JSON para manejar las referencias
Descargar Código Fuente
View Technologies: API REST
Forma usando anotación @ResponseBody sobre el método handler
Forma usando anotación @RestController sobre la clase controller
Descargar Código Fuente
Spring Security: Autenticación basada en JWT (JSON Web Token)
Introducción a JSON Web Token (JWT)
Algo más sobre los JWT
Creando proyecto JWT y configuraciones
Proteger rutas en nuestro API REST
Creando la clase filtro JWTAuthenticationFilter
Información importante sobre los filtros (Filter)
Actualización: SignWith deprecated utilizando últimas versiones de jjwt
Generando el JWT
Agrenado más datos en el token JWT
Recibiendo los datos del login en estructura JSON
Manejando errores de autenticación
Creando una segunda clase filtro JWTAuthorizationFilter
Validando el token JWT con parse
Realizando autenticación con el token JWT enviado por el cliente
Implementando la clase Mixin GrantedAuthory
Creando la clase de servicio JWT
Implementando y optimizando la clase de servicio JWT
Constantes en el servicio JWT
Descargar Código Fuente
Deployment: despliegue en servidores externos
Introducción
Tomcat Embebido: generando el archivo jar para el despliegue (deploy)
Tomcat Embebido: realizando el despliegue (deploy)
Servidor Externo Tomcat: download y modificando nuestro proyecto a war
Servidor Externo Tomcat: realizando el despliegue
Servidor Externo Tomcat: mejoras y adaptando nuestro código
Servidor Externo WildFly: download y generando el war
Servidor Externo WildFly: realizando el despliegue
Servidor Externo Glassfish: download, generando war y deploy
Descargar Código Fuente
Deployment: Heroku Cloud
Creando nuestra app en la plataforma Heroku Cloud
Despliegue de nuestra aplicación en Heroku
Deploy jar usando Plugins en Heroku
Deployment: Heroku Cloud - MySQL
Creando app en Heroku
Deploy en Heroku
MySQL Workbench
Nuevo commit con los cambios
Angular: Primeros pasos
Instalaciones y herramientas necesarias
Una mirada al editor Atom e instalando algunos plugins
Creando nuestra aplicación Angular
Estructura de directorio del proyecto angular
Estructura de directorio del proyecto angular: Parte 2 el directorio src
Integrar Bootstrap con Angular
Creando nuevo componente HeaderComponent
Separando el template del componente con TemplateUrl
Creando nuevo componente FooterComponent
Directiva estructural *ngFor
Directiva estructural *ngIf
Angular: Componente clientes
Creando el componente clientes.component
Listando los objetos del tipo Cliente
Creando archivo clientes.json.ts con la lista de objetos
Creando la clase de Servicio ClienteService y la Inyección de Dependencia
Implementando Observable en nuestra clase Servicio ClienteService
Implementando Rutas en Angular y navegación
Actualización: sobre el archivo angular.cli.json vs angular.json
Configurando e integrando Bootstrap de forma local en nuestra app
Instalando Bootstrap utilizando el comando npm desde el terminal
Angular: Spring Backend Server API REST
Creando Proyecto Backend API REST
Configurando el Datasource a MySQL en el proyecto backend
Creando la Base de Datos
Añadiendo la clase Entity Cliente al Backend
Añadiendo las clases Repository y Service de la lógica de negocio
Creando controlador @RestController y EndPoint para listar
Añadiendo Datos de pueba
Usando Postman para probar nuestras APIs
Uso de Cors para compartir recursos en API REST
Implementando Servicio Angular con HttpClient
Descargar Código Fuente
Angular: CRUD con Spring API Rest
Escribiendo los métodos del CRUD en la clase ClienteService del Backend
Escribiendo los métodos show y create en el Controlador Backend API Rest
Escribiendo los métodos update y delete en el Controlador Backend API Rest
Probando nuestro Backend API Rest con Postman
Creando el componente form.component y la vista del formulario
Configurando la ruta y navegación del formulario
Escribiendo implementación crear en el cliente.service.ts y en form.component.ts
Actualización: nueva versión de SweetAlert2 8.0.1 o superior
Instalar SweetAlert2 para enviar mensajes de alerta en el cliente
Cargando los datos en el formulario para actualizar
Escribiendo el update en el cliente.service.ts y en form.component.ts
Escribiendo el delete en la clase service y en el componente clientes
Overflow en listado de clientes, ajustando layout
Validando los clientes en la tabla HTML con directiva ngIf
Descargar Código Fuente
Angular: Manejo de errores en Backend Spring
Manejo de error en el Backend en método handler show (obtener por id)
Manejo de error en el Backend en método handler create
Manejo de error en el Backend en método handler update
Manejo de error en el Backend en método handler delete
Angular: Manejo de errores en Frontend
Manejo de error en el Frontend Angular en obtener por id
Manejo de error en el Frontend Angular en create, update y delete
Customizando y arreglando los textos de éxito en crear y actualizar del frontend
Angular: Validando form por el lado Frontend
Validando form en el template
Angular: Validando form en Spring Backend
Anotaciones JavaBeans Validation en la clase Entity
Implementando anotación @Valid en métodos handler create y update del controller
Probando validación API REST en POSTMAN
Manejando los error de validación en Angular
Agregando los mensajes de errores en la plantilla form
Customizar mensajes de validación en español
Descargar Código Fuente
Angular: Transformando datos del observable usando operador map y pipe
Operador map formato uppercase en Observable
Operador map formato fecha en Observable
Registrando el Locale y los diferentes Pattern para formatear fechas
Uso de Pipe para formatear fecha y uppercase en las plantillas html
Uso del operador tap en el Observable
Fin sección de Angular y sobre curso de separado de Angular y Spring
Reactor API: Flux & Reactive Streams
Introducción a Reactive Streams
Creando Proyecto con Reactor API
Creando un Stream Observable
El método subscribe()
El evento onComplete
El operador map
El operador filter
Los Observables son inmutables
Creando un Flux (Observable) a partir de un List o Iterable
Descargar Código Fuente
Spring WebFlux
Introducción a Spring WebFlux
Creando Proyecto con Spring WebFux
Instalación MongoDB
Qué es Mongo y algunos ejemplos
Instalando Robo 3T una herramienta GUI para MongoDB
Agregando Clases del Modelo Document y Repository
Importando datos de ejemplo y el operador flatMap
Eliminando colección productos (drop collection)
Cambiando el nombre de la base de datos y agregando la fecha createAt
Creando controlador y vista reactivos
Suscribiendo otro Observador y modificando el Stream reactivo
Modo Reactive Data Driven para menejar la contrapresión
Modo Chunked para menejar la contrapresión
Modo Chunked view names
API Rest en WebFlux
Spring WebFlux ¿Qué sigue?
Descargar Código Fuente
Errores Frecuentes (opcional)
Dependencias o librerías jar corruptas: Invalid LOC header (bad signature)
Error de transferencia de dependencias: Non resolvable parent POM
No se registra el Controller debido al package base
The Tomcat connector configured to listen on port 8080 failed to start
Errores de tipeo en el application.properties: Espacios en blanco y otros
Problema con el autocompletado en application.properties