Servlets y JSP – Introducción

Cuando nació Java EE o Java Enterprise Edition allá por mediados de 1997, Sun Microsystems quien era entonces dueño de Java, lanzó junto con la plataforma Java EE la especificación de Servlets y JSP. Estas tecnologías aunque hoy las miren como muy antiguas, fueron y son pieza clave y fundamental para entender otros frameworks web modernos como JSF, Spring MVC, Struts o GWT, ya que todos ellos utilizan internamente Servlets para atender y despachar peticiones, manejar respuestas, obtener información de las peticiones y mucho más. Pero, ¿qué es un Servlet?

Servlet

Un servlet es un módulo que se utilizan para manejar las peticions y respuestas de un servidor de una forma práctica. Por medio de un servlet podemos obtener detalles de la petición como las cabeceras, los datos enviados, la url de consulta, etc. También podemos especificar el tipo de dato que se devolverá, si es html, json, texto plano, etc., y por supuesto podemos manejar sesiones y cookies 😉

JSP

JSP o Java Server Pages es una tecnología de vista que nos permite crear páginas web dinámicas. Con JSP podemos ejecutar código Java dentro de la página, hacer estructuras de control como if, for, etc. Está basada en los servlets por lo que tenemos acceso implícito a variables como requestScope o sessionScope que veremos más adelante.

Para comprender cómo funciona y trabaja un servlet con JSP hagamos un ejemplo muy pequeño. El caso de estudio será un login muy básico.

Herramientas

En nuestro Eclipse creamos un proyecto web dinámico. Una vez creado nos dirigimos hacia el folder WebContent y le damos click derecho para seleccionar new -> JSP page. Solo dale finish al asistente. Luego de remover un poquitín de código basura que nos genera el IDE, nos queda un código así:

<%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>J7EE chat - Login</title>
    </head>
    <body>



<form action="login" method="get">
            <input type="text" name="username" placeholder="Usuario" />

            <input type="password" name="password" placeholder="Contraseña" />

            <input type="submit" value="Ingresar" />
        </form>



    </body>
</html>

Del login podemos rescatar que:

  • La acción la tomará ‘login’, que como vemos no es una página. El login es nuestro servlet que definiremos en un momento.
  • El método de la petición será GET. Esto tiene un incoveniente cuando trabajamos con peticiones y datos críticos, ya que este tipo método muestra en la URL los datos de la petición.
  • 2 input que tienen un atributo name. Este atributo name se enviará junto con su valor adjunto a la petición HTTP.

A continuación, crearemos nuestro Servlet. Para ello creamos le damos click derecho a src y seleccionamos New -> Class (o puedes seleccionar Servlet, pero te genera mucho comentario). En el nombre pondremos Login y el package pondremos pe.migasoft.j7eechat.controllers. Modificamos un poco la clase para que quede de la siguiente manera:

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="LoginServlet", urlPatterns={"/login"}, asyncSupported=true)
public class Login extends HttpServlet {

    private static final long serialVersionUID = -2975613143576849801L;
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {
        
        response.setContentType("text/html"); // tipo de respuesta: HTML

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        boolean areCrendentialsRight = username.length() > 0 &amp;&amp; password.equals("12345");
        
        if(areCrendentialsRight) {
            try(PrintWriter writer = response.getWriter()) {
                writer.write("Login satisfactorio. Bienvenido " + username);
            }
        }
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {


    }

}

Vamos a explicar algunas partes:

@WebServlet. Esta anotación le indica a la JVM que esta clase es un Servlet. Antes de la versión 3.0 de Servlet, debíamos indicar que una clase era un Servlet mediante el fichero web.xml ( y ). Pero desde la versión 3.0 es inncesario.

Esta anotación recibe varios parámetros:

  • name: nombre del Servlet (importará solo internamente. No utilizar nombres duplicados)
  • urlPatterns: aquí se indica la o las URL paths que serán interceptadas por el Servlet. En nuestro caso, hemos puesto /login.
  • asyncSupported: indica que el Servlet es asíncrono.

Vemos que nuestro servlet hereda de HttpServlet. HttpServlet es una clase abstracta que especifica un método do para cada tipo de petición (doGet, doPost, doPut, doHead, etc.). Además, contiene los métodos init y destroy, que nos sirven para poder inicializar recursos o cualquier otra lógica en la creación del servlet y eliminarlos cuando se destruya el servlet respectivamente.

Si recuerdas nuestro servlet tenía como método GET, por lo que la lógica la implementaremos en el método doGet de nuestro Servlet. Este método (como todos los demás doXXX) recibe un objeto HttpServletRequest y HttpServletResponse que representan a la petición HTTP y a la respuesta HTTP respectivamente. Por medio de estos objetos nosotros podemos hacer muchas cosas, como obtener los headers de la petición, ver si ya el usuario tiene una sesión activa, especificar un tipo de dato de retorno en la respuesta, etc.

En nuestro login, los input para el usuario y contraseña tiene asociados atriburos name. Para el usuario se llama username y para la contraseña password. El valor que tenga el input al momento de enviar la petición, será asociado al valor del atributo name que actuará como un identificador del elemento HTML. Estos valores podemos obtenerlos en el servlet mediante su identificador (name):

String username = request.getParameter("username");
String password = request.getParameter("password");

Una vez obtenidos los datos podemos realizar la comprobación que queramos. En este caso, la bandera areCrendentialsRight será true siempre y cuando el usuario no esté vacío y la contraseña sea 12345. Si las credenciales son correctas escribiremos en el documento HTML el texto: Login satisfactorio, Bienvenido y el nombre del usuario.

Ejecutemos nuestro proyecto dale al botón Run -> Run on server -> Payara 4.1 (o el servidor que tengas).

Veremos nuestro formulario de ingreso:

login.pepito

Ingresamos nuestras credenciales: Pepito | 12345. Si todo está bien el servlet nos deben mandar la respuesta:

salida-pepito

Si nos fijamos en la URL veremos que nuestro usuario y contraseña se ha concatenado a ella. Esto por supuesto no debemos hacerlo porque comprometemos la seguridad del usuario. Para solucionarlo debemos de cambiar el método del formulario por POST y poner el código en doPost en lugar de doGet:

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws IOException, ServletException {

    response.setContentType("text/html");

    String username = request.getParameter("username");
    String password = request.getParameter("password");

    boolean credentialsGood = username.length() > 0 && password.equals("12345");

    if(credentialsGood) {
        try(PrintWriter writer = response.getWriter()) {
            writer.write("Login satisfactorio. Bienvenido " + username);
        }
    }

}

Espero hayan entendido un poquito cómo funcionan los Servlets junto con JSP. Un saludo y hasta luego 😉

Anuncios

2 comentarios en “Servlets y JSP – Introducción

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s