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