Imprimir

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 NetBeans

Se necesitará un proyecto de tipo "Web Application" en NetBeans: File > New Project > Java Web > Web Application. Dentro del proyecto, crea un archivo File > New File (o haciendo clic derecho) de tipo Web > Servlet.

Captura de pantalla 2019 10 17 a las 19.34.22 1faeb

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.

Captura de pantalla 2019 10 17 a las 20.11.24 75c08

Pero como podemos en el aviso que nos muestra en la parte inferior, es recomendable indicar siempre un nombre de paquete donde se aloje la clase Java, así que asigna también un nombre de paquete.

Captura de pantalla 2019 10 17 a las 20.12.49 5a186

La siguiente pantalla se puede dejar con los valores ofrecidos por defectos y finalizar así con el asistente.

Captura de pantalla 2019 10 17 a las 20.13.09 30b43  

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:

package ejemploservlet;

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 = "Ejemplo1", urlPatterns = {"/Ejemplo1"})
public class Ejemplo1 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");
        try (PrintWriter out = response.getWriter()) {
            /* 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 Ejemplo1</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet Ejemplo1 at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        }
    }

    // HttpServlet methods. Click on the + sign on the left to edit the code.

} 

El código fuente del Servlet que es creado, se almacena automáticamente en el proyecto dentro de la carpeta Source Packages y dentro a su vez del paquete que se haya especificado:

Captura de pantalla 2019 10 17 a las 20.22.36 ff9eb

 

 

Método processRequest

Como puedes ver en el código Java de la clase creada, se incluye el método processRequest.  Debes saber que este método es invocado automáticamente cuando se indique en el navegador web la dirección completa del servlet para ejecutarlo. Ten en cuenta que será ejecutado independientemente del tipo de petición GET o POST que se haga al servlet. Si se quisiera ejecutar distinto código en función del tipo de petición GET o POST, se debería escribir el código deseado en los métodos doGetdoPost que también se han creado automáticamente, pero que están ocultos bajo la línea plegada que indica "HttpServlet methods. Click on the + sign on the left to edit the code."

Observa que en la cabecera del método processRequest se dispone de los parámetros request y response.

protected void processRequest(HttpServletRequest request, HttpServletResponse 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 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. Por ejemplo:

HttpSession session = request.getSession();
Integer valor = (Integer) session.getAttribute("nombreAtributo");

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 Web Pages): 

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

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 código fuente del método processRequest en el Servlet podría ser como el siguiente para recoger y mostrar el valor que el usuario haya introducido como nombre en el formulario de la página index.html:

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* 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 Ejemplo1</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("Nombre: "+request.getParameter("nombre") );
            out.println("</body>");
            out.println("</html>");
        }
    }

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. Debe aparecer en 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.

Captura de pantalla 2019 10 17 a las 20.48.20 c0daf

Captura de pantalla 2019 10 17 a las 20.48.39 0d696

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