JTagua

Inicio » Servlet » Introducción Servlet » Tutorial de Servlet (1): Introducción, Ciclo de Vida y Ejemplo básico.

Tutorial de Servlet (1): Introducción, Ciclo de Vida y Ejemplo básico.

Licencia

Creative Commons License

Visitas:

  • 889.242 hits

¿Qué son los Servlets de Java?

Los Servlets son programas escritos en Java y que dan una respuesta alternativa a la programación Web con CGI , ampliando su funcionalidad. Se ejecutan en un servidor Web dentro de un contenedor de servlets (por ejemplo Apache Tomcat) y construyen páginas Web.

Algunas de las ventajas de los Servlet frente a los CGI podrían ser:

  • Más Eficiencia. Con CGI tradicional, se arranca un nuevo proceso para cada solicitud HTTP. Con los Servlets, cada petición es manejada por un hilo y no un proceso del sistema operativo. De forma similar, en CGI tradicional, si hay N peticiones simultáneas para el mismo programa CGI, el código de este problema se cargará N veces en memoria. Sin embargo, con los Servlets, hay N hilos pero sólo una copia de la clase Servlet.
  • Más Potencia. Los Servlets Java nos permiten fácilmente hacer muchas tareas que son difíciles con un CGI normal. Esto simplifica las operaciones que se necesitan para buscar imágenes y otros datos almacenados en situaciones estándards. Los Servlets también pueden compartir los datos entre ellos, también pueden mantener información de solicitud en solicitud, simplificando el seguimiento de sesiones,manejas cookies y cabeceras. La razón básica de esta potencia es la propia potencia de Java.
  • Más Portablilidad. Los Servlets están escritos en Java y siguen un API bien estandarizado y por tanto, están soportados directamente en la mayoría de los servidores Web.
  • Más Barato. Hay un número de servidores Web gratuitos o muy baratos que son buenos para el uso «personal» y la mayoría de instalaciones empresariales y este es el caso de Apache Tomcat.

El API Servlets y el ciclo de vida.

Los servlets usan clases e interfaces de dos paquetes:

  1. javax.servlet que contiene clases para servlets genéricos (independientes del protocolo que usen) y,
  2. javax.servlet.http (que añade funcionalidad particular de http). El nombre javax indica que los servlets son una extensión.

Los servlets no tienen el método main() como los programas Java, sino que se invocan unos métodos cuando se reciben peticiones. A esta metodología se le llama ciclo de vida de un servlet y viene dado por tres métodos: init, service, destroy:

INICIALIZACIÓN: Una única llamada al método “init” por parte del servlet. Incluso se pueden recoger unos parámetros concretos con “getInitParameter” de “ServletConfig” inicialales y que operarán a lo largo de toda la vida del servlet.
SERVICIO: una llamada a service() por cada invocación al servlet para procesar las peticiones de los clientes web.
DESTRUCCIÓN: Cuando todas las llamadas desde el cliente cesen o un temporizador del servidor así lo indique o el propio administrador así lo decida se destruye el servlet. Se usa el método “destroy” para eliminar al servlet y para «recoger sus restos» (garbage collection).

Cada vez que el servidor pasa una petición (distinta a la primera) a un servlet se invoca el método service(), este método habrá que sobreescribirlo (override). Este método acepta dos parámetros: un objeto petición (request) y un objeto respuesta. Los servlets http, que son los que vamos a usar, tienen ya definido un método service() que llama a doXxx(), con Xxx el nombre de la orden que viene en la petición al servidor web. Estos dos métodos son doGet() y doPost() y nos sirven para atender las peticiones específicamente provinientes de métodos GET o POST respectivamente,

De esta manera, una vez se carga el servlet, es muy eficiente, pues sólo hay una copia cargada en memoria (se ejecutan uno o varios hilos), no hay que crear nuevos objetos (un solo objeto servlet), y tiene persistencia: puede guardar información entre peticiones, como contadores o conexiones a una base de datos. Esto último puede ser muchísimo más eficiente hacerlo en el método init que abrir y cerrar la conexión con la base de datos en cada petición.

Métodos GET y POST

GET: Paso de parámetros en la propia URL de acceso al servicio/recurso del servidor.
Método asociado del servlet “doGet
GET /query.html?keyword=’diego’ HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: es,eu;q=0.7,en-gb;q=0.3
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: localhost:9999
Connection: Keep-Alive
 

POST: Lo mismo que GET pero los parámetros van en línea aparte dentro del cuerpo de la petición.
Método asociado del servlet “doPost”.

POST /cgi-bin/search.sh HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: es,eu;q=0.7,en-gb;q=0.3
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: localhost:9999
Content-Length: 13
Connection: Keep-Alive
Cache-Control: no-cache
keyword=diego

Ejemplo1:

Veamos la estructura básica de un servlet con un ejemplo.

