Está en la página 1de 33

Aplicaciones Telemáticas

Servlets

Germán Parra
Servlet
• En servlet es una clase Java que puede recibir peticiones
(normalmente HTTP) y generar una salida (normalmente HTML o
XML)
• Los servlets se ejecutan en un contenedor web
• Paquetes javax.servlet y javax.servlet.http
Servlets - tareas
Estructura básica de un Servlet
• Debe heredar la clase javax.servlet.http.HttpServlet.
• Es una clase abstracta que representa a los servlets
HTTP.
• Esta clase ofrece una serie de métodos como pueden
ser doGet(), doDelete() o doPost() que podrá
sobrescribir el servlet.
• Los servlets son invocados a través de peticiones HTTP
mediante el método GET o POST.
Estructura básica de un Servlet – cont.
• Los métodos doPost() y doGet() poseen dos parámetros
que son interfaces del paquete javax.servlet.http:
• Un objeto HttpServletRequest  petición HTTP
• Un objeto HttpServletResponse  respuesta HTTP

• Los métodos doGet() y doPost() de la clase HttpServlet


lanzan dos excepciones, ServletException e IOException.
Servlet básico
import javax.servlet.*;
import javax.servlet.http.*;
public class ClaseServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// ... código para petición GET
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// ... codigo para petición POST
}
}
Servlets con salida HTML
import java.io.*;
import javax.servlet.*; // excepciones ServletException
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Hola Mundo!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hola Mundo!</h1>");
out.println("</body>");
out.println("</html>");
}
}
Invocación Servlets
• Formulario HTML
<form name="datosPersona" method="GET" action="HolaMundo2">
<label>Nombre: </label> <input type="text" name="nombre"/>
<br/>
<button type="submit" name="aceptar">Aceptar</button>
<button type="reset" name="cancelar">Cancelar</button>
</form>

• URL:
• http://localhost:8080/<dir>/servlet/<nombre-servlet>
• http://127.0.0.1/ej_servlets/HolaMundo2?nombre=Pepe&apellidos=Garcia
Clase HttpServlet
• void doGet(HttpServletRequest req, HttpServletResponse res): este
método será invocado por el servidor a través del método
service(), para permitir que el servlet trate una petición GET del
protocolo HTTP.
• void doPost(HttpServletRequest req, HttpServletResponse res):
método invocado por el servidor a través del método service(),
para permitir que el servlet trate una petición POST.
Clase HttpServlet – cont.
• void service(HttpServletRequest req, HttpServletResponse res): recibe
las peticiones estándar del protocolo HTTP y las redirecciona a los
métodos doXXX adecuados definidos en la clase del servlet.
Desde el método service() se invocarán los distintos métodos doXXX
de la clase HttpServlet.
• No es necesario ni recomendable sobrescribir este método.
Clase HttpServlet – cont.
• void doDelete(HttpServletRequest req, HttpServletResponse res)
• void doOptions(HttpServletRequest req, HttpServletResponseres):
• void doPut(HttpServletRequest req, HttpServletResponse res)
• void doTrace(HttpServletRequest req, HttpServletResponse res)
• long getLastModified(HttpServletRequest req)
Arquitectura del paquete Servlet
Servlet

GenericServlet

HttpServlet

ServletInputStream ServletRequest ServletResponse ServletOutStream

