- acerca de la creación de redes
- sobre arquitectura de software
- sobre HTTP/HTTPS
- sobre los conceptos básicos de Maven

¿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!-
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(); } }
-
Para ejecutar la aplicación, debe crear una configuración de Tomcat:
-
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:
-
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.
-
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 .
-
Haga clic en Aceptar. Vemos que ya podemos lanzar la aplicación:
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" .
-
Podemos acceder a él en http://localhost:8080/hello . Una vez que hacemos eso, obtenemos la respuesta esperada: ¡la cadena "Hola"!
@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: HttpServletRequest
y HttpServletResponse
. El HttpServletRequest
objeto 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 visitCounter
cada vez que se visita la página. Si el visitCounter
atributo 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 HttpServletResponse
pará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 redirect
es 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");
}
}
GO TO FULL VERSION