Servlet
Servlets en Java
Los Servlets son clases Java ejecutadas en un servidor que permiten recibir solicitudes HTTP (HTTP Request) y procesarlas y devolver una respuesta también mediante el protocolo HTTP (HTTP Response). La respuesta puede ser de tipo HTML, XML, JSON, PDF, audio, imagen, video,..
ESTRUCTURA DE UN SERVLET
Un servlet hereda o extiende de la clase HttpServlet y debe sobreescribir los métodos encargados de realizar las peticiones(doGet, doPost,...).
package servlets;
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;
@WebServlet(name = "Servlet", urlPatterns = {"/Servlet"})
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("petición vía GET");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("petición vía POST");
}
}
CONFIGURACIÓN DE UN SERVLET
La configuración de un servlet se almacena en el archivo web.xml que se encuentra generalmente en el directorio WEB-INF. Este archivo permite definir mediante elementos de tipo XML (tags) la configuración del servlet. La configuración requiere un elemento servlet, que define el nombre del servlet y de la clase, y un elemento servlet-mapping, que define de nuevo el nombre del servlet y la ruta relativa que realiza la solicitud.
<webapp>
<servlet>
<servlet-name>Servlet</servlet-name>
<servlet-class>servlets.Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
</webapp>
A partir de la API Servlet 3.0 también existe la opción de configuración por anotación, tal como se observa en la línea siguiente y la línea 9 del código anterior donde se define el nombre y la ruta.
@WebServlet(name = "Servlet", urlPatterns = {"/Servlet"})
PETICIONES GET Y POST
El servlet se encarga de procesar las peticiones HTTP como cualquier otro lenguaje. Las de tipo GET, mediante url o link, las de tipo POST, mediante formulario.
<!DOCTYPE html>
<html>
<head>
<title>Peticiones</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div><b>Enviando datos por POST</b></div>
<form name="form-comentarios" action="comentarios" method="POST">
<p>Introduce los datos</p>
<p>Nombre: <input type="text" name="name"></p>
<p>E-Mail: <input type="text" name="email"></p>
<p><input type="submit" name="enviar" value="Enviar"></p>
</form>
</body>
</html>
El método getParameter() permite obtener los datos, ya sea vía GET o vía POST, que pueden ser manejados antes de devolver la respuesta.
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String email = request.getParameter("email");
if(name.equals("jose")){
response.setContentType("text/html;charset=UTF-8");
try(PrintWriter out=response.getWriter()){
out.println("<!DOCTYPE HTML>");
out.println("<html>");
out.println("<head>");
out.println("<tittle>Petición</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>Accediendo por GET</h2>");
out.println("</body>");
out.println("</html>");
}
}else{
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
String email = request.getParameter("email");
System.out.println(name);
System.out.println(email);
if(name.equals("jose")){
response.setContentType("text/html;charset=UTF-8");
try(PrintWriter out=response.getWriter()){
out.println("<!DOCTYPE HTML>");
out.println("<html>");
out.println("<head>");
out.println("<tittle>Petición</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>Accediendo por POST</h2>");
out.println("</body>");
out.println("</html>");
}
}else{
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
}
TIPOS DE RESPUESTA
El servlet permite devolver los distintos tipos de respuesta y formato estableciendo el tipo MIME. Generalmente, en aplicaciones web, el tipo de respuesta más común es el documento en formato HTML, sin embargo es posible devolver otro tipo de respuestas como pueden ser documentos en formato JSON, archivos de imagen, video, documentos PDF,etc... El tipo MIME se establece mediante el método setContentType() pasando por parámetro el correspondiente tipo MIME.
setContentType([tipo_respuesta]);
Establecer respuesta de tipo HTML
setContentType("text/html;charset=UTF-8");
Establecer respuesta de tipo imagen (extensión png)
setContentType("image/png");
Para establecer tipos de respuesta con otros tipos MIME se puede acceder a la entrada Lista de Tipos MIME que contiene una tabla con los MIME más comunes.
REDIRECCIONES
Los servlets permiten realizar redirecciones mediante el método sendRedirect(). Estas redirecciones pueden realizarse dentro del mismo directorio o proyecto, o pueden realizarse hacia una web externa.
Redireccionar a un documento dentro del mismo directorio.
sendRedirect("menu.html");
Redireccionar a un documento de otro nivel dentro del mismo proyecto.
sendRedirect("/contacto/form.html");
Redireccionar a una url externa.
sendRedirect("//www.google.es");
Para poder comentar es necesario iniciar sesión