Servlet con anotación

Como aprendimos en capítulos anteriores, el ciclo de vida de Servlet será administrado por el contenedor de Servlet que se encuentra bajo el servidor Web/Aplicaciones. Siempre que una HttpRequest provenga del navegador del cliente, el contenedor de servlet asignará la solicitud al servlet correspondiente en función de las asignaciones de URL proporcionadas en el archivo descriptor de implementación: web.xml. Por ejemplo: considere las siguientes asignaciones de servlet en el archivo web.xml.

XML

<servlet>
   <servlet-name>HelloServlet</servlet-name>
   <servlet-class>HelloServlet</servlet-class>
</servlet>
  
<servlet-mapping>
   <servlet-name>HelloServlet</servlet-name>
   <url-pattern>/hello</url-pattern>
</servlet-mapping>

Aquí, cada vez que hay una URL » /hola » proveniente de la solicitud del cliente, la asignamos a la clase » HelloServlet «. En lugar de proporcionar estas asignaciones en el archivo web.xml , simplemente podemos proporcionar una anotación en el Servlet como se muestra a continuación:

Java

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    // Code to be executed...
}

Anotaciones de servlet

Java Servlets proporciona una serie de anotaciones que permiten a los usuarios declarar servlets, filtros y oyentes en el paquete javax.servlet.annotation . También proporciona anotaciones para especificar metadatos para los componentes que se declaran.

Tipo de anotación WebServlet:

Java

public @interface WebServlet
  • Disponible en el paquete javax.servlet.annotation.
  • Se utiliza para declarar un Servlet.
  • En el momento de la implementación, el contenedor de servlet identificará y procesará la anotación y hará que el servlet correspondiente esté disponible en los patrones de URL especificados.

Elementos de la anotación @WebServlet:

Nombre

Modificador y Tipo

Descripción

Valor por defecto

asyncCompatible booleano Para especificar si el servlet admite el modo asíncrono o no. falso
descripción Cuerda Para proporcionar una descripción del servlet. “”
nombre para mostrar Cuerda Para proporcionar el nombre para mostrar del servlet. “”
initParams WebInitParam[] Para especificar los parámetros de inicialización del servlet. {}
nombre Cuerda Para proporcionar el nombre del servlet. “”
valor Cuerda[] Para especificar el patrón de URL del servlet que se va a mapear. {}
urlPatrones Cuerda[] Para proporcionar los patrones de URL del servlet que se va a asignar. {}
icono pequeño Cuerda Para especificar el nombre del icono pequeño del servlet. “”
cargar al iniciar En t Para proporcionar la carga en el orden de inicio del servlet. -1
icono grande Cuerda Para especificar el nombre del icono grande del servlet. “”

Los elementos displayName, description, smallIcon y largeIcon son utilizados básicamente por IDEs, herramientas o contenedores de servlets. Estos no afectan la ejecución del servlet.

Servlet con ejemplos de anotación

Para una mejor comprensión, crearemos una página HTML simple para mapear el Servlet con la URL.

Ejemplo 1:

Servlet anotado con solo patrón de URL:

índice.html

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Home</title>
</head>
<body>
    <form action="hello" method="post">
  
        Welcome Page: <input type="submit" />
  
    </form>
</body>
</html>

Página html que mapea el servlet con la URL “/hello”.

HolaServlet.java

Java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.close();
    }
}
  • Cuando el usuario hace clic en Enviar para la página de bienvenida, el contenedor procesará la anotación “ @WebServlet(“/hello”) ” y asignará la clase “ HelloServlet ”.
  • Como el método se menciona como » publicación » en la página Html, el contenedor ejecutará el método » doPost() » en la clase » HelloServlet «.

Producción:

  • Ejecute el proyecto en el servidor para obtener el resultado.
  • URL: http://localhost:8081/ServletFlow/index.html

index.html file

  • Haga clic en Enviar.

Welcome Page

Puede ver la asignación de URL a la clase «HelloServlet» y la salida.

Ejemplo 2:

Servlet anotado con información de servlet:

HolaServlet.java

Java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet(name = "Hello Servlet",
            displayName = "Annotated Hello Servlet",
            description
            = "This is annotated servlet example.",
            value = "/hello")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with elements - name, displayName, description and value</h4>");
        out.close();
    }
}
  • Para incluir el nombre del servlet y cualquier descripción relacionada con el servlet, podemos usar elementos anotados como se muestra arriba.
  • La asignación de URL se puede especificar mediante el elemento de valor .

Producción:

  • Ejecute el proyecto y haga clic en enviar.

Welcome Page

Ejemplo 3:

Servlet anotado con parámetros de inicialización:

HolaServlet.java

