Saltar a contenido

18. SERVLETS

Los servlet se ejecutan en el servidor.

Un servlet es un componente de programación en Java que se utiliza para crear aplicaciones web dinámicas. A continuación, se presentan algunos conceptos básicos de servlets:

  • Ciclo de vida del servlet: Los servlets tienen un ciclo de vida definido que comienza con su creación y finaliza con su eliminación. Durante este ciclo de vida, un servlet puede recibir solicitudes del cliente y generar respuestas.

  • Configuración del servlet: Los servlets se configuran mediante archivos de descriptor de implementación (archivo web.xml) y anotaciones de Java. Estos archivos se utilizan para especificar los parámetros de inicialización del servlet, como su nombre, su URL y sus parámetros de configuración.

  • Métodos HTTP: Los servlets procesan solicitudes HTTP, que pueden ser de diferentes tipos, como GET, POST, PUT, DELETE, etc. Los servlets utilizan diferentes métodos para procesar diferentes tipos de solicitudes.

  • API de servlets: Los servlets se implementan mediante la API de servlets de Java. Esta API proporciona un conjunto de interfaces y clases que se utilizan para interactuar con los objetos de solicitud y respuesta HTTP.

  • Objeto HttpServletRequest: El objeto HttpServletRequest representa la solicitud del cliente y proporciona métodos para acceder a los parámetros de la solicitud, las cabeceras HTTP y otros datos relacionados con la solicitud.

  • **Objeto HttpServletRespons**e: El objeto HttpServletResponse representa la respuesta del servidor y proporciona métodos para establecer las cabeceras HTTP y el contenido de la respuesta.

  • Manejo de excepciones: Los servlets pueden manejar excepciones utilizando el mecanismo de excepciones de Java. Cuando se produce una excepción, el servlet puede enviar una respuesta de error al cliente o redirigir la solicitud a otra página.

  • Hilos y concurrencia: Los servlets pueden ser accedidos por varios hilos simultáneamente, por lo que es importante que sean seguros para subprocesos. Los desarrolladores deben asegurarse de que los recursos compartidos sean protegidos por mecanismos de sincronización adecuados para evitar problemas de concurrencia.

18.1 Arquitectura servlet

(ver http://www.jtech.ua.es/historico/ias/restringido/apuntes/sesion03-apuntes.htm)

arq

18.2 Configuración del Servlet web.xml

En el siguiente fichero se configura un servlet llamado MyServlet y un filtro.

ejemplo web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- Definición de servlets -->
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.example.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/my-servlet</url-pattern>
    </servlet-mapping>

    <!-- Definición de filtros -->
    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.example.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- Parámetros de inicialización -->
    <context-param>
        <param-name>my-param</param-name>
        <param-value>my-value</param-value>
    </context-param>

</web-app>
Este archivo web.xml define dos componentes servlet, dos componentes filtro y un parámetro de inicialización para una aplicación web Java. Estos componentes y parámetros se utilizan para manejar las solicitudes HTTP entrantes y configurar la aplicación web.

18.3 Esructura de un servlet

  1. Crear el servlet: En primer lugar, se debe crear el servlet que procesará la solicitud del cliente. El servlet debe extender la clase HttpServlet y debe anotarse con la URL de la solicitud que va a procesar. Por ejemplo:
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // código para procesar la solicitud
    }
}
  1. En segundo lugar, se debe crear la página HTML que se utilizará para enviar la solicitud al servlet. La página HTML debe contener un formulario que incluya la acción del servlet como URL. Por ejemplo:
    ```html
3. Procesar la solicitud: Cuando se envía el formulario, la solicitud se envía al servlet correspondiente. El servlet procesa la solicitud y genera una respuesta. Por ejemplo, el servlet puede obtener el valor del parámetro "name" y utilizarlo para generar una respuesta:  
```java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String name = request.getParameter("name");
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html>");
    out.println("<head><title>Respuesta del servlet</title></head>");
    out.println("<body>");
    out.println("<h1>Hola " + name + "</h1>");
    out.println("</body>");
    out.println("</html>");
}

18.4 Páginas html. Plantillas

Los servlets pueden utilizar páginas HTML almacenadas en archivos como plantillas para generar la respuesta que se envía al cliente. Esta técnica se conoce como "programación basada en plantillas" y es común en el desarrollo de aplicaciones web dinámicas.

Para utilizar una página HTML como plantilla en un servlet, se puede cargar el contenido del archivo en una cadena utilizando la clase java.io.BufferedReader o una biblioteca externa como Apache Commons IO. Luego, se puede utilizar esa cadena como base para generar la respuesta que se envía al cliente.

