07 - Tomcat: Contenedor de Servlets
Tomcat es un contenedor de servlets, es decir, un servidor que sabe recibir peticiones HTTP y ejecutar clases Java de tipo Servlet para generar respuestas dinámicas.
Nuestro objetivo será:
- Preparar un docker-compose con Tomcat listo para desplegar aplicaciones web.
- Crear un proyecto web en IntelliJ preparado para Tomcat / Jakarta EE.
- Desplegar una web básica con HTML, CSS y JS.
Preparar Docker Compose
name: "tomcat" services: server: image: tomcat:11-jdk21-temurin container_name: tomcat_server ports: - 8080:8080 volumes: # Si más adelante queremos modificar la configuración de Tomcat, podemos copiar /conf # - ./tomcat/conf:/usr/local/tomcat/conf - ./tomcat/webapps:/usr/local/tomcat/webapps
Notas:
- El volumen webapps es donde se copian los archivos .war o carpetas de nuestras webs.
- El volumen conf se puede usar para personalizar Tomcat, pero de momento lo comentamos.
Si queremos modificar la configuración de Tomcat, podemos copiar los archivos de /conf del contenedor a nuestro host:
docker cp tomcat_server:/usr/local/tomcat/conf ./tomcat/conf
Esto copia la carpeta completa conf desde el contenedor tomcat_server al directorio ./tomcat/conf del host.
Luego podemos descomentar o añadir el volumen en docker-compose.yml:
volumes: - ./tomcat/conf:/usr/local/tomcat/conf - ./tomcat/webapps:/usr/local/tomcat/webapps
Ahora Tomcat usará nuestra configuración personalizada.
Crear proyecto web en IntelliJ
- Nuevo proyecto → Jakarta EE
- Template: Web Application
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.4.0</version> </plugin> </plugins> <finalName> ${project.artifactId} </finalName> </build>
ya que será el nombre del .war al compilar.
IntelliJ crea automáticamente un servlet de ejemplo:
package es.cesguiro.servlets.web; import java.io.*; import jakarta.servlet.http.*; import jakarta.servlet.annotation.*; @WebServlet(name = "helloServlet", value = "/hello-servlet") public class HelloServlet extends HttpServlet { private String message; public void init() { message = "Hello World!"; } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); // Hello PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("<h1>" + message + "</h1>"); out.println("</body></html>"); } public void destroy() { } }
Estructura de carpetas del proyecto web
miweb/ ├── src/ │ └── main/ │ ├── java/ <-- paquetes con clases Servlet │ └── webapp/ │ ├── index.jsp <-- archivo JSP inicial (lo borramos) │ ├── WEB-INF/ │ │ ├── web.xml <-- descriptor web (opcional en Servlet 3+) │ └── META-INF/ <-- opcional │ ├── css/ <-- css básico │ └── js/ <-- js básico
Desplegar la web
- Hacer build del proyecto en IntelliJ → genera un .war en target/.
- Copiar el .war o la carpeta desplegable a tomcat/webapps (volumen de Docker).
Por ahora la web será muy básica. Puedes añadir css y js propios.