{"id":25295904,"url":"https://github.com/angel-raa/alba","last_synced_at":"2026-04-30T03:33:57.445Z","repository":{"id":275889193,"uuid":"927513297","full_name":"Angel-Raa/Alba","owner":"Angel-Raa","description":"Alba es un framework minimalista diseñado para crear servidores web en Java. Ofrece una API sencilla y flexible para gestionar rutas, middlewares y respuestas HTTP.","archived":false,"fork":false,"pushed_at":"2025-02-11T00:13:32.000Z","size":283,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-06T20:34:55.230Z","etag":null,"topics":["alba","java","jdk21","maven"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Angel-Raa.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.adoc","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-05T04:38:01.000Z","updated_at":"2025-02-11T00:13:35.000Z","dependencies_parsed_at":"2025-02-05T05:27:09.689Z","dependency_job_id":"988c6fff-4849-4471-95d3-3a51738a2454","html_url":"https://github.com/Angel-Raa/Alba","commit_stats":null,"previous_names":["angel-raa/alba","angel-raa/alba-is-a-minimalist-framework"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Angel-Raa/Alba","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angel-Raa%2FAlba","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angel-Raa%2FAlba/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angel-Raa%2FAlba/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angel-Raa%2FAlba/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Angel-Raa","download_url":"https://codeload.github.com/Angel-Raa/Alba/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Angel-Raa%2FAlba/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262685694,"owners_count":23348451,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["alba","java","jdk21","maven"],"created_at":"2025-02-13T02:42:07.246Z","updated_at":"2026-04-30T03:33:52.411Z","avatar_url":"https://github.com/Angel-Raa.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# **Alba Framework**\n\n**Alba** es un framework minimalista diseñado para crear servidores web en Java. Ofrece una API sencilla y flexible para gestionar rutas, middlewares y respuestas HTTP. Este framework está inspirado en herramientas populares como [Hono.js](https://hono.dev/) y [Express.js](https://expressjs.com/), pero con un enfoque ligero y minimalista, ideal para aprender cómo funcionan los servidores web desde cero.\n\n## Instalación\n\nPara agregar **Alba** a tu proyecto, puedes utilizar **Maven** o **Gradle**.\n\n### Maven\n\nAgrega la siguiente dependencia en el archivo `pom.xml`:\n\n```xml\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.angel-raa\u003c/groupId\u003e\n    \u003cartifactId\u003ealba\u003c/artifactId\u003e\n    \u003cversion\u003e1.0-0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n### Gradle\n\nIncluye la siguiente línea en el archivo `build.gradle`:\n\n```gradle\nimplementation group: 'io.github.angel-raa', name: 'alba', version: '1.0-0'\n```\n---\n\n## **Nuevas Funcionalidades: Integración con Thymeleaf**\n\n### 1. **Soporte para Thymeleaf**\n\nAlba ahora incluye soporte nativo para **Thymeleaf**, Las plantillas deben almacenarse en la carpeta `resources/templates/` y se configuran mediante el archivo `alba.properties`.\n\n#### **Configuración en `alba.properties`**\n```properties\n# Configuración del Motor de Plantillas\nalba.template.engine=thymeleaf\nalba.template.cache=true\nalba.template.prefix=templates/\nalba.template.suffix=.html\n```\n\n- **alba.template.engine**: Especifica el motor de plantillas a usar (en este caso, `thymeleaf`).\n- **alba.template.cache**: Habilita o deshabilita el caché de plantillas.\n- **alba.template.prefix**: Prefijo para la ubicación de las plantillas (carpeta `templates/`).\n- **alba.template.suffix**: Sufijo para los archivos de plantilla (.html).\n\n---\n\n### 2. **Ejemplos de Uso**\n\n#### **A. Uso en Métodos de Clase**\n\nPuedes usar Thymeleaf en métodos de clase anotados con `@Get`, `@Post`, etc. Aquí tienes un ejemplo:\n\n```java\n@Get(\"/home\")\npublic Response getHome(Request request) {\n    Map\u003cString, Object\u003e model = new HashMap\u003c\u003e();\n    model.put(\"title\", \"Bienvenido a Alba\");\n    model.put(\"message\", \"¡Hola desde Thymeleaf!\");\n    return new Response().addTemplate(\"index.html\", model);\n}\n```\n\n- Se crea un modelo (`Map\u003cString, Object\u003e`) con datos dinámicos (`title` y `message`).\n- La plantilla `index.html` se procesa con el modelo y se devuelve como respuesta.\n\n#### **B. Uso con Funciones Lambda**\n\nTambién puedes usar funciones lambda para manejar rutas y devolver plantillas:\n\n```java\nserver.get(\"/hello\", res -\u003e {\n    Map\u003cString, Object\u003e model = new HashMap\u003c\u003e();\n    model.put(\"title\", \"Hola Mundo\");\n    model.put(\"message\", \"Este es un ejemplo de función lambda con Thymeleaf.\");\n    Response response = new Response(200, null);\n    response.addTemplate(\"index.html\", model);\n    return response;\n});\n```\n\n- La ruta `/hello` devuelve una página HTML generada dinámicamente con Thymeleaf.\n- El modelo contiene los datos que se inyectan en la plantilla.\n\n---\n\n### 3. **Estructura de la Carpeta `templates/`**\n\nLas plantillas deben almacenarse en la carpeta `resources/templates/`. Por ejemplo:\n\n```plaintext\nsrc/\n├── main/\n│   ├── resources/\n│   │   ├── templates/\n│   │   │   └── index.html\n```\n\n#### **Ejemplo de Plantilla (`index.html`)**\n\nAquí tienes un ejemplo de una plantilla Thymeleaf:\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml xmlns:th=\"http://www.thymeleaf.org\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"UTF-8\"\u003e\n    \u003ctitle th:text=\"${title}\"\u003eTítulo por defecto\u003c/title\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n    \u003ch1 th:text=\"${message}\"\u003eMensaje por defecto\u003c/h1\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n- **`${title}`** y **`${message}`** son variables del modelo que se inyectan en la plantilla.\n- Si no se proporciona un valor para estas variables, se mostrarán los valores por defecto.\n\n---\n\n### 4. **Métodos Relevantes en la Clase `Response`**\n\n#### **A. Método `addTemplate`**\n\nEl método `addTemplate` permite renderizar una plantilla con un modelo y devolverla como respuesta.\n\n```java\npublic Response addTemplate(String templateName, Map\u003cString, Object\u003e model) {\n    if (templateName == null || templateName.isEmpty()) {\n        throw new IllegalArgumentException(\"El nombre de la plantilla no puede ser nulo o vacío\");\n    }\n    addHeader(\"Content-Type\", \"text/html; charset=UTF-8\");\n    this.body = templateProcessor.render(templateName, model);\n    return this;\n}\n```\n\n- **templateName**: Nombre de la plantilla (sin prefijo ni sufijo).\n- **model**: Datos a inyectar en la plantilla.\n\n---\n\n## **Middlewares**\n\n### A. **Middleware CORS (CorsMiddleware)**\n\nEste middleware permite configurar políticas de acceso entre dominios (Cross-Origin Resource Sharing).\n\n#### **Configuración Básica:**\n\n```java\nCorsMiddleware corsMiddleware = new CorsMiddleware();\ncorsMiddleware.addAllowedOrigins(\"https://example.com\")\n              .addAllowedMethods(\"GET\", \"POST\")\n              .setAllowCredentials(true)\n              .setMaxAge(3600);\nserver.use(corsMiddleware);\n```\n\n- Permite configurar orígenes permitidos, métodos HTTP y credenciales.\n\n---\n\n### B. **Middleware de Restricción de IPs (IpRestrictionMiddleware)**\n\nRestringe el acceso a ciertas rutas o al servidor completo basándose en las direcciones IP de los clientes.\n\n#### **Configuración Básica:**\n\n```java\nIpRestrictionMiddleware ipRestrictionMiddleware = new IpRestrictionMiddleware()\n        .addAllowedIps(Arrays.asList(\"192.168.1.10\", \"192.168.1.20\"))\n        .addBlockedIps(Collections.singletonList(\"192.168.1.15\"))\n        .setAllowAllByDefault(false); // Bloquea todas las IPs por defecto\nserver.use(ipRestrictionMiddleware);\n```\n\n- Permite crear una lista blanca y negra de IPs.\n\n---\n\n### C. **Middleware de Idioma (LanguageMiddleware)**\n\nDetecta el idioma preferido del cliente (basado en el encabezado `Accept-Language`) y configura el idioma de la aplicación en función de eso.\n\n#### **Configuración Básica:**\n\n```java\nLanguageMiddleware languageMiddleware = new LanguageMiddleware()\n        .addSupportedLanguages(Set.of(\"es\", \"en\", \"fr\"))\n        .setDefaultLanguage(\"en\")\n        .setLanguageHeader(\"Accept-Language\");\nserver.use(languageMiddleware);\n```\n\n- Detecta automáticamente el idioma preferido del cliente.\n\n---\n### D. **Middleware de CSRF (CsrfMiddleware)**\n\nEl middleware **CSRF** protege contra ataques de falsificación de solicitudes entre sitios. Valida tokens CSRF en solicitudes **POST, PUT y DELETE**.\n\n#### **1. Configuración en el servidor**\n\n```java\nServer server = new Server();\nserver.use(new CsrfMiddleware()); // Habilitar protección CSRF\nserver.start();\n```\n\n#### **2. Uso en formularios con Thymeleaf**\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml xmlns:th=\"http://www.thymeleaf.org\"\u003e\n\u003chead\u003e\n    \u003ctitle\u003eFormulario\u003c/title\u003e\n\u003c/head\u003e\n  \u003cbody\u003e\n     \u003cform action=\"/submit\" method=\"post\" csrf\u003e\n       \u003cinput type=\"text\" name=\"username\" placeholder=\"Nombre de usuario\" /\u003e\n       \u003cbutton type=\"submit\"\u003eEnviar\u003c/button\u003e\n    \u003c/form\u003e\n  \u003c/body\u003e\n\u003c/html\u003e\n```\n---\n\nSi el token es inválido, la solicitud será rechazada con **403 Forbidden**.\n\n\n### E. **Agrupación de Rutas (Route Grouping)**\n\nAhora puedes agrupar rutas relacionadas bajo un prefijo común para reducir la repetición de código.\n\n#### **Configuración Básica:**\n\n```java\nserver.route(\"/api/v1/posts\", new PostController());\n```\n\n---\n\n## **Ejemplo Completo de Uso**\n\nAquí tienes un ejemplo completo que utiliza todas las nuevas funcionalidades del framework:\n\n```java\nimport server.Server;\nimport middleware.CorsMiddleware;\nimport middleware.IpRestrictionMiddleware;\nimport middleware.LanguageMiddleware;\n\npublic class Main {\n    public static void main(String[] args) {\n        Server server = new Server(8080);\n\n        // Middleware CORS\n        server.use(new CorsMiddleware().addAllowedOrigins(\"https://example.com\"));\n        \n        // Middleware Restricción IPs\n        server.use(new IpRestrictionMiddleware().addAllowedIps(Arrays.asList(\"192.168.1.10\")));\n        \n        // Middleware Idioma\n        server.use(new LanguageMiddleware().setDefaultLanguage(\"en\"));\n\n        // Rutas agrupadas\n        server.route(\"/api/v1/posts\", new PostController());\n\n        // Ruta simple\n        server.get(\"/\", request -\u003e new Response(200, new JSONObject().put(\"message\", \"Welcome\")));\n        \n        server.start();\n    }\n}\n```\n\n---\n\n## **Cómo Usar el Framework**\n\n### 1. **Ejemplo Básico: Crear un Servidor Simple**\n\n```java\npublic class Main {\n    public static void main(String[] args) throws IOException {\n        Server server = new Server(8080);\n        server.get(\"/user/:id\", request -\u003e {\n            String userId = request.getPathParam(\"id\");\n            return new Response(200, new JSONObject().put(\"userId\", userId));\n        });\n        server.start();\n    }\n}\n```\n\n---\n\n## **Rutas Disponibles**\n\n- **GET**\n- **POST**\n- **PUT**\n- **DELETE**\n\n---\n\n## **Licencia**\n\nEste proyecto está bajo la licencia MIT. Consulta el archivo [LICENSE](LICENSE) para más detalles.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangel-raa%2Falba","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fangel-raa%2Falba","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fangel-raa%2Falba/lists"}