{"id":20021475,"url":"https://github.com/dieg0code/spring-boot","last_synced_at":"2026-03-06T11:03:21.358Z","repository":{"id":188197551,"uuid":"466317279","full_name":"Dieg0Code/Spring-Boot","owner":"Dieg0Code","description":"Apuntes del framework","archived":false,"fork":false,"pushed_at":"2022-03-06T20:11:00.000Z","size":137,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-02T03:42:40.016Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Dieg0Code.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-03-05T01:22:31.000Z","updated_at":"2022-03-05T01:22:31.000Z","dependencies_parsed_at":"2023-08-14T08:26:25.749Z","dependency_job_id":"dcd2839c-b5a1-412c-a553-c3c1262981c5","html_url":"https://github.com/Dieg0Code/Spring-Boot","commit_stats":null,"previous_names":["dieg0code/spring-boot"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Dieg0Code/Spring-Boot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FSpring-Boot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FSpring-Boot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FSpring-Boot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FSpring-Boot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Dieg0Code","download_url":"https://codeload.github.com/Dieg0Code/Spring-Boot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Dieg0Code%2FSpring-Boot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30173362,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T07:56:45.623Z","status":"ssl_error","status_checked_at":"2026-03-06T07:55:55.621Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T08:36:52.904Z","updated_at":"2026-03-06T11:03:16.334Z","avatar_url":"https://github.com/Dieg0Code.png","language":null,"readme":"# Apuntes\n\n## ¿Qué es Spring Boot?\n\n**Spring Boot** es un sub-proyecto de Spring Framework que busca facilitarnos la creación de proyectos con **Spring Framework** eliminando la necesidad de crear largos archivos de configuración XML.\n\n- Estas configuraciones tediosas y propensas a errores ya no son necesarias debido a que **Spring Boot** provee **configuraciones por defecto** para la mayoría de las tecnologías usadas (Spring MVC, Spring Data JPA \u0026 Hibernate, Spring Security, Spring REST, etc).\n\n- **Spring Boot** nos ayuda a administrar todas las dependencias (archivos JAR y versiones compatibles).\n\n- **Spring Boot** provee un modelo de programación parecido a las aplicaciones java tradicionales que se inician en el método main.\n\n## ¿Como funciona Spring Boot?\n\nProceso típico para desarrollar una aplicación de Spring.\n\n1. Seleccionar Dependencias necesarias con Maven (deben ser compatibles).\n2. Crear nuestra aplicación.\n3. Realizar el Deployment en el servidor.\n\n**Spring Boot** nace con la intención de simplificar los pasos 1 y 3, y que nos podamos centrar en el desarrollo de nuestra aplicación.\n\n### ¿Cómo se simplifican el paso 1 y 3?\n\n- Permite crear aplicaciones **Stand-Alone** con Spring.\n    - **Stand-Alone**: Aplicación independiente (no requiere un servidor web).\n    - Aplicación que corre desde la línea de comandos (cmd, shell) y necesariamente tiene que contener un método main. *$ java -jar mywebapp.jar*\n- Incluye un servidor web Apache Tomcat Embebido (se puede cambiar por Jetty o Undertow).\n- Se requiere mínima configuración debido a:\n    - No es necesario más archivos XML.\n    - Las configuraciones para la mayoría de las tecnologías ya se incluyen con valores por defecto (Spring MVC, Spring Data JPA \u0026 Hibernate, Spring Security, Spring REST, etc).\n        - La configuración por defecto es en base a los parámetros y valores más usados por la mayoría de los usuarios que usan Spring.\n- Incluye características listas para entornos de producción:\n    - Revisión de funcionalidad.\n    - Métricas de la aplicación.\n\n## Crear un proyecto con Spring Boot\n\nPara crear un proyecto con Spring Boot, debemos ir a la página [Spring Initializer](https://start.spring.io/) y configurar el proyecto que se desea crear, ahí mismo podemos configurar las dependencias que necesitamos.\n\nLos proyectos creados con Spring Boot usan los decoradores para agregar funcionalidades.\n\nPor ejemplo el archivo main se ve así:\n\n```java\npackage dig0code.holaMundo;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class HolaMundoApplication {\n\n\tpublic static void main(String[] args) {\n\t\tSpringApplication.run(HolaMundoApplication.class, args);\n\t}\n\n}\n```\n\nUn controlador se ve así:\n\n```java\npackage dig0code.holaMundo.controller;\n\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class HomeController {\n\n    @GetMapping(\"/\")\n    public String inicio() {\n        return \"Hola Mundo\";\n    }\n\n}\n```\n\nCon el decorador ``@SpringBootApplication``, indicamos que la clase es una aplicación de Spring Boot.\n\nCon el decorador ``@RestController``, indicamos que la clase es un controlador REST.\n\nY con el método ``@GetMapping``, indicamos que la ruta ``\"/\"`` es la ruta de acceso al controlador mediante una petición GET.\n\n### ¿Que pasa si queremos cambiar el puerto por defecto?\n\nPor defecto el servidor web Apache Tomcat embebido utiliza el puerto 8080, puede que queramos cambiar esto, para eso debemos configurar el archivo ``application.properties``.\n\n```java\n// application.properties\nserver.port=8888\n```\n\nEste archivo se usa para diferentes configuraciones del proyecto.\n\n## ¿Qué es Spring MVC?\n\n- Spring MVC utiliza una arquitectura de aplicaciones siguiendo el patrón de diseño MVC (**M**odel-**V**iew-**C**ontroller).\n- Spring MVC es un framework web basado en Servlets que viene incluido en Spring Framework (spring-webmvc).\n- Spring MVC está diseñado siguiendo el patrón de diseño de **Front Controller**.\n- En Spring MVC el Front Controller es mejor conocido como **DispatcherServlet**.\n\nOtras funciones del Front Controller son:\n\n- Enviar las peticiones (request) a los manejadores (handlers) para que sean procesadas.\n- El default handler son los controladores (@Controller, @RequestMapping).\n- Encargado de resolver las vistas (views).\n\nA partir de Spring 3.0 se pueden crear RESTFul Web Services utilizando la notación **@RestController** y **@PathVariable**.\n\n- Basado en Spring IOC container (Inyección de Dependencias).\n- Spring MVC se integra muy fácil con otros proyectos de Spring:\n    - Nosotros integraremos **Spring Boot**, **Spring Data JPA**, **Spring Security**, **Spring REST**, etc.\n\n\n## ¿Qué es un Controlador en Spring MVC?\n\nUn controlador (Controller) en Spring MVC es una clase normal a la cual se le agrega la anotación **@Controller** a nivel de la clase.\n\nEs una aplicación web, estos métodos principalmente están marcados con las notaciones **@GetMapping**, **@PostMapping**, y **@RequestMapping** (Action Controller).\n\nLos métodos pueden tener cualquier nombre y deben regresar un String (nombre de la vista).\n\nLos métodos son ejecutados al ser invocados por medio de la URL especificada como parámetro en las anotaciones **@GetMapping**, **@PostMapping**, etc.\n\n```java\n@Controller\npublic class HomeController {\n\n    @GetMapping(\"/miUrl\") // localhost:8080/miUrl\n    public String inicio() {\n        // Mi lógica de negocio\n        return \"home\";\n    }\n\n}\n```\n\nCuando se utiliza el motor de plantillas **Thymeleaft** se buscará un archivo (vista) llamado **home.html** en el directorio: **src/main/resources/templates**.\n\n## ¿Qué es Thymeleaft?\n\nThymeleaft es un motor de plantillas para aplicaciones web desarrolladas con Java. Es algo similar a los JSP's, con algunas diferencias.\n\n- Página Oficial: www.thymeleaf.org\n\nComúnmente utilizado con Spring Boot para generar vistas con código HTML para aplicaciones web.\n\nEn un proyecto Spring Boot, ya viene configurado Thymeleaf con valores por defecto al momento de agregar la dependencia.\n\n### Configuración\n\nAgregar la siguiente dependencia al archivo ``pom.xml`` a un proyecto Spring Boot ya creado:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eorg.springframework.boot\u003c/groupId\u003e\n    \u003cartifactId\u003espring-boot-starter-thymeleaf\u003c/artifactId\u003e\n\u003c/dependency\u003e\n```\n\nOtra forma es:\n\nCrear el proyecto con **Spring Initializr**:\n\nDependecies: Thymeleaf\n\nPara utilizar **Thymeleaf** en un archivo HTML se debe agregar el namespace.\n\n```html\n// home.html\n\u003c!DOCTYPE html\u003e\n\u003chtml xmlns:th=\"https://www.thymeleaf.org\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003ctitle\u003eTitulo\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003ch1 th:text=\"${mensaje}\"\u003e\u003c/h1\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n```java\n// HomeController.java\n@Controller\npublic class HomeController {\n    \n    @GetMapping(\"/\")\n    public String mostrarHome(Model model) {\n        model.addAttribute(\"mensaje\", \"Hola Mundo\");\n        return \"home\";\n    }\n\n}\n```\n\nLa variable ``mensaje`` es agregada al modelo desde un controlador, en este caso tendría el texto ``\"Hola Mundo\"``.\n\n## Iteraciones en Thymeleaf\n\nEn Thymeleaf las iteraciones se pueden realizar con la expresión ``th:each``. Similar a un ``for`` en Java.\n\nEsta expresión puede iterar sobre diferentes tipos de datos como:\n\n- List\n- Map\n- Iterable\n\n```html\n\u003c!-- Vista (detalle.html) --\u003e\n\u003ctr th:each=\"tmpEmp: ${empleos}\"\u003e\n\n    \u003ctd th:text=\"${tmpEmp}\" /\u003e\n\u003c/tr\u003e\n```\n\nCon la expresión ``th:each`` se puede iterar sobre una lista de objetos, luego declaramos la variable temporal ``tmpEmp`` la cual va a representar cada elemento durante la iteración de la lista, luego con ``${empleos}`` se indica el nombre del atributo que se va a iterar. De esta forma en donde este declarado el ``th:each``, se va a renderizar ``n`` veces dependiendo del numero de elementos que contenga la lista.\n\n```java\n// Controlador\n@GetMapping(\"/detalle\")\npublic String mostrarDetalle(Model model) {\n    List\u003cString\u003e lista = new LinkedList\u003c\u003e();\n    lista.add(\"Ingeniero de Sistemas\");\n    lista.add(\"Auxiliar de Contabilidad\");\n    model.addAttribute(\"empleos\", lista);\n    return \"detalle\";\n}\n```\n\n## Condicionales en Thymeleaf\n\n### Operador Elvis (?:)\n\nEl operador Elvis permite renderizar texto **dentro** de un elemento HTML, dependiendo de una expresión Booleana. Es muy similar al operador ternario en otros lenguajes de programación.\n\nEjemplo:\n\n```html\n\u003ctd th:text=\"${usuarios.estatus == 1} ? 'ACTIVO' : 'BLOQUEADO'\"/\u003e\n```\n\nDonde ``ACTIVO`` es el valor renderizado si la expresión es verdadera o ``BLOQUEADO`` si es falsa.\n\n### IF - Unless\n\nLa expresión ``if - unless`` permite renderizar un elemento HTML, dependiendo de una expresión Booleana. Es muy similar a un ``if - else`` en otros lenguajes de programación.\n\nEjemplo:\n\n```html\n\u003ctd\u003e\n    \u003cspan th:if=\"${alumno.genero == 'F'}\"\u003e Femenino \u003c/span\u003e\n    \u003cspan th:unless=\"${alumno.genero == 'F'}\"\u003e Masculino \u003c/span\u003e\n\u003c/td\u003e\n```\n\n## Urls relativas al ContextPath en Thymeleaf\n\nLas URLs relativas al ContextPath son las que son relativas al directorio raíz (ROOT) de una aplicación web, una vez están publicadas en el servidor.\n\nLas URLs relativas al ContextPath deben iniciar con \"/\" cuando vayamos a formar una URL para referenciar un recurso (imágenes, CSS, JS, PDF, etc) en nuestra aplicación.\n\nEn un proyecto web cuando se utiliza ``Thymeleaf`` como motor de plantillas, los recursos estáticos deben guardarse en el directorio **src/main/resources/static**.\n\nEjemplos:\n\n- Para incluir el archivo CSS myStyles.css en una vista se utilizaría la siguiente expresión:\n\n```html\n\u003clink th:href\"@{/css/myStyles.css}\" rel=\"stylesheet\"\u003e\n```\n\n- Para incluir el archivo JavaScript funciones.js en una vista se utilizaría la siguiente expresión:\n\n```html\n\u003cscript th:src=\"@{/js/funciones.js}\"\u003e\u003c/script\u003e\n```\n\n- Para incluir la imagen foto.png en una vista, se utilizaría la siguiente expresión:\n\n```html\n\u003cimg th:src=\"@{/images/foto.png}\" width=\"136\" height=\"136\"\u003e\n```\n\nPara incluir archivos JavaScript y CSS vía CDN (content delivery network) se utiliza la sintaxis estándar (sin expresiones Thymeleaf).\n\n## Arquitectura de Spring MVC - Ciclo de vida de una petición HTTP\n\n![arquitectura-spring-mvc](/assets/arq-spring-mvc.png)\n\nEl ciclo de vida de una petición HTTP comienza cuando un usuario hace una solicitud a una aplicación desarrollada en este caso con **Spring MVC** que está alojada en un servidor web, este servidor web por lo general tiene integrado un motor para procesar Servlets y JSP, en La gráfica se muestra a manera de ejemplo que este motor de Servlets es **apache tomcat**.\n\nLa petición HTTP puede ser solicitar una página web por medio de una URL a través de un navegador, después de que la petición es enviada por el usuario, esta es recibid por el ``Front Controller`` que básicamente es un Servlet llamado ``DispatcherServlet`` el cual está configurado para recibir todas las URLs que sean procesadas por Spring MVC. En términos sencillos este Servlet recibe todas las peticiones HTTP, en la gráfica está representado por el numero ``2``.\n\nDespués de que el ``Front Controller`` recibe la petición analiza la URL a la cual fué hecha la petición, en este punto según la configuración del ``DispatcherServlet`` el ``From Controller`` va a buscar las clases que tienen la notación ``@Controller`` que es propia de Spring MVC, es decir, va a revisar todos los controladores que hay registrados para ver cual está mapeado a la URL, en caso de encontrar un controlador mapeado a la URL a la cual fué enviada la petición, el ``Front Controller`` delega la petición (numero ``3``), en caso de no encontrar un ``Controller`` mapeado a esta URL, el ``Front Controller`` enviá el error ``404 Not Found``.\n\nSi existe un controlador encargado de procesar la URL, el controlador recibe la petición y se encarga de procesarla, aquí es donde la verdadera lógica de la aplicación se aplica, por lo general esta lógica consiste en recibir los datos enviados por el usuario a través de su petición, por ejemplo los datos de un formulario HTML, posteriormente estos datos son procesados, por ejemplo pueden ser almacenados en una base de datos, hacer algunos cálculos o generar reportes, en la gráfica es el numero ``4``.\n\nPara realizar el procesamiento de los datos y en general la lógica del negocio, los controladores casi siempre hacen uso de componentes de la capa de servicio de la aplicación, estos componentes de servicio a su vez utilizan componentes de la capa de datos para interactuar con la base de datos. Esto no siempre es así, puede ser que un controlador solo tenga asignada la tarea de regresar una vista con un formulario HTML para ser completado por el usuario y por lo tanto puede ser que no necesite ningún otro tipo de componente.\n\nDespués de que el controlador ha terminado de procesar la solicitud, el controlador puede generar el modelo que será renderizado en la vista posteriormente. El modelo básicamente son objetos que representan los datos de nuestra aplicación, en la gráfica es el numero ``5``. Una vez que esta generado el modelo el controlador debe indicar cual será la vista que posteriormente será la encargada de renderizar el modelo que previamente ha sido generado, en este paso el controlador envía el modelo junto con el nombre de la vista al ``Front Controller`` en la gráfica es el numero ``6``. En el ``Front Controller`` está la configuración del ``view resolver``, este es un componente de Spring-MVC que básicamente es el encargado de buscar las vistas de nuestra aplicación, con está configuración el ``Front Controller`` busca el nombre de la vista que previamente fue enviada por el controlador y la renderiza, en la gráfica es el numero ``7``.\n\nDespués de que la respuesta del usuario es generada, que por lo general es HTML, el motor de plantillas regresa el control de flujo de la petición al ``Front Controller``, en la gráfica es el paso numero ``8``.\n\nDespués de que el ``Front Controller`` recibe la respuesta final del usuario, se prepara y en la mayoría de los casos esta respuesta es enviada al navegador en formato HTML, en la gráfica es el paso numero ``9`` y ``10``.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdieg0code%2Fspring-boot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdieg0code%2Fspring-boot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdieg0code%2Fspring-boot/lists"}