You are on page 1of 51

FACULTAD DE INGENIERIA DE SISTEMAS,

CMPUTO Y TELECOMUNICACIONES
SEMANA 5

SERVLET
JAVA SERVER PAGES
Lenguaje de Programacin III

2015-3

Docente: Ing. Magallanes Morn


Jhoss
jhossmm@gmail.com

Servlets: Introduccin

Mdulos que amplan los servidores orientados a


peticin/respuesta.

La respuesta en el lenguaje Java a los CGIs (Common


Gateway Interface) para construir pginas en el
momento.

Poder basarse en datos del usuario.

La informacin vara en el tiempo.

Usar informacin de una base de datos.

Servlets: Ventajas sobre los


CGIs

Eficiencia: JVM.

Facilidad de uso y aprendizaje.

Potentes: Comunicacin directa con el servidor.

Portables.

Baratos, porque hay programadores Java

Las del Lenguaje Java

Servlets: Jerarqua

La jerarqua de clases java es...

Nosotros heredamos de HttpServlet!

Tipos de peticiones por


formulario
Un formulario puede enviar la informacin al servidor de dos formas:

GET: Paso de parmetros en la propia URL de acceso al servicio o


recurso del servidor. Mtodo doGet del servlet

POST: Lo mismo que GET pero los parmetros no van en la lnea de


URL sino en otra lnea a parte. El manejo es idntico. Mtodo
doPost del servlet.

Servlets: Mtodos doGet y


doPost

Son llamados desde el mtodo service.

Reciben interfaces instanciadas:

HttpServletRequest para manejo de la informacion enviada por


el usuario.

HttpServletResponse para poder enviar una respuesta en forma


de pagina web.

protected void doGet(HttpServletRequest req, HttpServletResponse resp)


throws ServletException , java.io.IOException
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException , java.io.IOException

Habitualmente, implementamos uno de los dos y desde el otro delegamos


en el implementado, de forma que pueda responder ambos tipos de
peticiones.

Servlets: Respondiendo en
HTML

La salida del servlet ser, habitualmente, un documento HTML. 2 pasos:

Indicar la cabecera de la respuesta el tipo de contenido que vamos a retornar. El


caso ms habitual ser devolver HMTL, aunque tb podemos devolver, por
ejemplo, una imagen generada en tiempo de ejecucin.

Al ser un proceso tan comn existe un mtodo que nos lo soluciona directamente:
setContentType de HttpServletResponse.

Crear y enviar cdigo HTML vlido.

Ej: HolaMundoServlet

Servlets: Recogiendo la
informacin de usuario.

En CGI, recoger parmetros de un usuario era muy


tedioso. Con servlets, trabajamos SIEMPRE con objetos
java.

Los parmetros nos llegan en la request, que


representa el objeto de tipo HttpServletRequest que
recibimos en la invocacin del doXXX().

HttpServletRequest.getParameter(nombre) devuelve:

(si no hay valor)

null (si no existe).

El valor en caso de haber sido establecido.

Servlets: Polticas de acceso


concurrente (threading)

Los servlets estn diseados para soportar mltiples


accesos simultneos por defecto.

Ojo! El problema puede surgir cuando se hace uso de un


recurso compartido. Ej, abrimos un fichero desde un
servlet.

Solucin,

Hacer que el recurso sea el que posea la poltica de acceso


concurrente.

Servlets: Ciclo de vida

Ciclo de vida de un servlet:

Servlets: Ciclo de vida


INICIALIZACIN:

Una nica llamada al metodo init por parte del servidor.


public void init(ServletConfigconfig) throws ServletException

Se pueden recoger unos parametros concretos con


getInitParameter de ServletConfig. Estos parmetros se
especifican en el descriptor de despligue de la aplicacin: web.xml

DESTRUCCIN:

Cuando todas las llamadas desde el cliente cesen o un temporizador


del servidor as lo indique. Se usa el mtodo destroy
public void destroy()

Gestin de la Sesin del Usuario.


Mantenimiento del estado de la sesin.

El protocolo HTTP no posee la capacidad de


almacenar estados.

Se complican mucho las tareas de guardar las


acciones (Ej, las Compras) de un usuario.

