Tabla de Contenidos

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 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:

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

Si queremos cambiar el nombre del proyecto cuando se despliegue, debemos añadir al <build> del pom.xml:

    <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

Borrar el index.jsp y crear nuestros propios archivos .html, css y js.

Desplegar la web

Por ahora la web será muy básica. Puedes añadir css y js propios.