JavaRush /Blog Java /Random-ES /Parte 5. Servlets, API de servlets de Java. Escribir una ...

Parte 5. Servlets, API de servlets de Java. Escribir una aplicación web sencilla

Publicado en el grupo Random-ES
Este material es parte de la serie “Introducción al desarrollo empresarial”. Artículos anteriores: Parte 5. Servlets, API de servlets de Java.  Escribir una aplicación web sencilla - 1¿Ya sabes cómo escribir aplicaciones Java que envíen texto a la consola, pero todavía no sabes cómo crear tu primera aplicación web? Genial, ponte cómoda. En este artículo, nos familiarizaremos con los servlets y escribiremos una aplicación que puedas mostrar a tus amigos sin enviarles un jarnik ni obligarlos a descargar Java. Escribamos una aplicación web . Si aún no está familiarizado con los enfoques que se utilizan en la programación web, le aconsejo que comience a leer desde el primer artículo de la serie " Introducción al desarrollo empresarial ".

¿Qué es un servlet?

Primero, averigüemos qué es un servlet y por qué se oye hablar de él con tanta frecuencia. Java Servlet API es una API estandarizada diseñada para implementarse en el servidor y trabajar con el cliente mediante un esquema de solicitud-respuesta. Un servlet es una clase que puede recibir solicitudes de un cliente y devolverle respuestas. Sí, los servlets en Java son precisamente los elementos con los que se construye la arquitectura cliente-servidor. Si recuerdas, ya hablamos de ello en uno de los artículos de la serie. No nos andemos con rodeos: escribamos algo de código de inmediato.

Lo que necesitas para crear una aplicación web.

Para trabajar cómodamente con servlets en Java, necesitará Intellij IDEA Ultimate Edition. Es de pago, pero puedes activar un período de prueba de 30 días o utilizar la versión de acceso anticipado; siempre es gratis. Instale también nuestro servidor de aplicaciones: Apache Tomcat. Tomcat es un contenedor de servlets: es el que procesa las solicitudes entrantes desde el exterior y las pasa a nuestra aplicación. Puedes descargar Tomcat desde este enlace .

Creando la primera aplicación web

Si todo está listo, creemos un proyecto Maven. Si no estás familiarizado con Maven, presta atención al artículo anterior . ¡Empecemos!
  1. En pom.xml, agregue la dependencia javax.servlet-api y configure la guerra de paquetes:

    <?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 necesita crear una configuración de Tomcat:

    Parte 5. Servlets, API de servlets de Java.  Escribir una aplicación web sencilla - 2 Parte 5. Servlets, API de servlets de Java.  Escribir una aplicación web sencilla - 3

  3. A continuación indicamos qué versión de Tomcat usaremos, la URL por la que podremos acceder al servidor y el puerto. Deberías obtener algo como esto:

    Parte 5. Servlets, API de servlets de Java.  Escribir una aplicación web sencilla - 4
  4. Todo lo que queda es 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 servlets. Parte 5. Servlets, API de servlets de Java.  Escribir una aplicación web sencilla - 5

  5. El contexto de la aplicación está configurado en servlets_war_exploded de forma predeterminada , lo que significa que se debe acceder a la aplicación en: http://localhost:8080/servlets_war_exploded .

    ¿Por qué necesitamos texto adicional? Eliminemos cosas innecesarias. Ahora la dirección de nuestra aplicación es: http://localhost:8080 .

    Parte 5. Servlets, API de servlets de Java.  Escribir una aplicación web sencilla - 6

  6. Haga clic en Aceptar. Vemos que ahora tenemos la oportunidad de lanzar la aplicación:

    Parte 5. Servlets, API de servlets de Java.  Escribir una aplicación web sencilla - 7

    Ahora, cuando inicie la aplicación, el navegador debería abrirse y mostrar un error 404. Esto es lógico, porque en la dirección http://localhost:8080/ debería haber un servlet con la asignación "/", y nuestro único servlet tiene la asignación "/hello" .

  7. Nos comunicamos con él en http://localhost:8080/hello y obtenemos la respuesta esperada: ¡la cadena "Hola"!