Java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet(
    value = "/hello",
    initParams
    = { @WebInitParam(name = "name", value = "Geek")
        , })
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // Get the initialized parameter value
        String name = getInitParameter("name");
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println("<h3>Hello " + name
                    + ", Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with Initialization parameter.</h4>");
        out.close();
    }
}
  • Aquí, estamos especificando los valores de los parámetros usando la anotación @WebInitParam . Necesitamos proporcionar el nombre del parámetro que queremos inicializar y el valor que se establecerá.
  • Durante la inicialización del servlet, el contenedor procesará la anotación @WebInitParam dentro de la anotación @WebServlet e inicializará los valores especificados.
  • Entonces, estamos inicializando el parámetro » nombre» al valor » Geek » y lo mismo se escribirá en la salida en la respuesta.

Producción:

  • Ejecute el proyecto y haga clic en enviar.

Welcome Page

Ejemplo 4:

Servlet anotado con valor de carga en el inicio y soporte asíncrono:

HolaServlet.java

Java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet(value = "/hello", loadOnStartup = 1,
            asyncSupported = true)
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    public void init(ServletConfig config)
    {
        System.out.println(
            "Hello Servlet has been initialized");
    }
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with load-on-start up value and asynchronous support.</h4>");
        out.close();
    }
}
  • Generalmente, cuando la primera solicitud proviene del cliente, el contenedor de servlet identificará el servlet correspondiente y cargará, instanciará e inicializará el servlet.
  • Por lo tanto, el tiempo de respuesta para la primera solicitud del cliente es mayor en comparación con las siguientes requests del cliente.
  • Si especificamos el valor Load-on-startup como 1 , en el momento de la implementación del servlet en el propio servidor, el contenedor cargará, creará una instancia e inicializará el servlet cuando se inicie el servidor.
  • Para especificar que este servlet puede admitir el modo asíncrono, establezca el valor del elemento asyncSupported como verdadero.

Producción:

  • Ejecute el proyecto en el servidor.
  • Puede ver que el servlet está cargado, instanciado (método init()) e inicializado en el momento de la implementación del servlet en el servidor.

Output

  • Puede ver el mensaje de inicialización en la consola en el momento del inicio del servidor y la implementación del servlet.
  • Y la respuesta se generará en el navegador como se muestra a continuación.

Welcome Page

Ejemplo 5:

Servlet anotado con múltiples patrones de URL:

índice.html

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Home</title>
</head>
<body>
    <form action="hello" method="post">
        Click here for Welcome Page(using /hello URL): <input type="submit" />
    </form>
    <form action="welcome" method="get">
        Click here for Welcome Page(using /welcome URL): <input type="submit" />
    </form>
</body>
</html>

Incluya dos páginas de formulario con diferentes asignaciones de URL.

HolaServlet.java

Java

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
  
@WebServlet(urlPatterns = { "/welcome", "/hello" })
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
  
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with multiple URLs inside Get method.</h4>");
        out.close();
    }
  
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
  
        // set the response content type
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
  
        // Print hello message to the client browser in
        // response object
        out.println(
            "<h3>Hello, Welcome to GeeksforGeeks!!</h3>");
        out.println(
            "<h4>Annotated servlet with multiple URLs inside Post method.</h4>");
        out.close();
    }
}
  • Cuando la solicitud de URL llega al servlet, ya sea » /hola» o «/bienvenido», ambos se asignarán al mismo servlet.
  • Como se especifica en el formulario HTML, la acción » /hola» es con el método » /publicar». entonces, el contenedor ejecutará el método “ doPost() ” en el servlet y la acción “/ bienvenida ” es con el método “/ get ”. entonces, el contenedor ejecutará el método » doGet() » en el servlet.

Producción:

  • Ejecute el proyecto.

index.html

  • Cuando haga clic en el botón de envío » /hello» , el contenedor ejecutará el método » doPost() » en » HelloServlet » y se generará el siguiente resultado con esa URL.

Welcome page - Post method

  • Cuando haga clic en el botón de envío “ /bienvenido ”, el contenedor ejecutará el método “ doGet() ” en “ HelloServlet ” y se generará el siguiente resultado con esa URL.

Welcome page - Get method

  • Puede ver la diferencia entre la URL según la acción a la que llamamos el servlet correspondiente.
  • Como incluimos múltiples URL en el Servlet, el contenedor puede asignar la solicitud proveniente de «/ hola» y «/ bienvenido» al «HelloServlet» y generar la respuesta.

Conclusión

De esta manera, podemos usar diferentes anotaciones disponibles en el paquete javax.servlet.annotation para declarar y configurar los metadatos de los servlets de Java dentro del propio servlet en lugar de usar el archivo web.xml según los requisitos de nuestro proyecto.

Publicación traducida automáticamente

Artículo escrito por yaminitalisetty y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *