Estructura de un servlet (2)

Seguimos con los servlets. Esto es una continuación de lo explicado aquí.

Los servlets http pueden servir perfectamente a múltiples clientes simultáneamente. Quiere esto decir que los métodos que hacen el trabajo en el servlet para los clientes pueden requerir ser sincronizados dependiendo de los recursos que tengan que ser compartidos. Esto puede hacerse bien por los métodos explicados en el tema de los hilos, o bien creando un servlet que manipule un cliente cada vez; los demás esperan. El siguiente ejemplo utiliza la segunda opción, implementando la interfaz SingleThreadModelAunque ya se está deprecated, os expongo el ejemplo para que veáis su uso.

El servlet que se implementa a continuación recibe una petición de un cliente, un alumno, relativa a concertar una cita para tutorías con algunos de los profesores. Los datos enviados por el cliente hacia el servidor son: el nombre del alumno, el del profesor, el día de la semana elegido para la tutoría y la hora seleccionada entre cuatro posibles. El servidor irá recogiendo las peticiones durante una semana para la siguiente, y las almacenará en un fichero del disco. Así mismo, cada vez que el servidor reciba una petición responderá al cliente indicándole si la petición fue registrada o si ocurrió un error, en cuyo caso tendrá que volver a realizarla. El código Java sería (te recuerdo que SingleThreadModel ya está deprecated, pero creo que es un buen ejemplo para entender los servlets y su estructura):

package com.gorka.servlets;

package com.gorka.servlets;
import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;import java.util.*;
public class Tutorias extends HttpServlet implements SingleThreadModel

{
String dirDelFicheroResultante = null;
public void init(ServletConfif config) throws ServletException {
super.init(config);

// Parametro establecido en el fichero servlets.properties

// del servidor

dirDelFicheroResultante = getInitParameter(“dirDelFicheroResultante”);

if (dirDelFicheroResultante == null)

{

    System.err.println(“Debe existir un parametro”);

}

}

// METODO POST PARA RESPONDER A UNA PETICION POST

public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException

{

// Tipo de respuesta que será enviada al cliente res.setContentType(“text/html”);

// Obtener un PrintWriter para devolver una respuesta al solicitante PrintWriter solicitante = res.getWriter();

try {

// abrir el fichero para el registro de tutorias

FileWriter fw = new FileWriter(dirDelFicheroResultante + System.getProperty(“file.separator”) + “citas.txt”, true);

PrintWriter fichCitas = new PrintWriter(fw);

// Tomar los datos del cliente y escribirlos

// en el fichero. Delimitamos los registros por las marcas

// <INICIO> y <FIN> para su posterior identificación

fichCitas.println(“<INICIO>”); Enumeration nombresParametros = req.getParameterNames();

while (nombresParametros.hasMoreElements())

{

String nombre = (String) nombresParametros.nextElement();

String valor = req.getParameterValues[0]; fichCitas.println(nombre + ” ” + valor);

}

fichCitas.println(“<FIN>”);

// CERRAMOS LOS FICHEROS
fichCitas.close(); fw.close();
// Responder al solicitante solicitante.println(“<html>”); solicitante.println(“<title> Respuesta a la solicitud</title>”); solicitante.println(“Su tutoria ha sido registrada. Gracias”); solicitante.println(“</html>”); }

catch (IOException e)

{

solicitante.println(“Hubo problemas con su solicitud”);

}

// Cerramos el flujo solicitante.close();

}
// METODO GET PARA RESPONDER A UNA PETICION GET

public void doGet(HttpServletRequest req, HttpServletResponse res) { // …. }
public void destroy() { // Liberar recursos }

}

¿Cómo se ejecuta un servlet? Todo servlet se comporta según el ciclo de vida: se carga, responde a las peticiones de los clientes y se descarga.

Cuando el servlet del ejemplo anterior recibe una petición del cliente, el servidor se carga para su ejecución, instante en el que se ejecuta el método init que lo inicia. La forma más sencilla de iniciar un servlet es invocando al métod init de su superclase. Por otra parte, aunque el servlet reciba múltiples peticiones, este método se ejecuta una vez, cuando el servidor lo carga. Cuando el método init finaliza, el servlet está en condiciones de atender a las peticiones de los clientes; en el ejemplo anterior, para cada una de las peticiones se ejecuta el método doPost. El servlet permanecerá en ejecución hasta que el servidor decida destruirlo, instante en el que se ejecutará el método destroy, si fue implementado

Anuncios

3 comentarios sobre “Estructura de un servlet (2)

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 )

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 )

Google+ photo

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

Conectando a %s