HttpServletRequest HttpServletResponse
Clase GenericServlet
• Esta clase abstracta perteneciente al paquete javax.servlet,
representa a los servlets de forma genérica de forma independiente
al protocolo utilizado para recibir y responder las peticiones de los
clientes.
• La clase GenericServlet implementa las interfaces Servlet y
ServletConfig, también pertenecientes al paquete javax.servlet.
• De esta clase hereda la clase HttpServlet, ya que debe acomodar las
especificaciones de los servlets genéricos a los servlets HTTP.
Clase GenericServlet – cont.
• void destroy():
• String getInitParameter(String nombre)
• Enumeration getInitParameterNames()
• ServletConfig getServletConfig()
• ServletContext getServletContext()
• String getServletInfo()
• String getServletName()
• void init(ServletConfig config)
• void init()
• void log(String mensaje)
• void log(String mensaje, Throwable t)
• void service(ServletRequest req, ServletResponse res)
Ciclo de vida de un servlet
• Cuando se crea un servlet, va a existir una única instancia de este
servlet, y un hilo de ejecución (thread) por cada invocación, donde se
tratará el método doGet() o doPost() correspondiente.
Ciclo de vida de un servlet
• Los métodos doGet() y doPost() deben sincronizar el
acceso a datos compartidos (p.ej.: atributos de un
servlet), ya que múltiples hilos de ejecución pueden
acceder a los mismos datos de manera simultánea.
• Usar la sentencia synchronized para acceder a objetos o
información compartida.
public class MiServlet extends HttpServlet implements
SingleThreadModel{
Método init()
• Únicamente se invoca cuando el servlet es creado, y no es llamado
de nuevo por cada petición de usuario.
• Se crea en la primera invocación, o al arrancar el servidor (debe
estar registrado en el servidor web).
public void init() throws ServletException{
//Código de inicialización
}

public void init(ServletConfig config) throws ServletException{


super.init(config); // siempre debe incluirse
//Código de inicialización
}
Interfaz HttpServletRequest
• String getAuthType()
• String getContextPath()
• Cookie[] getCookies()
• long getDateHeader(String nombre)
• String getHeader(String name)
• Enumeration getHeaderNames()
• Enumeration getHeaders(String nombre)
• int getIntHeader(String nombre)
• String getMethod()  GET, POST o PUT
• String getQueryString()
• String getRemoteUser()
• String getRequestedSessionId()
Cabeceras de petición HTTP
Cabecera Descripción
Accept Indica al servidor el tipo de datos que puede aceptar el
navegador (MIME)
Accept-Charset Indica al servidor que conjunto de caracteres que puede
utilizar el navegador.
Accept-Encoding Indica al servidor el tipo de codificación de datos que el
navegador puede aceptar.
Content-Length Identifica el tamaño de los datos transferidos en bytes.
Aplicable únicamente a peticiones POST.

Content-Type Tipo de Datos que se está transmitiendo


Cookie Esta cabecera es utilizada para devolver las cookies a los
servidores que previamente las han enviado a los
navegadores.
Cabeceras de petición HTTP – cont.
Cabecera Descripción
Host Indica el nombre del servidor y el número de puerto.

Proxy- Permite a los clientes identificarse antes los


Authorization servidores proxy que lo requieran.
Referer Indica al servidor la URL del enlace que fue utilizado
para enviar la cabecera del método de petición al
servidor.
User-Agent Indica el tipo de navegador que está realizando la
petición.

http://localhost:8080/ej_servlets/ServletNavegador
Leyendo cabeceras de petición
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletNavegador extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
PrintWriter out = response.getWriter();
response.setContentType("text/html");
out.println("<html><body><h1>Navegador:"+
request.getHeader("User-Agent")+"</h1></body></html>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
doGet(request,response);
}
}
Leyendo cabeceras de petición - cont.
import java.io.*;
import java.net.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ServletMuestraPeticion extends HttpServlet {


protected void processRequest(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><BODY BGCOLOR=\"#FDF5E6\">" +
"<TABLE BORDER=1 ALIGN=CENTER>" +
"<TR BGCOLOR=\"#FFAD00\">" +
"<TH>Nombre cabecera</TH><TH>Valor cabecera</TH>");
Enumeration nombresCabeceras = request.getHeaderNames();
Leyendo cabeceras de petición - cont.
while(nombresCabeceras.hasMoreElements()){
String nombre = (String) nombresCabeceras.nextElement();
out.println("<TR><TD>" + nombre + "</TD>");
out.println("<TD>" + request.getHeader(nombre) + "</TD>");
}
out.println("</TABLE> <B>Metodo de Peticion </B>" +
request.getMethod() + "<BR>" +
"<B> URI Pedida: </B>" +
request.getRequestURI() + "<BR>" +
"<B> Protocolo: </B>" +
request.getProtocol() + "</BODY> </HTML>");
}
Leyendo cabeceras de petición - cont.
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Short description";
}
}
Leyendo cabeceras de petición - cont.
Formularios y Servlets – cont.

formulario.html
Formularios y Servlets – cont.
Formularios y Servlets – cont.
Uso de Cookies
• Es un archivo que se escribe en la máquina del cliente y mantiene
información entre diferentes conexiones HTTP.
• Consideraciones:
• Las cookies se pueden perder  inf. almacenada
• Las cookies pueden ser modificados por el cliente  autenticidad de
información guardada en la cookie.
• Las cookies pueden ser copiadas sin requerir consentimiento.
• Muchos usuarios deshabilitan su uso en los browsers.
• Navegadores aceptan unos 20 cookies por sitio, y 300 como máximo.
• Cada cookie puede tener máximo 4KB
Clase Cookie
• Pertenece a javax.servlet.http
• Cookie(String nombre, String valor)
• String getComment(): devuelve el comentario que describe el propósito de la
cookie.
• String getDomain()
• int getMaxAge(): caducidad.
• String getName()
• boolean getSecure(): indica si el navegador ha enviado la cookie a través de un
protocolo seguro.
• String getValue()
• void setDomain(String patrón)
• void setMaxAge(int caducidad)
• void setValue(String valor)
Clase Cookie (cont.)
• Un servlet envía cookies al navegador Web utilizando el método
addCookie() del interfaz HttpServletResponse, este método añadirá
las cabeceras de respuesta HTTP necesarias para enviar las cookies al
navegador.
• Las cookies se puede obtener de una petición utilizando el método
getCookies() del interfaz HttpServletRequest.
Cookies: http://localhost:8080/ej_servlets/cookies.html
<!DOCTYPE html>
<html>
<head>
<title>Cookies en Servlet</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div>Ejemplo de uso de cookies</div>
<form action="DatosCookie" method="GET">
<b>Datos personales</b><br>
Nombre del cookie: <input type="text" id="nomb" name="nombre" size="50" placeholder="Ingrese un nombre del cookie"
minlength="3" maxlength="50" required><p>
Valor del cookie: <input type="text" name="valor" size="50" placeholder="Valor del cookie"
minlength="3" maxlength="50" required><p>
<input type="submit" name="aceptar" value="Enviar">
<input type="reset" name="cancelar" value="Cancelar">
</form>
</body>
</html>
Cookies: http://localhost:8080/ej_servlets/cookies.html

También podría gustarte