https://github.com/angel-raa/alba
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.
https://github.com/angel-raa/alba
alba java jdk21 maven
Last synced: about 2 months ago
JSON representation
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.
- Host: GitHub
- URL: https://github.com/angel-raa/alba
- Owner: Angel-Raa
- License: mit
- Created: 2025-02-05T04:38:01.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2025-02-11T00:13:32.000Z (over 1 year ago)
- Last Synced: 2025-04-06T20:34:55.230Z (about 1 year ago)
- Topics: alba, java, jdk21, maven
- Language: Java
- Homepage:
- Size: 276 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.adoc
- License: LICENSE
Awesome Lists containing this project
README
# **Alba Framework**
**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.
## Instalación
Para agregar **Alba** a tu proyecto, puedes utilizar **Maven** o **Gradle**.
### Maven
Agrega la siguiente dependencia en el archivo `pom.xml`:
```xml
io.github.angel-raa
alba
1.0-0
```
### Gradle
Incluye la siguiente línea en el archivo `build.gradle`:
```gradle
implementation group: 'io.github.angel-raa', name: 'alba', version: '1.0-0'
```
---
## **Nuevas Funcionalidades: Integración con Thymeleaf**
### 1. **Soporte para Thymeleaf**
Alba ahora incluye soporte nativo para **Thymeleaf**, Las plantillas deben almacenarse en la carpeta `resources/templates/` y se configuran mediante el archivo `alba.properties`.
#### **Configuración en `alba.properties`**
```properties
# Configuración del Motor de Plantillas
alba.template.engine=thymeleaf
alba.template.cache=true
alba.template.prefix=templates/
alba.template.suffix=.html
```
- **alba.template.engine**: Especifica el motor de plantillas a usar (en este caso, `thymeleaf`).
- **alba.template.cache**: Habilita o deshabilita el caché de plantillas.
- **alba.template.prefix**: Prefijo para la ubicación de las plantillas (carpeta `templates/`).
- **alba.template.suffix**: Sufijo para los archivos de plantilla (.html).
---
### 2. **Ejemplos de Uso**
#### **A. Uso en Métodos de Clase**
Puedes usar Thymeleaf en métodos de clase anotados con `@Get`, `@Post`, etc. Aquí tienes un ejemplo:
```java
@Get("/home")
public Response getHome(Request request) {
Map model = new HashMap<>();
model.put("title", "Bienvenido a Alba");
model.put("message", "¡Hola desde Thymeleaf!");
return new Response().addTemplate("index.html", model);
}
```
- Se crea un modelo (`Map`) con datos dinámicos (`title` y `message`).
- La plantilla `index.html` se procesa con el modelo y se devuelve como respuesta.
#### **B. Uso con Funciones Lambda**
También puedes usar funciones lambda para manejar rutas y devolver plantillas:
```java
server.get("/hello", res -> {
Map model = new HashMap<>();
model.put("title", "Hola Mundo");
model.put("message", "Este es un ejemplo de función lambda con Thymeleaf.");
Response response = new Response(200, null);
response.addTemplate("index.html", model);
return response;
});
```
- La ruta `/hello` devuelve una página HTML generada dinámicamente con Thymeleaf.
- El modelo contiene los datos que se inyectan en la plantilla.
---
### 3. **Estructura de la Carpeta `templates/`**
Las plantillas deben almacenarse en la carpeta `resources/templates/`. Por ejemplo:
```plaintext
src/
├── main/
│ ├── resources/
│ │ ├── templates/
│ │ │ └── index.html
```
#### **Ejemplo de Plantilla (`index.html`)**
Aquí tienes un ejemplo de una plantilla Thymeleaf:
```html
Título por defecto
Mensaje por defecto
```
- **`${title}`** y **`${message}`** son variables del modelo que se inyectan en la plantilla.
- Si no se proporciona un valor para estas variables, se mostrarán los valores por defecto.
---
### 4. **Métodos Relevantes en la Clase `Response`**
#### **A. Método `addTemplate`**
El método `addTemplate` permite renderizar una plantilla con un modelo y devolverla como respuesta.
```java
public Response addTemplate(String templateName, Map model) {
if (templateName == null || templateName.isEmpty()) {
throw new IllegalArgumentException("El nombre de la plantilla no puede ser nulo o vacío");
}
addHeader("Content-Type", "text/html; charset=UTF-8");
this.body = templateProcessor.render(templateName, model);
return this;
}
```
- **templateName**: Nombre de la plantilla (sin prefijo ni sufijo).
- **model**: Datos a inyectar en la plantilla.
---
## **Middlewares**
### A. **Middleware CORS (CorsMiddleware)**
Este middleware permite configurar políticas de acceso entre dominios (Cross-Origin Resource Sharing).
#### **Configuración Básica:**
```java
CorsMiddleware corsMiddleware = new CorsMiddleware();
corsMiddleware.addAllowedOrigins("https://example.com")
.addAllowedMethods("GET", "POST")
.setAllowCredentials(true)
.setMaxAge(3600);
server.use(corsMiddleware);
```
- Permite configurar orígenes permitidos, métodos HTTP y credenciales.
---
### B. **Middleware de Restricción de IPs (IpRestrictionMiddleware)**
Restringe el acceso a ciertas rutas o al servidor completo basándose en las direcciones IP de los clientes.
#### **Configuración Básica:**
```java
IpRestrictionMiddleware ipRestrictionMiddleware = new IpRestrictionMiddleware()
.addAllowedIps(Arrays.asList("192.168.1.10", "192.168.1.20"))
.addBlockedIps(Collections.singletonList("192.168.1.15"))
.setAllowAllByDefault(false); // Bloquea todas las IPs por defecto
server.use(ipRestrictionMiddleware);
```
- Permite crear una lista blanca y negra de IPs.
---
### C. **Middleware de Idioma (LanguageMiddleware)**
Detecta el idioma preferido del cliente (basado en el encabezado `Accept-Language`) y configura el idioma de la aplicación en función de eso.
#### **Configuración Básica:**
```java
LanguageMiddleware languageMiddleware = new LanguageMiddleware()
.addSupportedLanguages(Set.of("es", "en", "fr"))
.setDefaultLanguage("en")
.setLanguageHeader("Accept-Language");
server.use(languageMiddleware);
```
- Detecta automáticamente el idioma preferido del cliente.
---
### D. **Middleware de CSRF (CsrfMiddleware)**
El middleware **CSRF** protege contra ataques de falsificación de solicitudes entre sitios. Valida tokens CSRF en solicitudes **POST, PUT y DELETE**.
#### **1. Configuración en el servidor**
```java
Server server = new Server();
server.use(new CsrfMiddleware()); // Habilitar protección CSRF
server.start();
```
#### **2. Uso en formularios con Thymeleaf**
```html
Formulario
Enviar
```
---
Si el token es inválido, la solicitud será rechazada con **403 Forbidden**.
### E. **Agrupación de Rutas (Route Grouping)**
Ahora puedes agrupar rutas relacionadas bajo un prefijo común para reducir la repetición de código.
#### **Configuración Básica:**
```java
server.route("/api/v1/posts", new PostController());
```
---
## **Ejemplo Completo de Uso**
Aquí tienes un ejemplo completo que utiliza todas las nuevas funcionalidades del framework:
```java
import server.Server;
import middleware.CorsMiddleware;
import middleware.IpRestrictionMiddleware;
import middleware.LanguageMiddleware;
public class Main {
public static void main(String[] args) {
Server server = new Server(8080);
// Middleware CORS
server.use(new CorsMiddleware().addAllowedOrigins("https://example.com"));
// Middleware Restricción IPs
server.use(new IpRestrictionMiddleware().addAllowedIps(Arrays.asList("192.168.1.10")));
// Middleware Idioma
server.use(new LanguageMiddleware().setDefaultLanguage("en"));
// Rutas agrupadas
server.route("/api/v1/posts", new PostController());
// Ruta simple
server.get("/", request -> new Response(200, new JSONObject().put("message", "Welcome")));
server.start();
}
}
```
---
## **Cómo Usar el Framework**
### 1. **Ejemplo Básico: Crear un Servidor Simple**
```java
public class Main {
public static void main(String[] args) throws IOException {
Server server = new Server(8080);
server.get("/user/:id", request -> {
String userId = request.getPathParam("id");
return new Response(200, new JSONObject().put("userId", userId));
});
server.start();
}
}
```
---
## **Rutas Disponibles**
- **GET**
- **POST**
- **PUT**
- **DELETE**
---
## **Licencia**
Este proyecto está bajo la licencia MIT. Consulta el archivo [LICENSE](LICENSE) para más detalles.