Posibles soluciones:

Cookies.

Aadir informacin en la URL

Usar campos ocultos de formularios (HIDDEN)

Empleo del objeto HttpSession del servlet.

Servlets: Seguimiento de
sesin

Los servlets proporcionan una solucin tcnica: La API


HttpSession.

Una interfaz de alto nivel construida sobre los cookies y


la reescritura de las urls (pero transparente para el
desarrollador).

Permite almacenar objetos.

Servlets: Seguimiento de
sesin

Pasos para trabajar con sesiones:

BUSCAR EL OBJETO HttpSession ASOCIADO A UNA


PETICIN: Se usa el mtodo getSession de
HttpServletRequest que devuelve null si no hay
una sesin asociada. Entonces podramos crear una pero al
ser una tarea sumamente comn, se pasa true y l mismo
se encarga de crear una.

Servlets: Seguimiento de
sesin

AADIR y RECUPERAR INFORMACION DE UNA SESION

Mtodo getAttribute(nombre_variable). Devuelve:

Una instancia de Object en caso de que la sesin ya


tenga algo asociado a la etiqueta nombre_variable

null en caso de que no se haya asociado nada an.

Mtodo setAttribute(nombre_variable, referencia ).


Coloca el objeto referenciado por referencia en la
sesin del usuario bajo el nombre nombre_variable. A
partir de este momento, el objeto puede ser recuperado
por este mismo usuario en sucesivas peticiones. Si el
objeto ya existiera, lo sobrescribe.

Mtodo getAttributes() retorna una Ennumeration con


los nombres de todos los atributos establecidos en la
sesin del usuario.

Servlets: Seguimiento de
sesin
getId. Este mtodo devuelve un identificador nico generado
para cada sesin. Algunas veces es usado como el nombre clave
cuando hay un slo valor asociado con una sesin, o cuando se
uso la informacin de logging en sesiones anteriores.
isNew. Esto devuelve true si el cliente (navegador) nunca ha visto
la sesin, normalmente porque acaba de ser creada en vez de
empezar una referencia a una peticin de cliente entrante.
Devuelve false para sesin preexistentes.
getCreationTime. Devuelve la hora, en milisegundos desde
1970, en la que se creo la sesin. Para obtener un valor til
para impresin, pasamos el valor al constructor de Date o al
mtodo setTimeInMillis de GregorianCalendar.
getLastAccessedTime. Esto devuelve la hora, en milisegundos
desde 1970, en que la sesin fue enviada por ltima vez al
cliente.

Servlets: Seguimiento de
sesin

CADUCIDAD DE LA SESION:

Peculiaridad de las Aplicaciones WEB: No sabemos


cuando el usuario se desconecta del servidor

Automticamente el servidor web invalida tras un


periodo de tiempo (30) sin peticiones o manualmente
usando el mtodo invalidate.

Los elementos almacenados no se liberan hasta que no


salta el timeout

Servlets: Contexto de la
aplicacin

Se trata de un saco comn a todas las sesiones de


usuario activas en el servidor.

Nos permite compartir informacin y objetos entre los


distintos usuarios.

Se accede por medio del objeto ServletContext.


public ServletContext getServletContext()

Servlets: Contexto de la
aplicacin

Para colocar o recuperar objetos del contexto

Aadir un atributo: Se usa el mtodo


setAttribute de ServletContext. El
control de que varios servlets manejen un mismo
atributo es responsabilidad del desarrollador.

Recoger un atributo: Se usa el mtodo


getAttribute de ServletContext. Hay que
convertir el objeto que devuelve al tipo requerido
(Retorna un tipo Object!)

JSP
Contenido
1.

2.

Primer vistazo a la tecnologa JSP

Qu es y para qu sirve JSP

Primer ejemplo Hola Mundo y la fecha

Uso de objetos implcitos y ejemplo


Elementos bsicos de una pgina JSP

Directivas <%@ (page | include | taglib)

Cdigo Java <% (declaraciones | java | expresiones)

20

Introduccin a JSP

JSP es una especificacin de Sun Microsystems

Sirve para crear y gestionar pginas web dinmicas

Permite mezclar en una pgina cdigo HTML para


