===== 07 - Tomcat: Contenedor de Servlets =====
[[https://tomcat.apache.org/tomcat-11.0-doc/index.html|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**
Si queremos cambiar el nombre del proyecto cuando se despliegue, debemos añadir al del pom.xml:\\ \\
org.apache.maven.plugins
maven-war-plugin
3.4.0
${project.artifactId}
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("");
out.println("" + message + "
");
out.println("");
}
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 =====
* Hacer build del proyecto en IntelliJ -> genera un .war en target/.\\ \\
* Copiar el .war o la carpeta desplegable a tomcat/webapps (volumen de Docker).\\ \\
* Arrancar docker-compose up y acceder a http://localhost:8080/miweb/.\\ \\
Por ahora la web será muy básica. Puedes añadir css y js propios.