Para entender cómo funciona un servlet vamos a diseñar uno muy básico y que a modo de plantilla nos sirva para construir otros, para hacer esto, iniciamos una sesión del IDE de NetBeans. Hacemos proyecto Web nuevo al que llamaremos «Ejem0Servlet», una vez tengamos la plantilla de la página index.jsp vamos a hacer que ésta llame a un servlet a través de un enlace href, es decir, el código de index.jsp será:

Ahora vamos a añadir un paquete al que llamaremos «paquete0», para hacer esto, bastaría situarse con el botón derecho sobre el nombre del proyecto y seleccionar Nuevo Paquete. Cuando tengamos el paquete, nos situamos en él y con el botón derecho seleccionamos Nuevo Servlet, llamamos al nuevo servlet «Servlet0» y aparecerá la siguiente plantilla,

donde hemos «descomentado» las instrucciones de processRequest . Como vemos en este servlet elemental, comienza con una cabecera donde se indica el paquete que lo contiene y seis importaciones de paquetes que son necesarios para su correcta ejecución,

luego vemos que la clase que define el servlet es una clase pública extendida o derivada de HttpServlet. Esta clase, naturalmente es pública para poder ser «vista» desde cualquier otro servlet o jsp del proyecto, es decir,

La contiene varios métodos, a saber:

1.- Método  protected void processRequest(HttpServletRequest request, HttpServletResponse response)

Como0 vemos este método se ejecuta tanto si la petición se realiza a través de GET como si es a través de POST y lo único que hace es devolver un texto. Merece especial consideración las instrucciones:

  1. response.setContentType(«text/html;charset=UTF-8»); Esta instrucción fija el tipo de contenido que será devuelto al peticionario, al cliente.
  2. PrintWriter out = response.getWriter(); Esta instrucción crea el objeto «out» que permitirá escribir la salida. Este objeto es distinto al objeto out implícito de los jsp.
  3. request.getContextPath; , contiene el path desde donde se ha reaklizado la petición.

2.-Método protected void doGet(HttpServletRequest request, HttpServletResponse response)

Este método llama al método processRequest, se prejuzga que las tareas a ejecutar son las mismas con una llamada GET que con una llamara POST. En caso de error se lanza la excepción ServletException.

3.-Método protected void doPost(HttpServletRequest request, HttpServletResponse response)

Este método llama al método processRequest, se prejuzga que las tareas a ejecutar son las mismas con una llamada GET que con una llamara POST. En caso de error se lanza la excepción ServletException.

4.-Método public String getServletInfo()

Podemos observar que la clase no tiene ni método init() ni método destroy. No son necesarios, ni obligatorios.

Si ejecutamos,

EJEMPLO2.

En el ejemplo anterior no queda claro quien atiende específicamente la petición, si doGet() o doPOst(). En realidad queda claro, pero de manera implícita, ya que cuando no existe un atributo «method»  en una etiqueta form de HTML que especifique el método GET o POST, el servlet SIEMPRE, por defecto, responde con el método doGet(). Vamos a modificar el programa anterior y construiremos otro al que llamaremos ejem1Servlet (la mejor idea es copiarlo con el IDE de Netbeans).

Modificaremos el Servlet0 de manera que no exista el método processRequest. Esta vez haremos que cada uno de los métodos doGet() y doPOst() responda cada uno por sí sólo.

He aquí los métodos:

y

Si ejecutamos el programa

como vemos, el servlet ha respondido con el método doGet(), que es el que utiliza por defecto cuando no se explicita el método de llamada.

Descriptor de despliegue:

El archivo web.xml se denomina descriptor de despliegue y es necesario cuando se utilizan servlet, porque con él se define su nombre y se identifica al paquete y clase que lo contiene, entre otras cuestiones. Mas adelante en este tutorial se analizarán otros usos, tales como los filtros, los parametros de contexto, los parametros iniciales, etc…En NetBeans se encuentra en la carpeta WEB-INF.

Conviene recordar:

El ciclo de vida de un servlet.

Los distintos métodos fundamentales de un servlet: init, service, doGet, doPost, destroy.

Relación entre los métodos GET y POST de un formulario, llamadas desde la etiqueta

Cuando utilizar GET y POST en función de la seguridad.

El uso de web.xml o descriptor de despliegue.


14 comentarios

  1. Luchita dice:

    Buenísimo el articulo..
    😀

  2. isaie dice:

    me ha servido de mucho gracias sigue subiendo mas

  3. aleonerrr dice:

    ou yeah!!!

  4. edwin qm dice:

    Excelente aporte amigo sigue adelante.

  5. Ceci Torres dice:

    me ha servido, gracias

  6. neomomi dice:

    me salvo la vida

  7. Pepe K. dice:

    Muchas gracias por la explicación tan detallada…..

  8. Ruth Escobar dice:

    Muy buen tutorial, me quedó muy claro aunque soy muy nueva en esto. Felicitaciones.
    Pero sigo teniendo una duda…
    Me podrías explicar para que el el método «processRequest». No me quedó clara la función que cumple.
    Desde ya muchas gracias.

Deja un comentario