Introducción a los servlets de Java

1. Información general

En este artículo, veremos un aspecto central del desarrollo web en Java: Servlets.

2. El servlet y el contenedor

En pocas palabras, un Servlet es una clase que maneja solicitudes, las procesa y responde con una respuesta.

Por ejemplo, podemos usar un Servlet para recopilar información de un usuario a través de un formulario HTML, consultar registros de una base de datos y crear páginas web de forma dinámica.

Los servlets están bajo el control de otra aplicación Java llamada Servlet Container. Cuando una aplicación que se ejecuta en un servidor web recibe una solicitud , el servidor entrega la solicitud al contenedor de servlets, que a su vez la pasa al servlet de destino.

3. Dependencias de Maven

Para agregar soporte de Servlet en nuestra aplicación web, javax . Se requiere la dependencia de servlet-api :

 javax.servlet javax.servlet-api 3.1.0 

La última dependencia de maven se puede encontrar aquí.

Por supuesto, también tendremos que configurar un contenedor Servlet para implementar nuestra aplicación; este es un buen lugar para comenzar sobre cómo implementar un WAR en Tomcat.

4. Ciclo de vida del servlet

Repasemos el conjunto de métodos que definen el ciclo de vida de un Servlet.

4.1. en eso()

El método init está diseñado para ser llamado solo una vez. Si no existe una instancia del servlet, el contenedor web:

  1. Carga la clase de servlet
  2. Crea una instancia de la clase de servlet
  3. Lo inicializa llamando al método init

El método init debe completarse correctamente antes de que el servlet pueda recibir solicitudes. El contenedor de servlet no puede poner el servlet en servicio si el método init arroja una ServletException o no regresa dentro de un período de tiempo definido por el servidor web.

public void init() throws ServletException { // Initialization code like set up database etc.... }

4.2. Servicio()

Este método solo se llama después de que el método init () del servlet se haya completado con éxito .

El contenedor llama al método service () para manejar las solicitudes provenientes del cliente, interpreta el tipo de solicitud HTTP ( GET , POST , PUT , DELETE , etc.) y llama a los métodos doGet , doPost , doPut , doDelete , etc., según corresponda.

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // ... }

4.3. destruir()

Lo llama el contenedor de servlet para poner fuera de servicio el servlet.

Este método solo se llama una vez que todos los subprocesos dentro del método de servicio del servlet han salido o después de un período de tiempo de espera. Después de que el contenedor llame a este método, no volverá a llamar al método de servicio en el Servlet.

public void destroy() { // }

5. Servlet de ejemplo

Configuremos ahora un ejemplo completo de manejo de información usando un formulario.

Para comenzar, definamos un servlet con un mapping / calculateServlet que capturará la información POSTADA por el formulario y devolverá el resultado usando un RequestDispatcher:

@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet") public class FormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String height = request.getParameter("height"); String weight = request.getParameter("weight"); try { double bmi = calculateBMI( Double.parseDouble(weight), Double.parseDouble(height)); request.setAttribute("bmi", bmi); response.setHeader("Test", "Success"); response.setHeader("BMI", String.valueOf(bmi)); RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); } catch (Exception e) { response.sendRedirect("index.jsp"); } } private Double calculateBMI(Double weight, Double height) { return weight / (height * height); } }

Como se muestra arriba, las clases anotadas con @WebServlet deben extender la clase javax.servlet.http.HttpServlet . Es importante tener en cuenta que la anotación @WebServlet solo está disponible desde Java EE 6 en adelante.

El contenedor procesa la anotación @WebServlet en el momento de la implementación y el servlet correspondiente se pone a disposición en los patrones de URL especificados. Vale la pena notar que al usar la anotación para definir patrones de URL, podemos evitar usar el descriptor de implementación XML llamado web.xml para nuestro mapeo de Servlet.

Si deseamos mapear el Servlet sin anotación, podemos usar el tradicional web.xml en su lugar:

  FormServlet com.root.FormServlet   FormServlet /calculateServlet  

A continuación, creemos un formulario HTML básico :


    
Your Weight (kg) :
Your Height (m) :

${bmi}

Finalmente, para asegurarnos de que todo funciona como se esperaba, también escribamos una prueba rápida:

public class FormServletLiveTest { @Test public void whenPostRequestUsingHttpClient_thenCorrect() throws Exception { HttpClient client = new DefaultHttpClient(); HttpPost method = new HttpPost( "//localhost:8080/calculateServlet"); List nvps = new ArrayList(); nvps.add(new BasicNameValuePair("height", String.valueOf(2))); nvps.add(new BasicNameValuePair("weight", String.valueOf(80))); method.setEntity(new UrlEncodedFormEntity(nvps)); HttpResponse httpResponse = client.execute(method); assertEquals("Success", httpResponse .getHeaders("Test")[0].getValue()); assertEquals("20.0", httpResponse .getHeaders("BMI")[0].getValue()); } }

6. Servlet, HttpServlet y JSP

Es importante comprender que la tecnología Servlet no se limita al protocolo HTTP.

En la práctica, casi siempre lo es, pero Servlet es una interfaz genérica y HttpServlet es una extensión de esa interfaz, agregando soporte específico para HTTP, como doGet y doPost , etc.

Finalmente, la tecnología Servlet también es el controlador principal de una serie de otras tecnologías web como JSP - JavaServer Pages, Spring MVC, etc.

7. Conclusión

En este artículo rápido, presentamos los fundamentos de los servlets en una aplicación web Java.

El proyecto de ejemplo se puede descargar y ejecutar tal cual como un proyecto de GitHub.