Si todo funciona, veamos el código. Para crear un servlet http a partir de una clase normal , debe heredarlo de la clase HttpServlet. Arriba de la clase especificamos la anotación @WebServlet(), en la que vinculamos (mapeamos) el servlet a una ruta específica (“/hola”). Esta anotación apareció sólo en Java Servlet API 3.0, por lo que hay muchos ejemplos en Internet en los que el mapeo de servlets se produce a través de un archivo XML. Ahora esto no es necesario. Para procesar solicitudes GET , anulamos el método doGet(). Preste atención a los argumentos del método: HttpServletRequest y HttpServletResponse. Del objeto HttpServletRequest podemos tomar toda la información necesaria sobre la solicitud, en HttpServletResponse podemos registrar nuestra respuesta y configurar los encabezados necesarios.

Trabajar con parámetros y sesión.

Mejoremos nuestro servlet para que pueda procesar los parámetros de solicitud y trabajar con la 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();
   }
}
El servlet está ejecutando actualmente la sesión, incrementando el contador de visitas cada vez que se visita la página. Si el atributo visitCounter aún no se ha creado (la primera vez que visita la página), el método getAttribute() devolverá nulo, por lo que deberá verificar si es nulo. Lo mismo se aplica a los parámetros de solicitud. Si el usuario no pasó el parámetro de nombre de usuario, su valor será nulo. En este caso, saludaremos al usuario como anónimo. Para pasar un parámetro en una solicitud GET, se utilizan variables de ruta, es decir, debe acceder al enlace http://localhost:8080/hello?username=Pavel . Puede leer más sobre las solicitudes http en el artículo anterior de la serie. Ahora nuestra aplicación tiene una lógica mínima, pero el error 404 en la ruta raíz es un poco molesto. Para solucionarlo, creemos otro servlet y asignemoslo a la página inicial @WebServlet("/"). El trabajo de este servlet es redirigir las solicitudes a la ruta "/hola". Hay dos formas de hacer esto: usando reenviar o redireccionar. Quizás valga la pena entender cuál es la diferencia entre ellos. adelante : delega el procesamiento de solicitudes a otro servlet en el servidor, el cliente no participa. Para hacer esto, necesita agregar 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 administrador de solicitudes del servlet deseado y le pedimos que procese una solicitud específica con los parámetros especificados (req, resp). redirigir : devuelve al cliente la dirección a la que necesita contactar para procesar su solicitud. La mayoría de los navegadores acceden automáticamente al enlace transmitido. Para implementar la redirección necesitas agregar este código:
resp.sendRedirect(req.getContextPath() + "/hello");
En HttpServletResponse llamamos al método de redirección() y le pasamos la dirección con la que el cliente necesita contactar. Un detalle importante: los parámetros http también deben agregarse al final de la ruta de redireccionamiento completa, lo cual no es muy conveniente. En nuestra situación, es preferible utilizar forward, pero sucede que es mejor utilizar redirigir. Si comprende la diferencia en su trabajo, no se equivocará con su elección. El código para el nuevo servlet tiene este aspecto:
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");
   }
}

Línea de fondo

Su primera aplicación web está lista. En el siguiente artículo aprenderá cómo implementarlo sin utilizar Intellij IDEA. Escribimos una aplicación que solo procesa solicitudes GET. Los métodos http restantes se procesan de la misma manera: anulando los métodos correspondientes de la clase principal. Con servlets tan simples, puede crear aplicaciones web ricas y complejas. Por supuesto, al utilizar marcos grandes como Spring, esto es mucho más fácil de hacer. Pero si realmente quieres profundizar más 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) Parte 8. Escribir una pequeña aplicación en spring-boot
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION