Title: Servlets
1Servlets
- Servlets son módulos que extienden a servidores
java-enabled orientados a request/response,
como por ejemplo Servidores Web - Un servlet puede ser el responsable de tomar
datos de una forma HTML y aplicar un método
para actualizar las bases de datos de la una
compañía de acuerdo a ellos.
2Trabajo Preliminar
- El paquete javax.servlet provee interfaces y
clases que permiten escribir y compilar servlets - No viene con el j2sdk, es necesario bajar el .jar
respectivo y hacerlo visible para compilar los
programas - Por su parte, tambien los servidores deben poder
saber recibir requerimientos para servlets y
saber interpretarlos - Cada servidor de servlets tiene sus propias
reglas, - En la mayoría de los casos hay que ponerlos en un
directorio específico - En tomcat, por ejemplo, si se ponen en
raiz\webapps\examples\web-inf\classes pueden ser
contactadas por http//hostport/examples/servlet/
servletname - Muchas veces es necesario tener un archivo (xml
en tomcat) donde se pone el alias de los servlets
y sus parámetros de inicialización
3La Anatomía de un Servlet
- Un nuevo tipo (clase) de servlet es especificado
extendiendo la clase HttpServlet - Existen métodos predefinidos
- init() es llamado por el servidor web cuando el
servlet se sube la primera vez (el momento en
que sucede esto puede variar, dependiendo del
servidor) - doGet(HttpServletRequest req, HttpServletResponse
res) throws ServletException, IOException - se llama cuando el servlet es invocado con una
petición Http GET, que es la normal cuando se
contacta un serv. - doPost(HttpServletRequest req, HttpServletResponse
res) throws ServletException, IOException - se ejecuta cuando el servlet fue invocado con una
petición Http POST
4Anatomía de un servlet
- Una petición GET se genera siempre cuando una
petición http es ingresada en el browser - Por ejemplo, http//www.yahoo.com implica mandar
al servidor web un string con el comando GET
index.html Httpx.x - Cuando el servlet se llama por primera vez, se
inicializa y 4-6 threads son levantados para
atender a cleintes en paralelo cuando vayan
apareciendo, Para ahorrar tiempo - En la mayoría de los casos los servlets son
contactados a través de forms en páginas html. En
estos casos es posible especificar en los
parámetros una petición POST
5La interfaz ServletRequest
- HttpServletRequest es la clase de uno de los
parámetros con que el servidor llama a los
métodos del servlet que implementa la interfaz
ServletRequest provee acceso a - Información que viene del cliente, como por
ejemplo nombre de los parámetros pasados y sus
valores, el protocolo usado, el nombre del
computador del cliente y del servidor que lo
atiende, etc. - El input stream, ServletInputStream. Los Servlets
usan este input stream para recibir datos de los
clientes que envían con protocolos de
aplicaciones como los métodos POST y PUT de HTTP.
6La interfaz ServletResponse
- HttpServletResponse es la clase con el que
servidor llama a los métodos del servlet.
Implementa la interfaz ServletResponse la cual da
al servlet métodos para responder al cliente - Establecer el tipo MIME de la respuesta que se le
mandará al cliente - El output stream ServletOutputStream y un Writer
con el cual van a mandar datos al clientes.
7Primer ejemplo
- El servlet puede ser contactado directamente por
la siguente expresión en el browser - http//grafica05.dcc.uchile.cl/examples/servlets/S
impleServlet - Esto causará que el método doGet sea llamado
- El servlet responderá escribiendo en la pagina
del browser que lo invocó una frase pequeña
8SimpleServlet
- SimpleServlet extiende la clase HttpServlet la
cual implementa la interfaz Servlet. - Sobreescribe el método doGet de la clase
HttpServlet. doGet es llamado por el método
service (no se ve) cuando el servlet fue
contactado por un GET request (default HTTP
request method) - Dentro del método doGet,
- El request del cliente está representado por un
objeto HttpServletRequest. - La respuesta al cliente está representada por un
objeto HttpServletResponse - Como se le enviará texto al cliente, la respuesta
se manda con un objeto Writer obtenido del
objeto HttpServletResponse.
9Un segundo ejemplo
- Vamos a implementar un web counter
- Va a contabilizar cuántas veces un servlet de
esta clase ha sido creado (init) - Cuántas veces han sido llamadas todas las
instancias - Cuantas veces ha sido llamada la instancia que se
contacto - ver Count.java
10Usando parámetros de inicialización del archivo
de configuración
- En todos los servidores hay un archivo de
configuración escrito en XML - Este se edita a mano o con una herramienta
apropiada - En este archivo se pueden especifcar parámetros
para los servlets - Permiten parametrizar servlets sin recompilarlos
- En Tomcat 4.1 este archivo se ubica en
webapps\examples\WEB-INF\web.xml - ver ShowParameters.java
11Parámetros desde el cliente
- Es posible pasar parámetros en la línea de
invocación URL - http//hostport/servlet?param1value1param2valu
e2.. - El servlet puede preguntar por los valores de los
parámetros si conoce el nombre de ellos de la
siguente manera - String value req.getParameter(param1)
- String value req.getParameterValues(param1)
- String value req.getParameterValues(param1)0
es equivalente a lo primero si es un parámetro de
un solo valor o se recuperará el primero de los
valores de un parámetro multivalorado - Parámetros pueden ser solamente strings
- ver ServletParameter1.java invocarlo con
- http//hostport/ServletParameter1?namenelson
12Lo ideal es hacerlo con Forms
- Una Form es una página html que puede contener
objetos gráficos para recolectar información la
que manda al servidor como una URL - Podemos usar el mismo servlet !!!!
- mirar ServletParameter1.html
- Ejemplo 1
- ShowParametersRequest.java invocado por
ShowParametersPostForm.html - Ejemplo 2
- SubmitResume.java invocado por SubmitResume.html
13Los encabezados del request y response
- Proveen información de alto nivel desde/hacia el
cliente - En el caso del request, permite averiguar
características interesantes acerca del cliente - En el caso del response, permite definir la forma
como se le va a enviar la información al browser - En general permiten hacer mucho más efectivo y
eficiente el diálogo con el cliente - En el caso del request, existen métodos getXXX o
getHeader(xxx) para averiguar información - En el caso del response, existen métodos
setHeader(xxx) o setXXX para definir la forma de
la respuesta. - Muchas veces es necesario combinar ambos para dar
una respuesta adecuada
14Algunos get para el request
- getCookies() para recibir las cookies que pueda
haber mandado el cliente - getAuthType() se usa para clientes tratando de
acceder una página para la cual se quiere tener
una password - getRemoteHost() el host del cleinte
- getMethod() el método con el cual se contacto al
servidor (GET, POST, etc..) - getProtocol() versión del protocolo HTTP que usa
el cliente - getHeaderNames() retorna todos los nombres de
los headers que mandó un cleinte
15Algunos xxx para el getHeader(xxx)
- Accept qué tipos MIME puede recibir (entiende)
el cleinte - Accept-Charset qué conjunto de caracteres está
usando - Accept-Encoding que algoritmos de codificación
acepta - Accept-Language lenguaje (en-us, sp, ge, ..)
- Authorization para identificar a clientes con
una página protegida - Host el computador del cleinte
- Referer la URL de la página que generó el
contacto - Cookie para obtener cookies
- Connection dice si el cleinte puede manejar
conexiones persistentes (por ejemplo para mandar
archivos)
16Algunos set para el response
- setContentType(xxx) indica el tipo MIME de la
respuesta que se le va a mandar - setContentLength(xxx) indica el tamaño (se usa
para traspasar información en bytes) - addCookie() para mandar cookies con información
al cliente - sendRedirect() para redirigir el requerimiento a
otro URL - setHeader(xxx,xxx) forma más general
- setIntHeader(xxx,xxx) cuando el segundo argumento
es un entero (ahorra la conversión)
17Algunos xxx para el setHeader(xxx,xxx)
- Content-Type algun tipo MIME como image/gif
- Content-Length largo de lo que se va a mandar
(para bytes) - Connection poniendo un valor close va a
prohibir el uso de conexiones persistentes
(default keep-alive) - Content-Encoding codificación
- Content-Language lenguaje
- Cache como se debe manejar el cache en el
cliente (ej, no-cache, no-store, must-revalidate,
max-agexxxx, - Refresh indica cada cuanto debe autorefrescarse
la pagina - www-Authenticate para manejar el acceso a
páginas con passwords
18Ejemplos de manejo de la información desde/hacia
el cliente
- Ver ShowRequestHeaders
- Ver ProtectedPage
- Ver SnoopServlet?par1val1par2val2
- ver Ping
19Session Tracking
- Session tracking es un mecanismo que pueden los
servlets para mantener información acerca del
estado de los requests de un usuario durante una
sesión - Una sesión es un diálogo de una instancia de un
browser cliente con el server en un período de
tiempo limitado (normalmente 30 minutos). - Se pueden asociar objetos de información a la
sesión, los cuales se conservan en el servlet - La sesión no la maneja el programador sino el el
servidor web, el programador la consulta - Ver SessionServlet
20Algunos métodos
- HttpSession sesion request.getSession(true)
crea un objeto sesión si no existía - sesion.isNew()retorna verdadero si la sesión se
creó recientemente - sesion.putAttribute/Value(String nombre, Object
valor) asocia a la sesión un par nombre-valor
(value se usa hasta v2.2) - Object o sesion.getAttribute/Value(nombre)reto
rna el objeto asociado a ese nombre para la
sesión - sesion.removeAttribute/Value(nombre)elimina el
objeto asociado a ese nombre para la sesión - Enumerationvalores sesion.getAttributeNames()
- Stringvalores sesion.ValueNames() retorna un
arreglo/enumeración de nombres de
atributos/valores que hay en la sesión - long l sesion.getCreationTime()retorna el
tiempo (en milisegundos desde el 1.1.70 000 )
en que fue creada - Long l sesion.lastAccessedTime() retorna el
tiempo del último acceso (en milisegundos) - sesion.setMaxInactiveInterval(int seconds)pone el
máximo intervalo antes de que automáticamente se
destruya la sesión
21Usando Cookies
- Cookies son otra forma con la cual el servlet
puede seguirle la pista a un cliente - A través de una cookie el selvlet puede mandar
información al cliente para que la guarde y la
entregue cada vez que lo contacta. - Los Servlets envían cookies a los clientes
agregando campos al encabezado de respuesta Http
que se envía. - Los clientes automaticamente retornan cookies
cuando contactan a un servidor mandándolo como
campos adicionales en los encabezados HTTP
request. - Cookies los cookies tienen un nombre y un valor
(ambos strings) Adicionalmente puede guardar un
comentario - Un server puede pasar más de una cookie a un
cliente.
22Usando Cookies
- Para mandar una cookie
- 1. Instanciar un objeto Cookie
- 2. Poner atributos (par nombre-valor)
- 3. Mandar la cookie
- Para recuperar la información de una cookie,
- 1. Recuperar todas las cookies del cliente
- 2. Encontrar la cookie que se necesita
por su nombre - 3. Recuperar su valor
23Ejemplos de Cookies
- El primer ejemplo (Cookies.java) muestra los
tiempos cuando el cliente contactó por primera
vez al servlet (vía método doGet) y el tiempo
cuando lo contactó oprimiendo un botón que llama
al método doPost - El segundo ejemplo muestra cómo se le puede poner
tiempos de permanencia (o validez) a una cookie.
24 Cookies o Sessions ?
- Con sessions la información la almacena y
administra el servidor por lo que el servidor
tiene un estado que tiene que administrar
cuidadosamente - Con Cookies es el cliente el que tiene la
información, lo que implica que esta va y viene
cada vez que se contacta al servidor - El cliente puede prohibir el uso de cookies si
quiere
25El ejemplo del carro de compras
- Muestra los libros que se van seleccionando para
comprarlos - Catalog Clase que crea un Arreglo de Items con
contenido. - Item clase que implementa objetos que contienen
información acerca de un libro - CatalogPage Servlet base para presentar
información contenida en un arreglo de items en
un browser
26El ejemplo del carro de compras
- TechBooksPage y KidsBooksPage extienden
CatalogPage preparando la información para ser
desplegada - OrderPage Servlet que muestra el estado de la
orden - ShoppingCart clase que implementa un carro de
compras que contiene las ordenes hechas hasta
ahora
27Tarea 6 (coef. 2)
- Crear una base de datos de libros con JDBC y
MySQL, de modo que cada fila refleje un Objeto de
la clase Item, además de contener el Autor del
libro en un campo aparte (use shortDescription
como el título del libro) - Crear un servlet para poblar esta base de datos
- Crear un servlet para hacer consultas sobre esta
base de datos - Las consultas son
- ver todos los libros de un autor dado
- ver todos los libros que en el título tienen
alguna expresión dada por el usuario - ver todos los libros cuyo precio esté en un
cierto rango dado por el usuario