====== 06 - Tomcat ======
**Tomcat** es un **contenedor de servlets**: gestiona el ciclo de vida de los servlets y filtros, atiende las conexiones y reparte cada petición en un hilo de su pool. Es la versión "de verdad" del servidor que se construyó en los temas anteriores.
===== 1. Qué hace =====
^ Capa ^ Cómo la resuelve Tomcat ^
| Sockets y protocolo HTTP | Conector HTTP en un puerto (por defecto 8080) |
| Concurrencia | Pool de hilos worker (''http-nio-8080-exec-N'') |
| Enrutado | Cada ruta (''@WebServlet'', ''@WebFilter'') a su componente |
| Ciclo de vida | ''init''/''destroy'' de servlets y filtros |
| Recursos | Archivos estáticos, errores HTTP, sesiones (no se usan aquí) |
===== 2. Estructura de una webapp =====
miapp/
├── WEB-INF/
│ ├── web.xml (configuración, opcional con anotaciones)
│ ├── classes/ (clases compiladas)
│ └── lib/ (JARs de dependencias)
├── index.html
└── ...
* El contenido fuera de ''WEB-INF'' se sirve como **archivos estáticos** (HTML, CSS, JS).
* ''WEB-INF'' no es accesible por HTTP: contiene código y configuración.
* La aplicación se empaqueta como ''.war'' y se despliega en Tomcat.
===== 3. Anotaciones frente a web.xml =====
Las rutas se declaran con anotaciones:
@WebServlet("/books")
public class BookServlet extends HttpServlet { /* ... */ }
@WebFilter("/*")
public class TokenFilter implements Filter { /* ... */ }
O en ''web.xml'' con el mismo resultado:
bookServlet
com.example.BookServlet
bookServlet
/books
La combinación habitual: anotaciones para lo simple, ''web.xml'' cuando la configuración cambia por entorno.
===== 4. Pool de hilos =====
Cada petición la ejecuta un hilo del pool:
"execution" de una petición en Tomcat:
http-nio-8080-exec-1 -> atiende petición A
http-nio-8080-exec-2 -> atiende petición B (simultánea)
http-nio-8080-exec-1 -> reutilizado para la petición C
Los hilos se reutilizan entre peticiones: cualquier ''ThreadLocal'' sin limpiar filtra datos a la siguiente petición, igual que en el servidor propio.
===== 5. Dos modos de uso =====
^ Modo ^ Descripción ^
| **Servidor independiente** | Se instala Tomcat y se despliega el ''.war'' en su carpeta ''webapps'' |
| **Embebido** | La aplicación arranca Tomcat dentro de sí misma (así funciona Spring Boot) |
Tomcat ejecuta exactamente el modelo de los temas anteriores: acepta conexiones, las reparte en hilos del pool y delega cada petición en un servlet a través de la cadena de filtros. Lo que cambia es quién escribe ese servidor: ya no tú, sino el contenedor.