CodeGym/Blog Java/Random-ES/Parte 5. Servlets y la API de Java Servlet. Escribir una ...
John Squirrels
Nivel 41
San Francisco

Parte 5. Servlets y la API de Java Servlet. Escribir una aplicación web sencilla

Publicado en el grupo Random-ES
Este material forma parte de la serie "Introducción al desarrollo empresarial". Artículos anteriores: Parte 5. Servlets y la API de Java Servlet.  Escribiendo una aplicación web simple - 1¿Ya sabe cómo escribir aplicaciones Java que muestran texto en la consola, pero aún no sabe cómo crear su primera aplicación web? Genial, ponte cómodo. En este artículo, nos familiarizaremos con los servlets y escribiremos una aplicación de la que pueda presumir ante sus amigos sin enviarles un archivo JAR y sin obligarlos a descargar Java. Escribamos una aplicación web simple . Si aún no está familiarizado con los enfoques utilizados en el desarrollo web, le recomiendo que comience leyendo el primer artículo de la serie " Introducción al desarrollo empresarial ".

¿Qué es un servlet?

Primero, averigüemos qué son los servlets y por qué escucha hablar de ellos con tanta frecuencia. La API de Java Servlet es una API estandarizada destinada a implementarse en el servidor. Interactúa con los clientes según un esquema de solicitud-respuesta. Un servlet es una clase que puede recibir solicitudes de un cliente y devolver respuestas al cliente. De hecho, los servlets son exactamente los componentes básicos que usamos para crear una arquitectura cliente-servidor en Java. Tal vez recuerdes que ya hablamos de esa arquitectura en otro de los artículos de la serie. No vamos a andarnos por las ramas: escribamos algo de código de inmediato.

Lo que necesitas para crear una aplicación web

Para mayor comodidad al trabajar con servlets de Java, necesita IntelliJ IDEA Ultimate Edition. Es un producto de pago, pero puedes activar una prueba de 30 días o utilizar la versión de acceso anticipado, que siempre es gratuita. Además, instale Apache Tomcat, el servidor de nuestra aplicación. Tomcat es un contenedor de servlets: procesa las solicitudes entrantes y las pasa a nuestra aplicación. Descarga Tomcat aquí .

Creemos nuestra primera aplicación web

Si todo está listo, cree un proyecto Maven. Si no está familiarizado con Maven, eche un vistazo al artículo anterior . ¡Vamos a empezar!
  1. En pom.xml, agregue una dependencia javax.servlet-api y especifique el paquete WAR:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>

    Clase de servlet simple:

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
  2. Para ejecutar la aplicación, debe crear una configuración de Tomcat:

    Parte 5. Servlets y la API de Java Servlet.  Escribir una aplicación web simple - 2Parte 5. Servlets y la API de Java Servlet.  Escribir una aplicación web simple - 3

  3. A continuación, indicamos qué versión de Tomcat usaremos, y la URL y el puerto para comunicarnos con el servidor. Deberías tener algo como esto:

    Parte 5. Servlets y la API de Java Servlet.  Escribir una aplicación web sencilla - 4
  4. Ahora solo necesitamos especificar el artefacto (el proyecto ensamblado en un archivo JAR) que se implementará en el contenedor. Puede hacer clic en el botón Reparar y seleccionar guerra explotada : esto significa que después de reconstruir el proyecto, el artefacto se colocará automáticamente en el contenedor de servlet. Parte 5. Servlets y la API de Java Servlet.  Escribir una aplicación web sencilla - 5

  5. El valor predeterminado para el contexto de la aplicación es servlets_war_exploded . Esto quiere decir que accedemos a la aplicación en: http://localhost:8080/servlets_war_exploded .

    ¿Por qué querríamos un texto extra? Eliminemos lo innecesario. Ahora la dirección de nuestra aplicación web es: http://localhost:8080 .

    Parte 5. Servlets y la API de Java Servlet.  Escribir una aplicación web sencilla - 6
  6. Haga clic en Aceptar. Vemos que ya podemos lanzar la aplicación:

    Parte 5. Servlets y la API de Java Servlet.  Escribir una aplicación web sencilla - 7

    Ahora, cuando abra la aplicación en su navegador, debería obtener un error 404. Esto tiene sentido, porque la dirección http://localhost:8080/ necesita un servlet que se asigne a "/", pero nuestro único servlet se asigna a "/hello" .

  7. Podemos acceder a él en http://localhost:8080/hello . Una vez que hacemos eso, obtenemos la respuesta esperada: ¡la cadena "Hola"!

