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.