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
- Haga clic en Enviar.
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.
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.
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.
- 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.
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.
- 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.
- 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.
- 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