generar la parte esttica, con contenido dinmico
generado a partir de marcas especiales <% .... %>

El contenido dinmico se obtiene, en esencia, gracias a


la posibilidad de incrustar dentro de la pgina cdigo
Java de diferentes formas Hay 3 formas de aadir
contenido dinmico

Su objetivo final es separar la interfaz (presentacin


visual) de la implementacin (lgica de ejecucin)
21

Introduccin a JSP
Pgina JSP Servlet

La pgina JSP se convierte en un servlet

La conversin la realiza en la mquina servidora el


motor o contenedor JSP, la primera vez que se
solicita la pgina JSP

Este servlet generado procesa cualquier peticin


para esa pgina JSP

Si se modifica el cdigo de la pgina JSP, entonces


se regenera y recompila automticamente el servlet
y se recarga la prxima vez que sea solicitada
22

Primer ejemplo de JSP


Ejemplo de pgina que dice Hola y escribe la fecha actual
(fichero ej1_hola.jsp)

En esta pgina se mezcla cdigo HTML con cdigo Java incrustado


con unas marcas especiales

En este caso es una expresin, que se sustituye en la pgina por el


resultado de evaluarla

En otros casos es un trozo de cdigo Java que simplemente se


23
ejecuta

Ciclo de vida del servlet


generado

Cuando se llama por primera vez al fichero JSP, se genera


un servlet con las siguientes operaciones

jspInit()
Inicializa
Slo

el servlet generado

se llama en la primera peticin

jspService(peticin,respuesta)
Maneja

las peticiones. Se invoca en cada peticin,


incluso en la primera

jspDestroy()
Invocada

por el motor para eliminar el servlet


24

Objetos implcitos

JSP utiliza los objetos implcitos, basados en la API de


servlets.

Estos objetos estn disponibles para su uso en pginas JSP


y son los siguientes:
Objeto request
Representa la peticin lanzada en la invocacin de
service(). Proporciona entre otras cosas los parmetros
recibidos del cliente, el tipo de peticin (GET/POST)

Objeto response
Instancia

de HttpServletResponse que representa la


respuesta del servidor a la peticin. mbito de pgina
25

Objetos implcitos

out: Es el PrintWriter usado para enviar la salida al cliente.


Es una versin con buffer de PrintWriter llamada JspWriter.
Podemos ajustar el tamao del buffer, o incluso desactivar
el buffer, usando el atributo buffer de la directiva page. Se
usa casi exclusivamente en scriptlets ya que las
expresiones JSP obtienen un lugar en el stream de salida, y
por eso raramente se refieren explcitamente a out.

session: Este es el objeto HttpSession asociado con la


peticin. Las sesiones se crean automticamente, salvo
que se use el atributo session de la directiva page para
desactivar las sesiones, en cuyo caso los intentos de
referenciar la variable session causarn un error en el
momento de traducir la pgina JSP a un servlet.
26

Objetos implcitos

application: El ServletContext
getServletConfig().getContext().

obtenido

mediante

config: El objeto ServletConfig.

pageContext: JSP presenta una nueva clase llamada


PageContext para encapsular caractersticas de uso
especficas del servidor como JspWriters de alto
rendimiento. La idea es que, si tenemos acceso a ellas a
travs de esta clase en vez directamente, nuestro cdigo
seguir funcionando en motores servlet/JSP "normales".

page: Esto es slo un sinnimo de this, y no es muy til en


Java. Fue creado como situacin para el da que el los
lenguajes de script puedan incluir otros lenguajes
distintos de Java.
27

mbitos

Define dnde y durante cuanto tiempo estn


accesibles los objetos (Objetos implcitos,
JavaBeans, etc)

Tipos de mbitos:
de

pgina. El objeto es accesible por el servlet


que representa la pgina

de

peticin

de

sesin. El objeto es accesible durante toda la


sesin, desde los servlets a los que se accede

de

aplicacin. El objeto es accesible por el


servlet que representa la pgina
28

Ejemplo de objetos implcitos


Aplicacin que pide el nombre al usuario y le devuelve un
saludo . Utiliza un fichero HTML como formulario que
pide los datos al cliente y se los pasa a una pgina JSP
que muestra el saludo con estos datos. El paso de los
datos del formulario al JSP se realiza a travs de un
objeto implcito: objeto request
Formulario HTML
(pide datos al cliente)

Objeto request
(contiene los parmetros de
la peticin)

Pgina JSP
(muestra saludo
personalizado al cliente)

29

Ejemplo de objetos implcitos


Fichero HTML que pide los datos al cliente

30

<HTML>

Ejemplo de objetos implcitos


Fichero JSP que opera dinmicamente con los datos del cliente y muestra los
resultados
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>saludo</title>
</head>
<body>
<%String nombre = request.getParameter("nombre");
out.println("encantado de conocerte: "+ nombre);
%>
</body>
</html>
31

Elementos de una pgina JSP

Cdigo HTML

Adems de cdigo HTML la pgina JSP puede incluir


marcadores que se agrupan en tres categoras:

Directivas.

Elementos de Scripting (guiones)

Afectan a toda la estructura del servlet generado


Permiten insertar cdigo Java en la pgina JSP

Acciones

Afectan al comportamiento en tiempo de ejecucin


del JSP
32

Directivas JSP
Utilizadas

para definir y manipular una


serie de atributos dependientes de la
pgina que afectan a todo el JSP.

Las

directivas
siguientes:

Page

Include

Taglib

existentes

son

33

las

Directivas de JSP - Directiva Page

Sintaxis
<%@ page ATRIBUTOS %>

Donde ATRIBUTOS son parejas:


nombre=valor

Ejemplo:

<%@

page language=Java import=java.rmi.*,java.util.*

session=true buffer=12kb %>

Existe una lista de atributos que pueden ser usados


34

Directivas de JSP - Directiva Page

Algunos de los atributos ms usados:

import ="package.class".
Lista

de paquetes o clases, separados por comas, que


sern importados para utilizarse dentro del cdigo
java.

session =true|false
Especifica

si la pgina participa en una sesin HTTP. Si


se inicializa a true, est disponible el objeto implcito
sesin.

buffer =tamaokb
Especifica

el tamao de un buffer de salida de tipo


stream, para el cliente.
35

Directivas de JSP Directiva Page

autoflush ="true|false".

extends ="package.class".

Un valor de true (por defecto) indica que el buffer debera


desacargase cuando est lleno. Un valor de false, raramente
utilizado, indica que se debe lanzar una excepcin cuando el
buffe se sobrecargue. Un valor de false es ilegal cuando
usamos buffer="none".
Esto indica la superclase del servlet que se va a generar.
Debemos usarla con extrema precaucin, ya que el servidor
podra utilizar una superclase personalizada.

info ="message".

Define un string que puede usarse para ser recuperado


mediante el mtodo getServletInfo.
36

Directivas de JSP Directiva Page

errorPage="url".

isErrorPage="true|false".

Especifica una pgina JSP que se debera procesar si se


lanzar cualquier Throwable pero no fuera capturado en
la pgina actual.
Indica si la pgina actual acta o no como pgina de error
de otra pgina JSP. El valor por defecto es false.

ContentType = "MIME-Type" o contentType = "MIMEType; charset = Character-Set"

Esto especifica el tipo MIME de la salida. El valor por


defecto es text/html. Tiene el mismo valor que el
scriptlet usando response.setContentType.
37

Directivas de JSP - Directiva


Page

isThreadSafe="true|false"

Un valor de true (por defecto) indica un procesamiento


del servlet normal, donde mltiples peticiones pueden
procesarse simultneamente con un slo ejemplar del
servlet, bajo la suposicin que el autor sincroniza los
recursos compartidos. Un valor de false indica que el
servlet debera implementar SingleThreadModel.

language="java"

En algunos momentos, esto est pensado para


especificar el lenguaje a utilizar. Por ahora, no
debemos precuparnos por l ya que java es tanto el
valor por defecto como la nica opcin legal.
38

Directivas de JSP - Directiva


Include

Indica al motor JSP que incluya el contenido del fichero


correspondiente en el JSP, insertndolo en el lugar de la
directiva del JSP.

El contenido del fichero incluido es analizado en el


momento de la traduccin del fichero JSP y se incluye
una copia del mismo dentro del servlet generado.

Una vez incluido, si se modifica el fichero incluido no se


ver reflejado en el servlet

El tipo de fichero a incluir puede ser un

fichero HTML (esttico)

fichero jsp (dinmico)

Sintaxis:

<%@ include file=Nombre del fichero %>


39

Ejemplo de la Directiva Include

Ejemplo:Pgina JSP que incluye el contenido de dos ficheros


(una pgina HTML y una pgina JSP)
<HTML>
<head>
<title> Pgina de prueba de directivas de compilacin
</title>
</head>
<body>
<h1> Pgina de prueba de directivas de compilacin
</h1>
<%@ include file=/fichero.html %>
<%@ include file=/fichero.jsp %>
</body>
</HTML>
40

Ejemplo de la Directiva Include

Siendo, por ejemplo el fichero HTML el siguiente:

<HTML>
<head> <title> Hola, Mundo </title> </head>
<body> <h1> Hola, Mundo! </h1>
</body>
</HTML>

y el fichero JSP el siguiente:

<%@ page info="Un ejemplo Hola Mundo" import="java.util.Date"


%>
La fecha de hoy es:

<%= new Date().toString() %>


41

Directivas de JSP - Directiva Taglib

Permite extender los marcadores de JSP con


etiquetas o marcas generadas por el propio
usuario (etiquetas personalizadas).

Se hace referencia a una biblioteca de


etiquetas que contiene cdigo Java compilado
definiendo las etiquetas que van a ser usadas,
y que han sido definidas por el usuario

Sintaxis
<%@ taglib uri=taglibraryURI prefix=tagPrefix %>
42

Elementos de una pgina JSP

Cdigo HTML

Directivas

page

include

taglib

Elementos de Scripting (guiones)

Acciones (marcas estandar)


43

Elementos Scripting

Permiten la insercin de Declaraciones,


Cdigo Java (scriptlets) y Expresiones
dentro de una pgina JSP

Hay 3 categoras:

Declaraciones

Cdigo Java arbitrario

Expresiones

44

Elementos Scripting Declaraciones

Usadas para definir variables y mtodos con mbito


de clase para el servlet generado

Estas variables o mtodos declarados pasarn a ser


variables de instancia de la clase servlet generada

Esto significa que sern globales a todo el servlet


generado para la pgina

Sintaxis
<%! Declaracin %>

Ejemplo:
<%! int contador >
45

Ejemplo de uso de Declaraciones


Uso de un contador que indica el nmero de
veces que se accede a una pgina

46

Elementos Scripting - Scriptlets

Un scriptlet es un bloque de cdigo Java insertado en la


pgina y ejecutado durante el procesamiento de la respuesta

El cdigo introducido se inserta directamente en el mtodo


_jspService() del servlet generado para la pgina

Sintaxis
<% cdigo Java

%>

Ejemplo
<% int i,j;
for (i=0;i<3;i++) {
j=j+1;
}
%>
47

Ejemplo de uso de Scriptlets

Pgina JSP que usa cdigo Java para


repetir 10 veces un saludo

48

Elementos Scripting - Expresiones

Notacin abreviada que enva el valor de una expresin


Java al cliente.

La expresin se traduce por la llamada al mtodo println


del objeto out dentro del mtodo _jspService(), con lo que
en cada peticin, la expresin es evaluada y el resultado
se convierte a un String y se visualiza

Sintaxis
<%= Expresin Java a evaluar %>

Ejemplo
<%= Esta expresin muestra el valor de un contador +
contador %>

Nota: ser necesario que previamente contador haya tomado un valor


a travs de un scriptlet
49

Ejemplo de uso de Expresiones


En esta pgina JSP la expresin consiste en crear un objeto y
llamar a uno de sus mtodos. El resultado es un string que se
muestra al cliente
<HTML>
<head>
<title> Pgina de ejemplo de expresiones </title>
</head>
<body>
<h1> Pgina de ejemplo de expresiones </h1>
Hola a todos, son las <%= new Date().toString() %>
</body>
</HTML>
50

Ejercicios
1.

Crear una aplicacin que funcione como calculadora


con todas las operaciones.

2.

Crear una aplicacin que funciones como euro


conversor.

51