JSP. 20 Servlets


Un servlet es un componente o clase Java que genera contenido web dinámico. El contenedor web carga, ejecuta y administra el servlet, siguiendo el siguiente proceso:
  1. El cliente envía una solicitud al contenedor.
  2. En caso de que el servlet no esté cargado, el contenedor lo carga. Una vez cargado permanece cargado hasta que el contenedor decide descargarlo o se cierra el propio contenedor.
  3. El contenedor envía la información de la solicitud al servlet, creando un nuevo hilo por cada solicitud a ejecutar.
  4. El servlet procesa la solicitud, construye la respuesta y la devuelve al contenedor.
  5. El contenedor envía la respuesta al cliente.

Creación de un servlet:
  1. New File → Categories: Web, File Types: Servlet. Click Next.
  2. Class Name: nombre de la clase servlet, Package: paquete donde se creará. Click Next.
  3. Información del servlet a crear:
    1. Add information to Deployment descriptor: no seleccionarla, no añadimos el servlet al archivo de de configuración web.xml, de momento no se hará uso de el.
    2. Class Name: nombre de la clase Java a crear.
    3. Servlet Name: nombre del servlet.
    4. URL Pattern(s): dirección URL por la que acceder al servlet.
    5. Click Finish.

Ejemplo, servlet creado siguiendo los pasos anteriores: 
 
package com.me.jsp.servlets;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 =
"servlet1", urlPatterns = {"/servlet1"})
public class Servlet1 extends HttpServlet {

 
/**
   * Processes requests for both HTTP    * <code>GET</code> and    * <code>POST</code> methods.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
  
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      response.setContentType(
"text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();
     
try {
        
/* TODO output your page here. You may use following sample code. */
         out.println(
"<!DOCTYPE html>");
         out.println(
"
<html>");
         out.println(
"
<head>");
         out.println(
"
<title>Servlet Servlet1</title>");
         out.println(
"
</head>");
         out.println(
"
<body>");
         out.println(
"
<h1>Servlet Servlet1 at " + request.getContextPath() + "</h1>");
         out.println(
"
</body>");
         out.println(
"
</html>");
      }
finally {
         out.close();
      }
   }

 
/**
   * Handles the HTTP
   * <code>GET</code> and
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
   @Override
  
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      processRequest(request, response);
   }

 
/**
   * Handles the HTTP
   * <code>POST</code> methods.
   *
   * @param request servlet request
   * @param response servlet response
   * @throws ServletException if a servlet-specific error occurs
   * @throws IOException if an I/O error occurs
   */
   @Override
  
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      processRequest(request, response);
   }

 
/**
   * Returns a short description of the servlet.
   *
   * @return a String containing servlet description
   */
   @Override
  
public String getServletInfo() {
     
return "Short description";
   }
}

Lo primero relevante que vemos es la anotación que precede a la clase @WebServlet(name = "servlet1", urlPatterns = {"/servlet1"}), esta anotación nos permite configurar un servlet sin necesidad de hacer uso del archivo web.xml. Esta anotación posee varios atributos:
  • name: es el nombre del servlet, indicado en el paso 3→c visto anteriormente en creación de un servlet.
  • urlPatterns: los patrones URL para poder acceder al servlet, se pueden indicar varios separados por comas, indicado en el paso 3→d.
El servlet hereda de la clase javax.servlet.http.HttpServlet y sobrescribe los métodos doGet, doPost, getServletInfo:
  • doGet(): se invoca para procesar solicitudes HTTP GET.
  • doPost(): se invoca para procesar solicitudes HTTP POST.
  • getServletInfo(): devuelve una descripción breve del servlet.

doGet y doPost poseen dos parámetros:
  • La petición del cliente, que se guarda en un objeto HttpServletRequest.
  • La respuesta al cliente, que se guarda en un objeto HttpServletResponse.

En nuestro servlet doGet y doPost llaman al método processRequest, que procesará los dos tipos de peticiones. El método processRequest construye una respuesta HTML
response.setContentType("text/html;charset=UTF-8");

Obtiene el objeto que puede enviar texto al cliente:
PrintWriter out = response.getWriter();

Construye la respuesta:
out.println("");
out.println(
"");
...

Una forma de invocar el servlet sería:
<form name="form11" action="servlet1" method="POST">
    
<input type="submit" value="Servlet simple" />
</form>
  
La URL del navegador sería: http://localhost:8084/CursoJSP/servlet1
Y el resultado en el navegador es el siguiente texto en grande y negrita: Servlet Servlet1 at /CursoJSP

Construir webs de esta forma es poco agradable, ya que el código HTML debe ir dentro de cadenas y no se puede hacer uso de programas de diseño web visual. La mejor manera de diseñar en la web es seguir la arquitectura MVC (Model View Controller). Una de las funciones de un servlet es la de hacer de controlador dentro de una aplicación web, ya que dispone de todas las prestaciones Java. Un servlet controlador actúa en función de la solicitud de un cliente, se comunica con otros servlets y puede hacer uso de archivos de recursos, bases de datos, etc.
La arquitectura MVC se divide en componentes de información (modelo) y componentes de presentación (vista), manejados por el controlador.
  • Modelo: Contiene la parte central de la funcionalidad. Representa el estado de la aplicación.
  • Vista: Es la forma en la que se presentan los datos al usuario. Puede acceder a los datos del modelo, pero no modificarlos.
  • Controlador: Reacciona a las entradas introducidas del usuario. Gestiona el modelo, toma decisiones y notifica a la vista los cambios efectuados en el modelo.


Objeto resquest

El objeto HttpServletRequest contiene la funcionalidad necesaria para acceder a los datos de la petición:
Método
Descripción
getParameter()
obtener el valor de un parámetro.
getParemeterValues()
obtener todos los valores de un parámetro, se utiliza si el parámetro posee más de un valor (select multiselección).

Objeto response

HttpServletResponse contiene la funcionalidad necesaria para enviar una respuesta:
Método
Descripción
sendRedirect()
redirige el cliente a la dirección URL indicada.
sendError()
envía un mensaje de error al cliente utilizando para ello el estado de código actual o un mensaje descriptivo opcional.


Entradas populares de este blog

Java. Texto de colores en la consola

JSP. 8 Ejemplo recojer datos

JSP. 26 Ejemplo MVC simple