Los Servlets son aplicaciones web escritas en Java que son compiladas para ser ejecutadas por un servidor de aplicaciones web. Para ello es necesario disponer de un contenedor de Servlets como Apache Tomcat o bien un servidor web enlazado a un servidor de aplicaciones como Glashfish, JBoss, Websphere, etc.

Creación de Servlets con Eclipse

Desde la perspectiva Java EE de Eclipse, tras crear un proyecto web dinámico, puedes hacer clic derecho sobre el nombre del proyecto o en la carpeta Java Resources y elegir la opción New > Servlet.

servlet01

En el asistente que se abre, la acción más básica que debes hacer es indicar un nombre para la clase Java que se va a crear.

servlet02 servlet03 servlet04

Al finalizar el asistente dejando el resto de las opciones por defecto, obtendremos la estructura del código fuente del Servlet, que será similar al siguiente:

{code}

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Ejemplo1
 */
@WebServlet("/Ejemplo1")
public class Ejemplo1 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Ejemplo1() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

{/code}

El código fuente del Servlet que es creado, se almacena automáticamente en el proyecto dentro de la carpeta Java Resources > src > nombrePaquete > nombreClase.java.

servlet15

Métodos doGet y doPost

Uno de estos métodos será ejecutado cuando el cliente haga la solicitud de esta aplicación web. Es decir, cuando se indique en el navegador web la dirección completa del servlet que quiere ejecutar. Se ejecutará uno u otro en función del método utilizado para realizar la llamada (GET o POST). Si la llamada no se hace desde un formulario HTML donde se especifique el método GET o POST, se ejecutará el método doGet.

Ambos métodos se implementarían de la misma manera, por lo que únicamente debemos plantearnos si escribir en el código en un método u otro (o en ambos si hiciera falta) en función del método a través del cual se llega a este Servlet.

En los dos casos se dispone de los parámetros request y response. El primero (request) es un objeto, de la clase HttpServletRequest, que contiene los datos relativos a la petición que se ha realizado para ejecutar este Servlet, como por ejemplo, los parámetros enviados desde un formulario previo. El segundo parámetro (response) es un objeto, de la clase HttpServletResponse, en el que podemos establecer los datos y características de la respuesta que el Servlet va a dar en respuesta a la petición recibida, como por ejemplo, el código HTML de la página que se mostrará como resultado en el navegador.

Si consideras que se debe ejecutar el mismo código independientemente del tipo de método usado para la petición (GET o POST), puedes hacer la llamada de uno a otro pasando los mismos parámetros. Por ejemplo, si se escribe todo el código en el método doGet, desde el método doPost puedes hacer una llamada al otro de la siguiente manera:

{code}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}

{/code}

Si la aplicación requiere el uso del objeto session para almacenar información permanente entre las distintas páginas que se visiten de la misma aplicación durante la misma sesión, puedes utilizar el método getSession() con el objeto request, que retornará un objeto de la clase HttpSession. Sobre ese objeto retornado podrás usar métodos como getAttribute() o setAttribute() de la misma manera que se ha visto el artículo sobre JSP.

{code}HttpSession session = request.getSession(true);

Integer valor = (Integer) session.getAttribute("nombreAtributo");{/code}

Ejemplo con recogida de parámetros de un formulario

Vamos a probar como ejemplo un formulario HTML en el que el usuario puede indicar su nombre, y al pulsar un botón Enviar se ejecutará un Servlet que lee dicho parámetro.

El formulario puede ser como el siguiente (se ha guardado como index.html en la carpeta WebContent):

{code class="brush:html;highlight:[7]"}

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Formulario de ejemplo</title>
</head>
<body>
    <form method="post" action="/EjemploServlet/Ejemplo1">
        <p>Nombre: <input type="text" name="nombre">
        <input type="submit" value="Enviar"></p>
    </form>
</body>
</html>

{/code}

Como puedes observar, se hace una llamada al Servlet que debe llamarse Ejemplo1, dentro del proyecto EjemploServlet. Si estás usando nombres distintos, deberías cambiar el código anterior para indicar los nombres que estás usando.

El Servlet está siendo llamado con el método POST, por lo que vamos a implementar a continuación tan sólo el método doPost con el fin de dejar el código del Servlet lo más sencillo posible. El código fuente del Servlet podría ser como el siguiente:

{code class="highlight:[16,19]"}

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("/Ejemplo1")
public class Ejemplo1 extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<body>");
        out.println("Nombre: "+request.getParameter("nombre") );
        out.println("</body>");
        out.println("</html>");
    }

}

{/code}

Observa que con el método getWriter() del objeto response, se obtiene un objeto PrintWriter (out) que permite enviar código HTML como respuesta a través del método println().

Por otro lado, con el objeto request se ha usado el método getParameter() para obtener el valor correspondiente a un determinado parámetro que se ha recibido en la petición.

Para comprobar el funcionamiento, ejecuta el proyecto con la opción Run on Server. Debe aparecer un primer lugar el formulario, y tras pulsar el botón Enviar debe mostrarse el resultado generado por el Servlet, que debe ser el mismo nombre que se ha introducido en el formulario.

servlet05

servlet06

Observa que la ruta para ejecutar el Servlet debe ser /NombreProyecto/NombreServlet detrás de la dirección correspondiente al servidor.

En este caso, al no disponer de un método doGet, si se intenta lanzar directamente el Servlet, indicando su dirección en la barra de direcciones del navegador, se obtiene el siguiente mensaje de error:

servlet07

Por tanto, si consideras que puede ejecutarse el Servlet en algún momento con el método GET, también deberías implementar el método doGet, aunque no haga nada, o haga una llamada al mismo código del doPost.