Si todo funciona, analicemos el código. Para hacer un servlet HTTP a partir de una clase ordinaria , debe heredar la clase HttpServlet. Encima de la declaración de clase, indicamos la @WebServlet()anotación. Aquí es donde vinculamos (o asignamos) el servlet a una ruta específica ("/ hola"). Esta anotación apareció solo en Java Servlet API 3.0, por lo que Internet tiene muchos ejemplos en los que el mapeo de servlet se realiza a través de un archivo XML. Esto ya no es necesario. Para manejar las solicitudes GET , anulamos el doGet()método. Preste atención a los parámetros del método: HttpServletRequesty HttpServletResponse. El HttpServletRequestobjeto nos proporciona toda la información necesaria sobre la solicitud. En el HttpServletResponse, escribimos nuestra respuesta y establecemos los encabezados necesarios.

Trabajando con parámetros y una sesión

Mejoremos nuestro servlet para que pueda procesar los parámetros de solicitud y trabajar con una sesión:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
Ahora el servlet funciona con una sesión, aumentando el valor de visitCountercada vez que se visita la página. Si el visitCounteratributo aún no se ha creado (en la primera visita a la página), el getAttribute()método devuelve nulo, por lo que debemos verificar si es nulo. Lo mismo ocurre con los parámetros de solicitud. Si el usuario no pasa el parámetro de nombre de usuario, su valor será nulo. En este caso, saludamos al usuario como visitante anónimo. Para pasar un parámetro en una solicitud GET, se usa una cadena de consulta. Por ejemplo, podríamos usar la siguiente URL: http://localhost:8080/hello? Nombre de usuario = Pablo. Puede leer más sobre las solicitudes HTTP en el artículo anterioren la serie Nuestra aplicación actualmente no tiene mucha lógica, pero es un poco molesto que obtengamos un error 404 en la ruta raíz. Para solucionar esto, crearemos otro servlet y lo asignaremos a la página de inicio: @WebServlet("/"). El propósito de este servlet es redirigir las solicitudes a la ruta "/hello". Hay dos formas de hacer esto: usando "reenviar" o "redireccionar". Tal vez valga la pena entender la diferencia entre ellos. Un reenvío delega el procesamiento de la solicitud a otro servlet en el servidor. El cliente no está involucrado. Para hacer esto, agregue el siguiente código al método doGet() del nuevo servlet:
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
En este código, accedemos al contexto del servlet, obtenemos el despachador de solicitudes para el servlet relevante y le pedimos que procese una solicitud específica con los argumentos especificados (req, resp). Una redirección devuelve al cliente la dirección que el cliente debe usar para procesar su solicitud. La mayoría de los navegadores navegan automáticamente a la URL devuelta. Para implementar una redirección, debe agregar este código:
resp.sendRedirect(req.getContextPath() + "/hello");
Llamamos al redirect()método en el HttpServletResponseparámetro y le pasamos la dirección que el cliente necesita usar. Aquí hay un detalle importante: los parámetros HTTP también deben agregarse al final de la ruta de redirección completa, lo cual no es muy conveniente. En nuestra situación, es preferible usar forward, pero a veces usar redirectes mejor. Si comprende la diferencia en cómo funcionan, no tomará la decisión equivocada. El código para el nuevo servlet se ve así:
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

Resumen

Tu primera aplicación web está lista. En el próximo artículo, aprenderá cómo implementarlo sin usar IntelliJ IDEA. Escribimos una aplicación que procesa solo solicitudes GET. Los métodos HTTP restantes se manejan de manera similar, anulando los métodos correspondientes de la clase principal. Puede usar servlets simples como este para crear aplicaciones web sofisticadas y versátiles. Por supuesto, el uso de grandes marcos como Spring hace que esto sea mucho más fácil. Pero si realmente quieres profundizar en todas las capacidades de los servlets, puedes leer la especificación oficial . Parte 6. Contenedores de Servlets Parte 7. Introducción al patrón MVC (Modelo-Vista-Controlador)
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios