====== 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.