Fundamentos de Java Servlets
Fundamentos de Java Servlets
– a los que el entorno de ejecución del applet llama como respuesta a las
acciones realizadas por el usuario.
– la clase base java.applet.Applet ofrece implementaciones
predeterminadas para estos métodos
• solo sobreescribimos aquellos que ocurren durante los eventos con los que
estamos trabajando
• por ejemplo, debemos escribir un método init
si tenemos que crear componentes GUI
(Graphical User Interface)
• de forma similar, los servlets operan en el
contexto de un modelo de petición y
respuesta administrado por el motor de
servlets
• el motor de servlets se encarga de:
• cargar un servlet cuando lo solicitamos por
primera vez
• llamar al método init del servlet
• manejar todas las peticiones que reciba
llamando al método del servlet service
• llamar al metodo destroy de cada servlet al
terminar la ejecución
• igual que con los applets, hay clases base
estándar
– javax.servlet.GenericServlet
– javax.servlet.HttpServlet
• que implementan los métodos de retrollamada del
servlet.
• la programación de servlets consiste en subclasificar
una de estas clases y sobreescribir el método necesario
para llevar a cabo la tarea.
init
• cuando el motor de servlets recibe la petición
de un servlet, comprueba si el servlet ya está
cargado
• si no, el motor de servlets emplea un
clargador de clases para conseguir la clase
servlet concreta requerida en este caso y
después invoca a su constructor para obtener
un ejemplar del servlet.
• una vez cargado el servlet, pero antes de que
preste servicio a las peticiones, el motor de
servlets llama a un método de inicialización
con la firma
– public void init (ServletConfig config) throws
ServletException{
–}
• solo se llama a este método una vez, justo antes de
uqe el servlet se ponga en funcionamiento.
• el objeto ServletConfig da acceso al contexto del
servlet y a cualquier parámetro de inicialización
codificado para el servlet.
• el objeto config se guarda como una variable de
instancia
– esto lo hace el método init de GenericServlet
– por eso es importante llamar a super.init(config) desde el
método init() de cualquier subclase
• dentro del método init, el servlet puede realizar
cualquier tarea de arranque que sea necesaria
– establecimiento de conexiones a base de datos
• si hay algun error que inhabilite al sevlet para manejar
peticiones, se debe lanzar una UnavailableException.
– es una subclase de ServletException que puede incluir
opcionalmente el número de segundos durante los que se
espera que el servlet no esté disponible
– si no se especifica, se supone que el servlet no está disponible
nunca
• evita que las peticiones se dirijan al servlet
service
• tras init con éxito
• servlet preparado para aceptar peticiones
• de manera predeterminada solo se crea un
ejemplar del servlet y el motor de servlets
lanza cada petición al ejemplo en un
subproceso diferente
• el método del servlet al que llamamos tiene la
firma
import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class K2MServlet extends HttpServlet
{
• private static final DecimalFormat FMT
= new DecimalFormat("#0.00");
;
• public void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println (PAGE_TOP );
for (double kmpl = 5; kmpl <= 20; kmpl += 1.0) {
double mpg = kmpl * 2.352146;
out.println ( "<tr>"
+ "<td align='right'>" + FMT.format(kmpl) + "</td>"
+ "<td align='right'>" + FMT.format(mpg) + "</td>"
+ "</tr>"
);
}
// Generate footer
out.println ( PAGE_BOTTOM );
}
}
• import java.io.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
– la creación de una página Web consiste en escribir instrucciones
HTML a un flujo de salida asociado a la petición HTTP.
– este flujo de salida se puede obtener del objeto response,
empleando su método getOutputStream() o su método
getWriter()
• depende si vamos a escribir datos binarios o caracteres.
• el servlet debe escoger uno de estos dos métodos
– no puede invocar ambos
– si escribirmos HTML ordinario usamos getWriter para obtener un escrito de
caracteres
• ahora a imprimir nuestra tabla HTML.
• hemos codificado la cabecera y los pies de
página en las variables de cadena estáticas
PAGE_TOP Y PAGE_BOTTOM
• imprimimos la tabla mediante un bucle que
afecta al intervalo de conversión
• out.println(PAGE_TOP);
• el bucle for
• out.println(PAGE_BOTTOM);
for (double kmpl = 5; kmpl <= 20; kmpl += 1.0)
{
double mpg = kmpl * CONVERSION_FACT
OR;
out.println
( "<tr>"
+ "<td align='right'>" + FMT.format(kmpl
) + "</td>"
+ "<td align='right'>" + FMT.format(mpg)
+ "</td>"
+ "</tr>"
);
}
• para ejecutar el servlet, primero debemos
compilarlo.
• podemos usar CLASSPATH.
• después, en función del motor de servlets,
podríamos necesitar describir el servlet en
descriptor de despliegue de la aplicación Web
– /WEB-INF/web.xml
• para un servlet sencillo, la descrpción solo es una
etiqueta <servlet> con su etiqueta hija <servlet-name>
y elementos <servlet-class>
• para modificar el fichero web.xml necesitamos
reiniciar el motor de servlets antes de que los
cambios tengas efecto.
• en Eclipse debemos guardar en