Por ejemplo, suponga que tiene un archivo llamado "template.html" que contiene una plantilla HTML básica. Puede cargar el contenido del archivo en una cadena y utilizar esa cadena como base para generar la respuesta del servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String templateContent = readFileContent("/path/to/template.html");
    String name = request.getParameter("name");
    String outputContent = templateContent.replace("{{name}}", name);
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println(outputContent);
}

private String readFileContent(String filePath) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader(filePath));
    String line = null;
    StringBuilder sb = new StringBuilder();
    while ((line = reader.readLine()) != null) {
        sb.append(line);
    }
    reader.close();
    return sb.toString();
}
En este ejemplo, se carga el contenido del archivo "template.html" en la cadena "templateContent" utilizando el método "readFileContent". Luego, se reemplaza la cadena "{{name}}" en el contenido de la plantilla con el valor del parámetro "name" de la solicitud. Finalmente, se envía la respuesta al cliente utilizando la cadena generada como contenido HTML.

18.4.1 Lenguaje de plantillas

Un lenguaje de plantillas es un lenguaje que se utiliza para definir la estructura y el formato de una página web o de un documento de texto. Las plantillas se utilizan para separar la presentación de los datos en una aplicación web, lo que permite una mayor flexibilidad y un mejor mantenimiento del código.

Existen muchos lenguajes de plantillas diferentes, cada uno con sus propias sintaxis y características. Algunos de los lenguajes de plantillas más populares son:

  • JSP: JavaServer Pages es un lenguaje de plantillas utilizado en aplicaciones web basadas en Java. Permite la inclusión de código Java en las plantillas para generar contenido dinámico.

  • Thymeleaf: Thymeleaf es un lenguaje de plantillas utilizado en aplicaciones web basadas en Java y otros lenguajes. Permite la inclusión de código de plantilla en las páginas HTML y soporta la generación dinámica de contenido.

  • Mustache: Mustache es un lenguaje de plantillas utilizado en aplicaciones web basadas en diferentes lenguajes. Utiliza una sintaxis simple y minimalista para definir las plantillas

  • Handlebars: Handlebars es un lenguaje de plantillas basado en Mustache que permite la inclusión de bloques condicionales y de iteración en las plantillas.

  • Twig: Twig es un lenguaje de plantillas utilizado en el marco de trabajo de PHP Symfony. Permite la inclusión de código PHP en las plantillas para generar contenido dinámico.

18.5 Proyecto con Servlets paso a paso.

(ejemplo en esta web )

Para crear un servlet que devuelva una página web con una tabla que contenga información de equipos de fútbol, puedes seguir los siguientes pasos:

  1. Crear un proyecto "Dynamic web Project" en tu IDE Eclipse. Todos los valores por defecto. Por ejemplo los fuentes en **src/main/java. Pero incluyendo:
  2. Target runtime: Apache -> Tomcat v10 . El directorio de intalación , por ahora el del proyecto
  3. Dynamic web version 5.0

  4. Crear una clase Java que extienda la clase HttpServlet. En eclipse se crea con el menu New -> servlet . Crear la clase "Clasificación" que hereda de javax.servlet.http.HttpServlet. En la ventana siguiente se puede indicar la "URL mapping" o como vamos a localizar la página por http.

  5. Sobrescribir el método doGet() del servlet para generar la respuesta HTTP. Este método se llamará cada vez que se reciba una solicitud GET en el servlet.

  6. Dentro del método doGet(), crea una tabla HTML utilizando la clase StringBuilder o cualquier otra herramienta que prefieras.

  7. Agrega filas a la tabla para cada equipo de fútbol que desees mostrar. Puedes obtener esta información desde una base de datos, un archivo de configuración o cualquier otra fuente de datos.

  8. Para cada equipo, agrega dos columnas a la fila: una con el nombre del equipo y otra con la puntuación. Si los datos están almacenados en una lista de objetos, por ejemplo, puedes utilizar un bucle for para iterar sobre la lista y agregar una fila para cada objeto.

  9. Finalmente, utiliza el objeto PrintWriter para escribir la respuesta HTTP en la salida del servlet. Este objeto te permitirá enviar la tabla HTML al navegador del usuario que realizó la solicitud.

18.6 Servlets y JDBC

Tomcat y mysql 8
Para usar, por ejemplo jdb con mysql en el IDE Eclipse, se debe colocar el jar con el driver en "WEB-INF/lib" para que tomcat