You are on page 1of 35

CURSO: Tecnologa J2EE (1 Parte)

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

3. Web Tier

3.1 Introduccin a Servlets

Porqu Pginas Web Dinmicas?

Pginas dinmicas con CGI

La pgina est basada en datos enviados por el usuario

Ejemplo: Confirmacin de inscripcin

Un estndar muy popular, que corresponde a las primeras soluciones

La pgina est derivada de datos que cambian frecuentemente

Una aplicacin CGI recibe la peticin desde el Servidor Web y responde con cdigo HTML Se crea un nuevo proceso por cada peticin, lo que lo hace ms lento y consume ms recursos Tpicamente se procesa la peticin con PERL, lo que obliga a hacer arrancar el interpretador Si un programa CGI termina antes de responder al Servidor Web, el cliente sufre retardos
Tecnologa J2EE 4

Ejemplo: Noticias del da

Desventajas:

La pgina usa informacin de base de datos u otras fuentes al lado del servidor

Ejemplo: Cupos disponibles en las asignaturas


Tecnologa J2EE 3

Ral Monge, 2004

Ral Monge, 2004

ASP de Microsoft

El Rol del Servlet

Active Server Pages es una solucin de Microsoft que tambin incrusta cdigo en pginas Web Lo soporta servidor Web IIS (Internet Information Server) de Microsoft Esta tecnologa ha sido reemplazada por ASP.NET

Lee datos explcitos del cliente

Lee datos implcitos del cliente

Formularios de datos (data forms) Cabecera de la solicitud

Genera resultados Enva datos explcitos al cliente

Enva datos implcitos al cliente


Cdigo HTML

Desventaja: Amarra a un solo vendedor


Tecnologa J2EE 5

Cdigo de status Cabecera de respuesta

Cookies

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

Ventajas de un Java Servlet


JavaServer Pages (JSP)

Eficiencia Hilos en vez de procesos, una copia, persistencia Conveniencia Dispone de muchas bibliotecas y herramientas de de desarrollo de alto nivel Potencia Comparticin de datos y conexiones a BD, persistencia Portabilidad Se ejecuta en todos los SO y servidores Robustez No usa shell, usa excepciones, recolector de basura Costo Existen muchos servidores gratis o de bajo costo
Tecnologa J2EE 7

Idea Bsica:

Usar HTML regular para la mayora de las pginas Marcar contenido dinmico con etiquetas especiales

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Saludos /TITLE> </HEAD> <BODY> <H2>Saludos< /H2> <% if (Math.random() < 0.7) { %> Que pase un <B>bonito </B> dia! <% } else { %> Que tenga un <B>lmal</B> dia! <% } %> </BODY> /HTML>
8

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

JSP vs. ASP

JSP vs. PHP


Parte dinmica es escrita en Java


no se usa VBScript u otro lenguaje especfico Ms poderoso y adecuado para aplicaciones complejas que requieren componentes reusables No se est amarrado a Windows e IIS En JSP se usa Java y no se amarra a un producto particular de servidor

PHP es gratis y muy similar a JSP y ASP Ventajas de JSP es que parte dinmica se escribe en Java

JSP es portable

No se requiere aprender un nuevo lenguaje Se pueden usar APIs de Java para acceder a base de datos y objetos distribuidos

Ral Monge, 2004

Tecnologa J2EE

Ral Monge, 2004

Tecnologa J2EE

10

JSP vs. Servlets

Contenedor de Servlets

En principio, todo lo que se puede hacer con JSP se puede con Servlets

De hecho documentos JSP se traducen automtica y transparentemente en servlets


Peticin HTTP

Es ms conveniente escribir HTML regular que codificar con println(...) Permite separar la presentacin de los contenidos

Servlet

Browser
Respuesta HTTP

Contenedor de Servlets
Contenido Esttico

Diseadores grficos pueden hacer las pginas y programadores los servlets

Ral Monge, 2004

Tecnologa J2EE

11

Ral Monge, 2004

Tecnologa J2EE

12

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

Servlet con Servidor HTTP


Contenedor de Servlets Servidor Web
Servlet

Funcionamiento del Servlet


Recibe Peticin
Est cargado el servlet?

NO

Peticin HTTP

SI
Es el servlet actual?

Browser
Respuesta HTTP

NO

SI

Carga Servlet

Contenido Esttico Enva Respuesta


Ral Monge, 2004 Tecnologa J2EE 13 Ral Monge, 2004 Tecnologa J2EE

Procesa Peticin

14

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Contenedores de Servlet y JSP

JavaServer Web Development Kit (JSWDK)


Es la referencia oficial de servlet 2.1 y JSP 1.0 Permite probar servlets y pginas JSP No soporta recarga automtica de servlets

3.2 Programacin con Servlets

Apache Tomcat

Es la referencia oficial de Sun para servlet 2.2 y JSP 1.1 (tb. servlet 2.3 y JSP 1.2) Es parte del proyecto Jakarta de Apache Software Foundation La versin 4.0 se denomina Catalina Puede correr slo o integrado a Apache No soporta recarga automtica de servlets
Tecnologa J2EE 15

Ral Monge, 2004

Ciclo de Vida de un Servlet

Ejemplo de un Servlet
import javax.servlet.*; import java.io.IOException; public class PrimitiveServlet implements Servlet { public void init(ServletConfig config) throws ServletException { System.out.println("init"); } public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("service"); } public void destroy() { System.out.println("destroy"); } }
Ral Monge, 2004 Tecnologa J2EE

init()

inicializa el servlet, creando los recursos requeridos, y comienza su vida Se invoca una sola vez maneja todas las peticiones enviadas por clientes con parmetros ServletRequest y ServletResponse Trmino de la vida del servlet, generalmente liberando recursos y salvando estado persistente
Tecnologa J2EE 17

service()

destroy()

Servlet escribe a la consola!!


18

Ral Monge, 2004

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

Mtodo de Inicializacin

Servlet: Ejemplo de Inicializacin


public class DBServlet ... { Connection conexion = null; public void init() throws ServletException { // Abrir conexin a BD para recibir peticiones try { bdURL = getInitParameter("bdURL"); ... // obtener user y password de la misma manera connection = DriverManager.getConnection(bdURL, user, passwd); } catch(Exception e) { throw new UnavailableException (this, "No puede abrir conexin a la base de datos"); } } ... }
Ral Monge, 2004 Tecnologa J2EE 20

Servlet se inicializa cuando se llama por primera vez (sino est registrado en el servidor) Existen dos mtodos:

public void init() throw ServletException

Se usa cuando no se requieren parmetros de inicializacin permite obtener parmetros del servidor Si se redefine debe llamarse a super.init(cfg)

public void init(ServletConfig cfg) throw ServletException


Servlet tiene mtodo getInitParameter(...) que permite obtener parmetros de inicializacin por nombre
Tecnologa J2EE 19

Ral Monge, 2004

Mtodo de Servicio

Mtodo de Destruccin

Cada vez que el servlet recibe una peticin se invoca este mtodo

El servidor puede decidir remover un servlet previamente cargado

En general, este mtodo no debiera redefinirse por una clase derivada Normalmente se usa clase HttpServlet

Ejemplo: Est ocioso por mucho tiempo

Normalmente el sistema crea una sola instancia de un servlet y luego crea un nuevo hilo para cada peticin

Antes de descargarlo se llama a destroy Permite realizar acciones de limpieza antes de eliminarlo

Si existen mltiples hilos ejecutndose pueden producir inconsistencias (se debieran sincronizar)
Tecnologa J2EE 21

Cerrar conexin a BD Detener hilos de trasfondo Escribir a disco estado relevante etc.
Tecnologa J2EE 22

Ral Monge, 2004

Ral Monge, 2004

Servlet: Ejemplo de destruccin


public class DBServlet ... { Connection con = null; ... // el mtodo init() public void destroy() { // Cerrar la conexin y habilitar que sea // recolectado como basura con.close(); con = null; } }
Ral Monge, 2004 Tecnologa J2EE 23

Protocolo HTTP

Permite intercambiar datos entre servidores y browsers Web Se basa en conexiones TCP fiables creadas por el cliente para cada peticin Se usa normalmente puerto 80 Definida en RFC 2068 y refinada en RFC 2616 (versin 1.1) Ms informacin en www.w3c.org/Protocols

Ral Monge, 2004

Tecnologa J2EE

24

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

Peticiones HTTP

Mtodos de HTTP 1.0

Transaccin HTTP comienza con una peticin del cliente y termina con una respuesta del servidor Una peticin HTTP consiste de:

GET

Recupera el recurso identificado por URL requerida Retorna slo cabecera del recurso identificado por URL requerida Enva datos de largo ilimitado al servidor Web

HEAD

<mtodo> <URI> <protocolo>/<versin> Cabecera de la peticin Lnea en blanco Cuerpo


Tecnologa J2EE 25

POST

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

26

Mtodos Adicionales en HTTP 1.1

Respuesta HTTP

PUT

Incluye:

Almacena el cuerpo de la peticin en la URL solicitada Complementaria a GET (similar a put de FTP) Borra en el servidor el documento identificado en la la URL Retorna mtodos HTTP que soporta el servidor Se usa para depurar problemas complejos en redes

DELETE

<Protocolo> <Cdigo> <Descripcin> Campos de cabecera Lnea en blanco Cuerpo 200: 404: 500: 503: OK Recurso requerido no disponible Error en el servidor HTTP Servidor HTTP temporalmente sobrecargado

OPTIONS

Algunos posibles cdigos de retorno:


TRACE

Ral Monge, 2004

Tecnologa J2EE

27

Ral Monge, 2004

Tecnologa J2EE

28

Clase HttpServlet
Clientes Servidor Web
Request
service()

Plantilla Tpica de un Servlet


import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class SomeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Usar request para leer cabecera HTTP // (e.g. Cookies o HTML data form) // Usar response para especificar cdigo de respuesta y cabecera // (e.g. especificar tipo de contenido y definir cookies). PrintWriter out = response.getWriter(); // usar out para enviar contenido al browser } }
29 Ral Monge, 2004 Tecnologa J2EE 30

HttpServlet
doDelete() doGet() doOptions() doPost() doTrace() doPut()

Response

Usuario redefine los mtodos asociados al protocolo HTTP


Ral Monge, 2004 Tecnologa J2EE

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Programacin de un Servlet Simple


public class SimpleServlet extends HttpServlet {

3.3 Un Ejemplo Sencillo

public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String title = Salida de Servlet Simple"; PrintWriter out = response.getWriter(); // generar el cdigo html out.println("<HTML><HEAD><TITLE>"); out.println(title); out.println("</TITLE></HEAD><BODY>"); out.println("<H1>" + title + "</H1>"); out.println("<P>Esta salida es de un Servlet simple."); out.println("</BODY></HTML>"); out.close(); } }
Ral Monge, 2004 Tecnologa J2EE 32

Pasos para Ejecucin en Tomcat


Estructura de Directorio
Directorio de Aplicaciones
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>ServletSimple</servlet-name> <servlet-class>ServletSimple</servlet-class> </servlet> </web-app>

Crear un Directorio para la aplicacin Escribir el cdigo del servlet Compilar el cdigo

Se requiere javax.servlet para compilar

Crear un descriptor de despliegue Hacer partir Tomcat Llamar al servlet desde el browser
Tecnologa J2EE 33 Ral Monge, 2004

web.xml

ServletSimple.class
Ral Monge, 2004 Tecnologa J2EE 34

Ejecucin del Servlet


http://localhost:8080/Pruebas/servlet/ServletSimple

Parmetros de Inicializacin
La definicin de parmetros es especfica para cada tipo de servidor Tomcat permite definir pares <nombre, valor> en descriptor del servlet en archivo web.xml Ejemplo:
<servlet> <servlet-name>Config</servlet-name> <servlet-class>ConfigServlet</servlet-class> <init-param> <param-name>User</param-name> <param-value>Raul Monge</param-value> </init-param> </servlet>

Ral Monge, 2004

Tecnologa J2EE

35

Ral Monge, 2004

Tecnologa J2EE

36

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo de Parmetros
import javax.servlet.*; import java.util.Enumeration; import java.io.IOException; public class ConfigDemoServlet implements Servlet { public void init(ServletConfig config) throws ServletException { Enumeration parameters = config.getInitParameterNames(); while (parameters.hasMoreElements()) { String parameter = (String) parameters.nextElement(); System.out.println("Parameter name : " + parameter); System.out.println("Parameter value : " + config.getInitParameter(parameter)); } } .... }
Ral Monge, 2004 Tecnologa J2EE 37

Contexto del Servlet

Representa el mbito de ejecucin del Servlet El contenedor le crea un contexto a cada Servlet (de tipo ServletContext)

Se puede recuperar desde la Configuracin

Permite asociar un atributo de un servlet por nombre

Servlets de la misma aplicacin pueden compartir un mismo contexto


Tecnologa J2EE 38

Ral Monge, 2004

Ejemplo de Contexto (1/2)


public class ContextDemoServlet implements Servlet { protected ServletConfig servletConfig; public void init(ServletConfig config) throws ServletException { servletConfig = config; } public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException { ServletContext servletContext = servletConfig.getServletContext(); Enumeration attributes = servletContext.getAttributeNames() ; while (attributes.hasMoreElements()) { String attribute = (String) attributes.nextElement(); System.out.println("Attribute name : " + attribute + "Attribute value : " + servletContext.getAttribute(attribute)); } System.out.println("Major version : " + servletContext.getMajorVersion()); System.out.println("Minor version : " + servletContext.getMinorVersion()); System.out.println("Server info : " + servletContext.getServerInfo()); }
Ral Monge, 2004 Tecnologa J2EE 39

Comparticin de Informacin entre Servlets

Se puede compartir informacin mediante atributos disponibles en el contexto (tipo servletContext) Ejemplo:

String de conexin a la DB Contador de pginas

Ral Monge, 2004

Tecnologa J2EE

40

Ejemplo: Comparticin de Atributo


public class SetAttribute implements Servlet { public void init(ServletConfig config) throws ServletException { // asocia un objeto que es compartido con otros servlets ServletContext servletContext = config.getServletContext(); servletContext.setAttribute("password", "cualquiera"); }

Peticiones para Servlets

Se representa como un objeto de tipo ServletRequest que se pasa como parmetro en mtodo service(...) La clase provee varios mtodos para obtener informacin sobre:

Cabecera de la peticin Direcciones del cliente y servidor Parmetros (nombres y valores) Atributos (nombres y valores)
Tecnologa J2EE 42

Ral Monge, 2004

Tecnologa J2EE

41

Ral Monge, 2004

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

API de clase ServletRequest (1/2)

API de clase ServletRequest (2/2)

String getProtocol()

Obtiene el protocolo de la peticin Obtiene tipo de contenido en la peticin Obtiene esquema de la peticin Obtiene el largo en bytes del cuerpo de la peticin Obtiene stream de caracteres para leer cuerpo de la peticin

Enumeration getParameterNames() String getParameter(String name)

String getContentType()

Obtiene lista de nombres de parmetros y el valor del parmetro respectivamente

String getSchema()

Enumeration getAttributeNames() Object getAttribute(String name)

int getContentLength()

Obtiene lista de nombres de atributos y el valor del atributo respectivamente Obtiene nombre del servidor y puerto Obtiene direccin IP y nombre del Host remoto

String getServerName(), int getServerPort()

BufferReader getReader()

String getRemoteAddr(), String getRemoteHost()

Ral Monge, 2004

Tecnologa J2EE

43

Ral Monge, 2004

Tecnologa J2EE

44

Ejemplo de Peticin (1/3): Servlet que Imprime Peticin


public class DemoPeticion implements Servlet { public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { System.out.println("Puerto servidor: " + request.getServerPort() ); System.out.println("Nombre Servidor: " + request.getServerName() ); System.out.println("Protocolo: " + request.getProtocol() ); System.out.println("Codificacion Caracteres: " + request.getCharacterEncoding() ); System.out.println("Tipo Contenido: " + request.getContentType() ); System.out.println("Largo Contenido: " + request.getContentLength() ); System.out.println("Direcccion Remota: " + request.getRemoteAddr() ); System.out.println("Host Remoto: " + request.getRemoteHost() ); System.out.println("Esquema: " + request.getScheme() ); Enumeration parameters = request.getParameterNames() ; while (parameters.hasMoreElements()) { String parameterName = (String) parameters.nextElement(); System.out.println("Nombre Parametro: " + parameterName); System.out.println("Valor Parametro: " + request.getParameter(parameterName) + "\n"); } // .... } ...
Tecnologa J2EE 45

Ejemplo de Peticin (2/3): Cdigo HTML que genera Peticin


<html> <head> <title>Enviando una Peticion HTTP</title></head> <body> <h1>Demostracion de Envio de Peticion HTTP</h1> <br> <form action="servlet/DemoPeticion" method="Post"> <br><br> Autor: <input type="text" name="Autor"> <br> Titulo: <input type="text" name="Titulo"> <br><br> <input type="submit" name="Someter" value="Enviar"> <input type="reset" value="Limpiar"> </form> </body> </html>
Ral Monge, 2004 Tecnologa J2EE 46

Ral Monge, 2004

Respuesta desde Servlet

Ejemplo de Respuesta

En la invocacin del mtodo service(...) se entrega un objeto de tipo ServletResponse Clase provee mtodos para definir la respuesta:

Cabecera Cuerpo (usando un stream)

Normalmente se usa tipo HttpServletResponse, que provee mayor control sobre la respuesta (e.g. Cdigo de respuesta, cookies, etc.)
Tecnologa J2EE 47 Ral Monge, 2004 Tecnologa J2EE 48

Ral Monge, 2004

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

Paquete javax.servlet.http

Ejemplo: Pgina HTML


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head><title>Enviando una Peticion HTTP</title></head> <body> <h1>Envio de Peticion HTTP con GET y POST</h1> <hr width="100%" size="2">La demostraci&oacute;n env&iacute;a &nbsp;primero &nbsp;datos del formulario con GET y luego responde el servlet<br> para &nbsp;solictar el env&iacute;o de un POST<br> <br> Pruebe &nbsp;primero el GET llenando las entradas!<br> <form action="servlet/httpSimple" method="Get" ><br> <br> Autor: <input type="text" name="Autor"><br> Titulo: <input type="text" name="Titulo"><br> <br> <input type="submit" value="Enviar"><input type="reset" value="Limpiar"></form> </body> </html>
Ral Monge, 2004 Tecnologa J2EE 50

Clase HttpServlet en paquete javax.servlet.http es de uso ms conveniente Paquete trae facilidades para:

Un mtodo especial para cada mtodo del protocolo HTTP (doXXX) manejo de peticiones y respuestas HTTP manejo de cookies manejo de sesiones

Ral Monge, 2004

Tecnologa J2EE

49

Ejemplo de ServletHttp
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class httpSimple extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<HTML> <HEAD> "); out.println("<TITLE>El metodo GET</TITLE>"); out.println("</HEAD> <BODY> "); out.println("El servlet ha recibido un GET. " + "Ahora pulse el boton siguiente. <BR>"); out.println("<FORM METHOD=POST>"); out.println("<INPUT TYPE=SUBMIT VALUE=Enviar>"); out.println("</FORM> </BODY> </HTML> "); } public void doPost( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<HTML> <HEAD> "); out.println("<TITLE>El metodo POST</TITLE>"); out.println("</HEAD>"); out.println("<BODY>"); out.println("El servlet ha recibido un POST. Gracias!"); out.println("</BODY> </HTML> "); } }
51

Clase HttpServletRequest

Extiende interfaz ServletRequest

Estn disponibles todos sus mtodos

Adems, facilita obtener informacin enviada por el browser:


Obtener informacin de la cabecera http Obtener parmetros de formularios Redirigir la peticin a otro servlet Obtener Cookies y manejo de Sesiones
Tecnologa J2EE 52

Ral Monge, 2004

Tecnologa J2EE

Ral Monge, 2004

Ejemplo: Informacin de cabecera


import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class RegisterServlet extends HttpServlet { public void doGet(HttpServletRequest peticion, HttpServletResponse respuesta) throws ServletException, IOException { respuesta.setContentType("text/html"); PrintWriter out = respuesta.getWriter(); Enumeration enum = peticion.getHeaderNames() ; while (enum.hasMoreElements()) { String elemCabecera = (String) enum.nextElement(); out.println(elemCabecera + ": " + peticion.getHeader(elemCabecera) + "<BR>"); } } }
Ral Monge, 2004 Tecnologa J2EE 53

Obtencin de Parmetros
public class DemoPeticionHttp extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<HTML> <BODY>"); // se han eliminado algunas salidas Enumeration enum = req.getParameterNames() ; while (enum.hasMoreElements()){ String nombreParam = (String) enum.nextElement(); out.println(nombreParam + ": " + req.getParameter(nombreParam) + "<BR>" ); } out.println("<FORM METHOD=GET>"); out.println("<BR>Nombre: <INPUT TYPE=TEXT NAME=Nombre>"); out.println("<BR>Apellido: <INPUT TYPE=TEXT NAME=Apellido>"); out.println("<BR><INPUT TYPE=SUBMIT VALUE=Enviar>"); out.println("</FORM></BODY></HTML>"); } }
Ral Monge, 2004 Tecnologa J2EE 54

Ral Monge, 2004

CURSO: Tecnologa J2EE (1 Parte)

Obtencin de Parmetros multi-valores

Ejemplo: Parmetro Multi-valor


// en mtodo doGet
out.println("Seleccione su musica favorita:"); out.println("<BR><FORM METHOD=POST>"); out.println("<BR><INPUT TYPE=CHECKBOX " + "NAME=musicaFavorita VALUE=Rock>Rock"); out.println("<BR><INPUT TYPE=CHECKBOX " + "NAME=musicaFavorita VALUE=Jazz>Jazz"); out.println("<BR><INPUT TYPE=CHECKBOX " + "NAME=musicaFavorita VALUE=Clasica>Clasica"); out.println("<BR><INPUT TYPE=CHECKBOX " + "NAME=musicaFavorita VALUE=Folklorica>Folklorica"); out.println( "<BR><INPUT TYPE=SUBMIT VALUE=Enviar>");

Existen casos donde un mismo parmetro se asocia a mltiples valores

// en mtodo doPost
String[] valores = req.getParameterValues("musicaFavorita"); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); if (valores != null ) { int largo = valores.length; out.println("usted ha seleccionado: "); for (int i=0; i<largo; i++) { out.println("<BR>" + valores[i]); }

Ejemplo: Un checkbox de seleccin

En este caso usar en HttpServletRequest mtodo getParameterValues

Acepta un argumento (nombre del parmetro) y retorna arreglo de valores Si no se encuentra nombre, retorna null
Tecnologa J2EE 55

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

56

Clase HttpServletResponse

API en HttpServletResponse

Extiende la interfaz ServletResponse

void setHeader(String nombre, String valor)

Estn disponibles sus mtodos

Define un parmetro de la respuesta con un valor Define un cdigo de status en la respuesta Se hereda de interfaz ServletResponse Permite escribir caracteres en el cuerpo de la respuesta

Agrega facilidades para:


void setStatus(int sc)

Definir la cabecera Enviar un cdigo de error Redireccionar el usuario a otra pgina Agregar un cookie

java.io.PrintWriter getWriter()

Ral Monge, 2004

Tecnologa J2EE

57

Ral Monge, 2004

Tecnologa J2EE

58

API en HttpServletResponse

Constantes de Error de Status

void sendError(int sc, String msg)

Enva error de status sc y mensaje msg al browser Se usa cuando existe algn error de acceso Permite dirigir una peticin a otro recurso (especificado por URL) Lo normal es redirigir a un recurso de la misma aplicacin
Tecnologa J2EE 59

Error de Status en interfaz javax.servlet.http.HttpServletResponse:


void sendRedirect(String URL)

SC_OK (200) SC_BAD_REQUEST (400) SC_UNAUTHORIZED (401) SC_FORBIDDEN (403) SC_INTERNAL_SERVER_ERROR (500) SC_MOVED_TEMPORARILY (302) SC_NO_CONTENT (204) SC_NOT_FOUND (404) etc.
Tecnologa J2EE 60

Ral Monge, 2004

Ral Monge, 2004

Ral Monge, 2004

10

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo de Redireccin (1/2)


public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { enviarFormLogin(resp, false); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String usuario = req.getParameter("usr"); String clave = req.getParameter("pass"); if (usuario != null && clave !=null && usuario.equals("rmonge") && clave.equals("cualquiera")) { resp.sendRedirect("http://localhost:8080/Pruebas/Bienvenida.html") ; } else { // validacin ha sido exitoso enviarFormLogin(resp, true); } }
Ral Monge, 2004 Tecnologa J2EE 61

Ejemplo de Redireccin (2/2)


private void enviarFormLogin(HttpServletResponse resp, boolean conMsjError) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<HTML><HEAD>"); // se puede poner ttulo de la pgina !! out.println("</HEAD><BODY>"); if (conMsjError) out.println("Login fallo! Por favor intente de nuevo.<BR><BR>"); out.println("Por favor ingrese nombre de usuario y password."); out.println("<BR><FORM METHOD=POST>"); out.println("<BR>Nombre de usuario: <INPUT TYPE=TEXT NAME=usr>"); out.println("<BR>Password : <INPUT TYPE=PASSWORD NAME=pass>"); out.println("<BR><INPUT TYPE=SUBMIT VALUE=Enviar>"); out.println("</FORM>"); out.println("</BODY></HTML>"); }
Ral Monge, 2004 Tecnologa J2EE 62

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Ejemplo de Status de Error


public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String usuario = req.getParameter("usr"); String clave = req.getParameter("pass"); if (usuario != null && clave !=null && usuario.equals("rmonge") && clave.equals("cualquiera")) { resp.sendRedirect("http://localhost:8080/Pruebas/Bienvenida.html"); } else { resp.sendError(resp.SC_FORBIDDEN, "Login fallo!!!"); } }

3.6 Delegacin de Peticiones y Respuestas

Ral Monge, 2004

Tecnologa J2EE

63

Despacho de Peticiones

Mtodo getRequestDispatcher

Se realiza con interfaz javax.servlet.RequestDispatcher Provee mecanismo de delegacin para:

Permite obtener un despachador de una una peticin Este mtodo existe en dos interfaces:

Inclusin. Permite incluir el contenido de una pgina o la salida de otro servlet Pase (forward). Permite pasar una peticin y respuesta a otro servlet para que lo siga procesando

javax.servlet.ServletContext

Se pasa URL (relativa a raz del contexto) Se pasa URL (relativa a la peticin HTTP)

javax.servlet.ServletRequest

Tambin se puede obtener del contexto por nombre en usado en registro de despliegue (en web.xml)
Tecnologa J2EE 66

Ral Monge, 2004

Tecnologa J2EE

65

Ral Monge, 2004

Ral Monge, 2004

11

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo de Inclusin
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class inclusionSimple extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher rd = req.getRequestDispatcher("/banner.html"); rd.include(req, resp); } }
Ral Monge, 2004 Tecnologa J2EE 67

Ejemplo: Inclusin con Servlet (1/3)


public class inclusionServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<HTML><HEAD>"); out.println("<TITLE>Inclusion de Parametros de Peticion</TITLE>"); out.println("</HEAD><BODY>"); out.println("<B>Inclusion de Parametros de Peticion</B><BR>"); out.println("<B>inclusionServlet</B>: llama a esclavoServlet!<BR><BR>"); RequestDispatcher rd = req.getRequestDispatcher("/servlet/esclavoServlet?nombre=esclavo"); rd.include(req, resp); out.println("<B>inclusionServlet</B>: Retorna esclavoServlet!<BR>"); out.println("</BODY></HTML>"); } }
Ral Monge, 2004 Tecnologa J2EE 68

Ejemplo: Inclusin con Servlet (2/3)


public class esclavoServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); Enumeration enum = req.getAttributeNames(); out.println("<B>esclavoServlet</B>: Muestro atributos!<BR>"); while (enum.hasMoreElements()) { String nombreAtributo = (String) enum.nextElement(); out.println(nombreAtributo + ": " + req.getAttribute(nombreAtributo) + "<BR>"); } out.println("<B>esclavoServlet</B>: fin!<BR><BR>"); } }
Ral Monge, 2004 Tecnologa J2EE 69

Ejemplo: Inclusin con Servlet (3/3)

Ral Monge, 2004

Tecnologa J2EE

70

Ejemplo: Pase de Peticin


public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String usuario = req.getParameter("usuario"); String password = req.getParameter("password"); if (login(usuario, password)) { // validacin ha sido exitosa RequestDispatcher rd = req.getRequestDispatcher("OtroServlet"); rd.forward(req, resp); } else { // validacion ha fallado! til para centralizar el enviarLoginForm(resp, true); control de acceso a } }

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

3.7 Servlets, Base de Datos y Utilitarios

otros servlets (o JSP), siendo trasparente para el cliente

Ral Monge, 2004

Tecnologa J2EE

71

Ral Monge, 2004

12

CURSO: Tecnologa J2EE (1 Parte)

Alternativa1: Parmetros en web.xml


<servlet> <servlet-name>Login</servlet-name> <servlet-class>LoginServlet</servlet-class> <init-param> <param-name>jdbc.drivers</param-name> <param-value>com.mysql.jdbc. Driver</param-value> </init-param> <init-param> <param-name>jdbc.url</param-name> <param-value>jdbc:mysql://localhost:3306/test</param-value> </init-param> <init-param> <param-name>jdbc.username</param-name> <param-value></param-value> </init-param> <init-param> <param-name>jdbc.password</param-name> <param-value></param-value> </init-param> </servlet>
Ral Monge, 2004 Tecnologa J2EE 73

Configuracin de BD

Para obtener los parmetros del driver y la base de datos se recomienda usar web.xml (configuracin de la aplicacin)

De esa manera no hay que tocar los servlets cuando se cambian los parmetros

El uso especfico de web.xml depender mucho del gusto del desarrollador


Tecnologa J2EE 74

Ral Monge, 2004

Alternativa2: Parmetros en web.xml


web.xml
<servlet> <servlet-name>Login</servlet-name> <servlet-class>LoginServlet</servlet-class> <init-param> <param-name>database.properties</param-name> <param-value>C:\\BASE_DATOS\\database.properties</param-value> </init-param> </servlet>

a) Carga de Drivers JDBC (1/2)


public DbUtil(ServletConfig config) throws IOException { // constructor ServletContext contexto = config.getServletContext(); drivers = (String) contexto.getAttribute("jdbc.drivers"); if (drivers == null) { Properties props = new Properties(); String dbProperties = config.getInitParameter("database.properties"); // alternativa 2 try { FileInputStream in = new FileInputStream(dbProperties); props.load(in); in.close(); } catch (IOException e) { System.out.println("No pudo abrir archivo " + dbProperties); throw e; } System.out.println("Cargando propiedades de BD de archivo \"" + dbProperties + "\"..."); // sigue en prxima pgina
75 Ral Monge, 2004 Tecnologa J2EE 76

database.properties
jdbc.drivers=com.ibm.db2j.jdbc.DB2jDriver jdbc.url=jdbc:db2j:/BASE_DATOS/BD_PRUEBA;create=true jdbc.username= jdbc.password=
Ral Monge, 2004 Tecnologa J2EE

a) Carga de Drivers JDBC (2/2)


// .... de la pgina anterior urlDB = props.getProperty("jdbc.url"); usrDB = props.getProperty("jdbc.username"); passDB = props.getProperty("jdbc.password"); drivers = props.getProperty("jdbc.drivers"); System.out.println("Cargando driver \"" + drivers + "\"..."); try { Class.forName(drivers); contexto.setAttribute("jdbc.drivers", drivers); contexto.setAttribute("jdbc.url", urlDB); contexto.setAttribute("jdbc.username", usrDB); contexto.setAttribute("jdbc.password", passDB); } catch (ClassNotFoundException e) { System.out.println(e.toString()); } } else { // Drivers deJDBC ya cargados y variables definidas en contexto System.out.println("Cargando propiedades de DB del contexto..."); urlDB = (String) contexto.getAttribute("jdbc.url"); usrDB = (String) contexto.getAttribute("jdbc.username"); passDB = (String) contexto.getAttribute("jdbc.password"); } }
Ral Monge, 2004 Tecnologa J2EE 77

b) Conexin a BD
public Connection crearConexion() { Connection conexion = null; try { System.out.println("Creando conexion a \"" + urlDB + "\"...."); conexion = DriverManager.getConnection(urlDB, usrDB, passDB); } catch (SQLException e) { System.out.println(e.toString()); } return conexion; }

Ral Monge, 2004

Tecnologa J2EE

78

Ral Monge, 2004

13

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo: Control de Ingreso

Ejemplo: El Servlet
public class LoginServlet extends HttpServlet { private DbUtil db = null; public void init(ServletConfig config) { try { db = new DbUtil(config); } catch (IOException e) {} } public void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException { enviarLoginForm(resp, false); } // sigue prxima pgina

Ral Monge, 2004

Tecnologa J2EE

79

Ral Monge, 2004

Tecnologa J2EE

80

Ejemplo: Mtodo POST


public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String usuario = req.getParameter("usuario"); Comprueba si usuario String password = req.getParameter("password"); y password es correcto if (login(usuario, password)) { RequestDispatcher rd = req.getRequestDispatcher("OtroServlet"); rd.forward(req, resp); } else { Redirecciona a otro enviarLoginForm(resp, true); servlet si ingreso es } }

Ejemplo: Prueba de Password


boolean login(String usuario, String password) { boolean retorno = false; try { con = db.crearConexion(); Statement s = con.createStatement(); String sql = "SELECT Usuario FROM Usuarios" + " WHERE Usuario='" + usuario + "'" + " AND Password='" + password + "'"; ResultSet rs = null; System.out.println("Ejecutar SQL: " + sql); if (s.execute(sql)) { rs = s.getResultSet(); if (rs.next()) retorno = true; // Existe al menos un registro }
Ral Monge, 2004 Tecnologa J2EE

rs.close(); s.close(); } catch (SQLException e) { System.out.println(e.toString()); } catch (Exception e) { System.out.println(e.toString()); } return retorno; }

exitoso

Ral Monge, 2004

Tecnologa J2EE

81

82

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Ejemplo: Formulario de Login


private void enviarLoginForm(HttpServletResponse resp, boolean conMsjError) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<HTML><HEAD><TITLE>Login</TITLE></HEAD><BODY>"); if (conMsjError) out.println("Login fallo! Por favor intente de nuevo.<BR>"); out.println("<BR>Por favor ingrese su nombre y clave de acceso.<BR>"); out.println("<BR><FORM METHOD=POST>"); out.println("<TABLE>"); out.println("<TR><TD>Nombre de usuario:</TD>"); out.println("<TD><INPUT TYPE=TEXT NAME=usuario></TD></TR>"); out.println("<TR><TD>Clave de Acceso:</TD>"); out.println("<TD><INPUT TYPE=PASSWORD NAME=password></TD></TR>"); out.println("<TR><TD ALIGN=RIGHT COLSPAN=2>"); out.println("<INPUT TYPE=SUBMIT VALUE=Ingresar></TD></TR>"); out.println("</TABLE></FORM>"); out.println("</BODY></HTML>"); }
Ral Monge, 2004 Tecnologa J2EE 83

3.8 Gestin de Sesiones

Ral Monge, 2004

14

CURSO: Tecnologa J2EE (1 Parte)

Necesidad de Sesin

Ejemplo

Protocolo HTTP considera que servidor cierra conexin despus de cada peticin

Un usuario ingres exitosamente al sistema a travs de un servlet


Se considera a HTTP un protocolo sin estado (stateless) Qu pasa cuando un cliente interacta varias veces con el servidor, conducido por un estado anterior?
Tecnologa J2EE 85

Cmo sabe otro servlet de esto? Debe realizar una nueva verificacin de acceso?

Problema:

Solucin: Usar mecanismos para gestin o seguimiento de sesiones!

Protocolo HTTP sigue siendo sin estado, pero existe mecanismo para resolver el problema Principio: cliente enva en cada peticin informacin entregada antes por un servlet
Tecnologa J2EE 86

Ral Monge, 2004

Ral Monge, 2004

Tcnicas de Gestin de Sesiones

Rescritura de URL

Reescritura de URL

Agregando a URL parmetros (nombre/valor) Informacin aparece visible en el Browser Se pasa parmetro en un campo oculto de un data form Aun se puede ver en el cdigo fuente de la pgina HTML Pequea pieza de informacin que se pasa de ida y vuelta entre el servidor y el cliente Se usan objetos almacenados en el servidor que a travs de una clave se relacionan en forma nica con un cliente

Campos Ocultos

Se agregan parmetros en la URL que permiten realizar seguimiento de sesin Ejemplo:

http://localhost:8080/Pruebas/servlet/ActualizacionServlet?uid=1

Cookies

Problema:

Objetos de sesin

Existe lmite en el nmero de caracteres Informacin es visible en el Browser Se requiere codificar caracteres especiales (e.g. &, ? y blancos)
Tecnologa J2EE 88

Ral Monge, 2004

Tecnologa J2EE

87

Ral Monge, 2004

Ejemplo de Rescritura de URL

Ejemplo: mtodos GET & POST


public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println(StringUtil.generarCabeceraHTML("Despliegue de Registros Seleccionados")); out.println("<BODY><CENTER>"); enviarFormularioBusqueda(resp); out.println("</CENTER></BODY></HTML>"); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { clave = req.getParameter("Clave"); // se deja en un campo privado de la clase resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println(StringUtil.generarCabeceraHTML("Despliegue de Registros Seleccionados")); out.println("<BODY><CENTER>"); enviarFormularioBusqueda(resp); enviarResultadosBusqueda(resp); out.println("</CENTER></BODY></HTML>"); }
Ral Monge, 2004 Tecnologa J2EE 90

Para administrar usuarios se usa como clave de seguimiento el UID Un formulario de bsqueda genera dinmicamente las URL requeridas

Cada registro de usuario queda asociado a una direccin URL diferente

Ral Monge, 2004

Tecnologa J2EE

89

Ral Monge, 2004

15

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo: envo de resultados


String sql = "SELECT UID, Nombre, Apellido, Usuario, Password" + " FROM Usuarios" + " WHERE Nombre LIKE '%" + StringUtil.arreglarValorCampoSQL(clave) + "%'" + " OR Apellido LIKE '%" + StringUtil.arreglarValorCampoSQL(clave) + "%'"; ResultSet rs = s.executeQuery(sql); while (rs.next()) { String uid = rs.getString(1); out.println("<TR>"); out.println("<TD>" + StringUtil.codificarEtiquetaHTML(rs.getString(2)) + "</TD>"); out.println("<TD>" + StringUtil.codificarEtiquetaHTML(rs.getString(3)) + "</TD>"); out.println("<TD>" + StringUtil.codificarEtiquetaHTML(rs.getString(4)) + "</TD>"); out.println("<TD>" + StringUtil.codificarEtiquetaHTML(rs.getString(5)) + "</TD>"); out.println("<TD><A HREF=BorradoServlet?uid=" + uid + ">Borrar</A></TD>"); out.println("<TD><A HREF=ActualizacionServlet?uid=" + uid + ">Actualizar</A></TD>"); out.println("</TR>"); }

Ejemplo: Servlet de Actualizacin


public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println(StringUtil.generarCabeceraHTML("Registro de Usuarios")); out.println("<BODY><CENTER>"); enviarFormularioActualizacion(req, resp); out.println("</CENTER></BODY></HTML>"); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println(StringUtil.generarCabeceraHTML("Registro de Usuarios")); out.println("<BODY><CENTER>"); enviarFormularioActualizacion(req, resp); actualizarRegistro(req, resp); out.println("</CENTER></BODY></HTML>"); }

Es atendido por otro servlet

Ral Monge, 2004

Tecnologa J2EE

91

Ral Monge, 2004

Tecnologa J2EE

92

Ejemplo: Formulario de Actualizacin


// cdigo en enviarFormularioActualizacion String uid = req.getParameter("uid"); PrintWriter out = resp.getWriter(); out.println("<BR><H2>Formulario de Actualizacion</H2>"); out.println("<BR>Por favor edite nombre, apellido o password.<BR> "); try { String sql = "SELECT Nombre, Apellido, Usuario, Password" + " FROM Usuarios" + " WHERE Uid=" + uid; Connection con = db.crearConexion(); Statement s = con.createStatement(); ResultSet rs = s.executeQuery(sql); if (rs.next()) { String nombre = rs.getString(1); String apellido = rs.getString(2); String usuario = rs.getString(3); String password = rs.getString(4); out.println("<BR><FORM METHOD=POST ACTION=" + req.getRequestURI() + "?uid=" + uid + ">"); out.println("<TABLE>"); // ....presenta el formulario con los datos del usuario
Ral Monge, 2004 Tecnologa J2EE 93

Campos Ocultos

Al formar un formulario se agrega campo oculto con valor asociado a sesin Problemas:

Informacin an es accesible viendo cdigo html fuente de la pgina Se est limitado al uso de formularios de datos

Ral Monge, 2004

Tecnologa J2EE

94

Ejemplo: Campo Oculto

Ejemplo: Pgina HTML

Formulario que se ha dividido en varias pginas Campo oculto se usa para indicar en cul pgina se encuentra el usuario Servlet discrimina rescatando el valor del parmetro desde la peticin

Ral Monge, 2004

Tecnologa J2EE

95

Ral Monge, 2004

Tecnologa J2EE

96

Ral Monge, 2004

16

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo: mtodos GET & POST


public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { enviarPagina1(resp); } public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String pagina = req.getParameter("pagina"); nombre = req.getParameter("nombre"); apellido = req.getParameter("apellido"); usuario = req.getParameter("usuario"); password = req.getParameter("password"); if (pagina==null) { enviarPagina1(resp); return; } if (pagina.equals("1")) { if (nombre==null || apellido==null) enviarPagina1(resp); else enviarPagina2(resp); // ....
Ral Monge, 2004 Tecnologa J2EE 97

Ejemplo: Formulario 2a Pgina


void enviarPagina2(HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println(StringUtil.generarCabeceraHTML("Pagina 2")); out.println("<BODY>"<CENTER><H2>Pagina 2</H2><BR><BR>"); out.println("Por favor ingrese nombre de usuario y password."); out.println("<BR><BR>"); out.println("<FORM METHOD=POST>"); out.println("<INPUT TYPE=HIDDEN NAME=pagina VALUE=2>"); out.println("<INPUT TYPE=HIDDEN NAME=nombre VALUE=\"" + StringUtil.codificarEtiquetaHTML(nombre) + "\"></TD>"); out.println("<INPUT TYPE=HIDDEN NAME=apellido VALUE=\"" + StringUtil.codificarEtiquetaHTML(apellido) + "\"></TD>"); out.println("<TABLE>"); out.println("<TR>"); out.println("<TD><B>Nombre de usuario&nbsp;</B></TD>"); out.println("<TD><INPUT TYPE=TEXT NAME=usuario></TD>"); // ...
Ral Monge, 2004 Tecnologa J2EE 98

Cookies

Mtodos Bsicos para Cookies


(en javax.servlet.http) Crear un cookie

Pequea pieza de informacin que se pasa de ida y vuelta en cada peticin y respuesta (en la cabecera http) Java provee clase Cookie para facilitar su manejo Valor de cookie identifica nicamente a un cliente Un browser debiera soportar:

Cookie c1 = new Cookie(sesion, sid); respuesta.addCookie(c1); Cookie[] galletas = peticion.getCookies();

Agregar un cookie a la respuesta

20 cookies para cada servidor Web 300 cookies en total Tamao mximo de 4 KB por cookie
Tecnologa J2EE 99

Obtener los cookies de una peticin

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

100

Plantilla de Procesamiento de Cookies en una Peticin HTTP


.... // suponiendo que req representa la peticin HTTP Cookie[] galletas = req.getCookies(); int largo = galletas.length; for (int i=0; i<largo; i++) { Cookie galleta = galletas[i]; Obtener nombre del parmetro con galleta.getName() ; Obtener valor del parmetro con galleta.getValue() ; Hacer algo con el parmetro } ....

Ejemplo Simple de Cookies

Se usar un formulario que enva parmetros con nombres:


usuario password

Ambos parmetros se empaquetan en dos cookies y se retornan al browser Prximos servlets visitados podrn comprobar validez de ambos valores sin requerirlos nuevamente del usuario
Tecnologa J2EE 102

Ral Monge, 2004

Tecnologa J2EE

101

Ral Monge, 2004

Ral Monge, 2004

17

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo en el Browser

Enviando Cookies al Cliente


void enviarPagina2(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Cookie c1 = new Cookie("usuario", usuario); Cookie c2 = new Cookie("password", password); resp.addCookie(c1); resp.addCookie(c2); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println(StringUtil.generarCabeceraHTML("Prueba de Cookies (2/3)")); out.println("<BODY>"); out.println("<CENTER>"); out.println("<H1>Prueba de Cookies</H1><BR>"); out.println("Usted ha recibido dos cookies!! <BR><BR>"); out.println("Por favor presione el boton para enviar estos cookies al servlet."); out.println("<BR><BR>"); out.println("<FORM METHOD=POST>"); out.println("<INPUT TYPE=SUBMIT VALUE=\"Enviar cookies\">"); // ... etc.

Ral Monge, 2004

Tecnologa J2EE

103

Ral Monge, 2004

Tecnologa J2EE

104

Recuperando Cookies en el servlet

Evaluacin de Cookies

Ventajas:

out.println("<BR><BR><H2>Y aqui estan las galletas.</H2>"); Cookie[] galletas = req.getCookies() ; int largo = galletas.length; for (int i=0; i<largo; i++) { Cookie galleta = galletas[i]; out.println("<B>Nombre del Cookie:</B> " + galleta.getName() + "<BR>"); out.println("<B>Valor del Cookie:</B> " + galleta.getValue() + "<BR>"); }

No son directamente visibles por el usuario (como reescritura de URL o Campo Oculto) No requieren uso de formularios para su uso (como campos ocultos) El usuario puede decidir no aceptar cookies Algunos browser no los soportan (son los menos)
Tecnologa J2EE 106

Desventajas:

Ral Monge, 2004

Tecnologa J2EE

105

Ral Monge, 2004

Redireccin con Cookies

Ejemplo
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String usuario = req.getParameter("usuario"); String password = req.getParameter("password"); if (login(usuario, password)) { //enviar cookies al browser del usuario Cookie c1 = new Cookie("usuario", usuario); Cookie c2 = new Cookie("password", password); resp.addCookie(c1); resp.addCookie(c2); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); //resp.sendRedirect no funciona aqui. Usar un Meta tag para redireccionar out.println("<META HTTP-EQUIV=Refresh CONTENT=0;URL=ContenidoServlet>"); } else { enviarFormularioLogin(resp, true); // etc.
107 Ral Monge, 2004 Tecnologa J2EE 108

Cuando se redirecciona una respuesta, los cookies no son pasados a ese servidor

no usar aqu resp.sendRedirect(URL)


<META HTTP-EQUIV=Refresh CONTENT=0;URL=otroServlet>

Como alternativa se usa:

Etiqueta META indica al browser que debe obtener otro recurso


URL indica desde dnde CONTENT indica segundos que debe esperar

Ral Monge, 2004

Tecnologa J2EE

Ral Monge, 2004

18

CURSO: Tecnologa J2EE (1 Parte)

Cookies Persistentes

Recepcin de Formulario de Login


public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String usuario = req.getParameter("usuario"); String password = req.getParameter("password"); if (login(usuario, password)) { //enviar cookie al browser Cookie c1 = new Cookie("usuario", usuario); Cookie c2 = new Cookie("password", password); c1.setMaxAge(10000); resp.addCookie(c1); resp.addCookie(c2); resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); out.println("<META HTTP-EQUIV=Refresh CONTENT=0;URL=ContenidoServlet1>"); } else enviarFormularioLogin(resp, true); }

Los cookies en ejemplos anteriores duran mientras el browser est abierto Es posible extender tiempo de vida del cookie ms all usando el mtodo:

setMaxAge(int segundos)

Si usuario no renueva los cookies o sale del browser, stos se eliminan transcurrido ese tiempo
Tecnologa J2EE 109

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

110

Objetos de Sesin

API en HttpServletRequest

La clase HttpSession permite identificar a cada usuario a travs de una clave de sesin Se almacena en el contenedor Web durante un tiempo (ms all de una conexin) Permite asociar una clave con un objeto de la aplicacin Estos objetos pueden ser recuperados por otros servlets del contexto de una aplicacin Se usa un cookie o una URL reescrita para pasar la clave, pero es trasparente
Tecnologa J2EE 111

HttpSession getSession()

Obtiene objeto de sesin asociado a la peticin, sino existe lo crea Obtiene objeto de sesin asociado a la peticin Si objeto no existe

HttpSession getSession(boolean crear)


lo crea si booleana crear es true retornando nuevo objeto Si crear == false retorna null

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

112

API de interfaz HttpSession (1/2)

API de interfaz HttpSession (2/2)

String getId()

long getCreationTime()

Object getAttribute(String nombre)

retorna identificador de sesin (nmero nico) Retorna objeto asociado a nombre

long getLastAccessedTime()

Retorna tiempo de creacin (ms desde 1/1/70) Retorna tiempo de ltimo acceso (ms de 1/1/70) Retorna tiempo en que caduca sesion por inactividad Define tiempo de caducidad por inactividad Fuerza la eliminacin de una sesin (caduca)
Tecnologa J2EE 114

Enumeration getAttributeNames()

int getMaxInactiveInterval()

void setAttribute(String nom, Object obj)

Retorna lista de nombres en la sesin

void removeAttribute(String nom)

Define un valor (obj) a un nombre de atributo

void setMaxInactiveInterval(int seg)

Elimina valor asociado al atributo nom


Tecnologa J2EE 113

void invalidate()

Ral Monge, 2004

Ral Monge, 2004

Ral Monge, 2004

19

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo: Informacin de Sesin

Ejemplo: Objeto de Sesin


public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession sesion = req.getSession(true); String titular; Integer contador = (Integer) sesion.getAttribute("contador"); if (contador == null) { contador = new Integer(0); titular = "Bienvenido por Primera vez!!"; } else { titular = "Bienvenido nuevamente!!"; contador = new Integer(contador.intValue() + 1); } sesion.setAttribute("contador", contador); // ... etc.

Ral Monge, 2004

Tecnologa J2EE

115

Ral Monge, 2004

Tecnologa J2EE

116

Ejemplo: Carro de Compra


public class OrdenCompraServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession sesion = req.getSession(true); synchronized(sesion) { CarroCompra carro = (CarroCompra) sesion.getAttribute("carroCompra"); // Un nuevo visitante recibe un carro nuevo, sino usa el existente if (carro == null) { carro = new CarroCompra(); sesion.setAttribute("carroCompra", carro); } String itemID = req.getParameter("itemID"); // obtiene cdigo del item desde formulario if (itemID != null) { String numItemsString = req.getParameter("numItems"); // obtiene cantidad // procesar parmetros y agregar item en carro de compra } } // Mostrar estado de la orden de compra }
Ral Monge, 2004 Tecnologa J2EE 117

Qu Tcnica usar?

Objetos de sesin es la ms simple


Existen dificultades si browser no soporta cookies Se mantiene informacin del cliente en el servidor Permite dejar informacin persistente en el cliente Es sin embargo ideal para dividir formularios Cuando el browser no habilita cookies
Tecnologa J2EE 118

Cookies es algo ms difcil, pero:

Campos ocultos no es de uso frecuente

Reescritura de URL se usa en algunos casos

Ral Monge, 2004

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Motivacin

4.1 Conceptos Bsicos de JSP

Tecnologa de pginas JSP facilita la programacin de pginas HTML dinmicas respecto a Servlets

Se evita esfuerzo de programacin de escribir en stream de respuesta cdigo HTML Se evita intervenir el cdigo de un servlets por cada cambio

JSP es una extensin a Servlets, no un reemplazo

Comprensin de servlets es fundamental para programar bien pginas JSP


Tecnologa J2EE 120

Ral Monge, 2004

Ral Monge, 2004

20

CURSO: Tecnologa J2EE (1 Parte)

Proceso de Desarrollo

Ejemplo Simple
saludo.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE>Saludos</TITLE> </HEAD> <BODY> <H2>Saludos</H2> <% if (Math.random() < 0.7) { %> Que pase un <B>muy bonito</B> dia! <% } else { %> Que tenga un <B>mal</B> dia! <% } %> </BODY> </HTML>
Ral Monge, 2004 Tecnologa J2EE 122

Diseadores de pginas Web escriben una plantilla esttica de cdigo HTML, dejando espacio para incrustar contenidos dinmicos Programador, para agregar contenido dinmico, aade cdigo Java en la plantilla anterior Contenedor Web Servlet/JSP reconoce automticamente la pgina y la traduce a un Servlet que carga y ejecuta
Tecnologa J2EE 121

Ral Monge, 2004

Cmo Funciona JSP?

Otro Ejemplo
<HTML> <HEAD><TITLE>Desplegando el tiempo del servidor</TITLE></HEAD> <BODY> <H1>Bienvenido!</H1><BR> El tiempo del servidor es <B> <% java.util.Calendar tiempo = java.util.Calendar.getInstance(); int hora = tiempo.get(java.util.Calendar.HOUR_OF_DAY); int minutos = tiempo.get(java.util.Calendar.MINUTE); if (hora<10) out.println("0" + hora); else out.println(hora); out.println(":"); if (minutos<10) out.println("0" + minutos); else out.println(minutos); %> <B> </BODY></HTML>
Ral Monge, 2004 Tecnologa J2EE 124

Dentro del contenedor existe servlet especial denominado compilador de pginas (page compiler) El contenedor pasa una peticin con URL terminada en .jsp a este servlet La primera vez que se llama la pgina, sta se analiza y compila en una clase servlet

En llamadas siguientes slo se verifica si la pginas ha sido actualizada

Si proceso es exitoso, nuevo servlet se carga en memoria

Si es el caso se repite el proceso de anlisis y compilacin del punto anterior


Tecnologa J2EE

Ral Monge, 2004

123

API de Paquete

javax.servlet.jsp
Interfaces

Objetos Implcitos

Excepciones

JspPage HttpJspPage JspEngineInfo JspFactory JspWriter PageContext

JspException JspError

Clases

request response out session application config pageContext page exception

javax.servlet.http.HttpServletRequest javax.servlet.http.HttpServletResponse javax.servlet.jsp.JspWriter javax.servlet.http.HttpSession javax.servlet.ServletContext javax.servlet.ServletConfig javax.servlet.jsp.PageContext javax.servlet.jsp.HttpJspPage java.lang.Throwable


126

Ral Monge, 2004

Tecnologa J2EE

125

Ral Monge, 2004

Tecnologa J2EE

Ral Monge, 2004

21

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo de Objetos Implcitos


cont = Integer.parseInt(contador); } catch (Exception e) { } <BODY> cont++; <% session.setAttribute("contador", Integer.toString(cont)); String contador = out.println("Esta es la visita nmero " + (String) session.getAttribute("contador"); cont + " en esta sesin"); int cont = 0; %> if (contador == null) { %> </BODY> <H1>Bienvenido por primera vez!</H1> </HTML> <% }else { %> <H1>Bienvenido nuevamente!</H1> Objetos implcitos <% }
Ral Monge, 2004 Tecnologa J2EE 127

Ejemplo
Pgina JSP

<HTML> <HEAD><TITLE>Contador</TITLE> </HEAD>

try {

Ral Monge, 2004

Tecnologa J2EE

128

Otro Ejemplo
<% String usuario = request.getParameter(usuario); out.println(Nombre: + usuario); String password = request.getParameter(password); ... %> .... <% response.sendRedirect(http://miSitio/jsp/pagina.jsp); %>
Ral Monge, 2004 Tecnologa J2EE 129

Estructura del Lenguaje JSP

Pgina JSP se compone de:

Elementos o etiquetas JSP (JSP tags)

Corresponde a cdigo Java Correponde a cdigo HTML

Datos de Plantilla (template data)

Tipos de elementos:

Directivas Scripting Acciones


Tecnologa J2EE 130

Ral Monge, 2004

Resumen de Elementos Sintcticos de JSP


Directivas Pginas Inclusin Biblioteca de Etiquetas Scriplets Declaraciones Expresiones jsp:useBean jsp:setProperty jsp:getProperty jsp:param etc.
131

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

4.4 Directivas
Directivas Etiquetas JSP Scripting

Etiquetas JSP

Scripting

Acciones

Acciones

Ral Monge, 2004

Tecnologa J2EE

Ral Monge, 2004

22

CURSO: Tecnologa J2EE (1 Parte)

Directivas

a) Directivas de Pgina

Informacin para que contenedor JSP sepa cmo traducir la pgina en un servlet Existen tres tipos de directivas:

Sintaxis:

<%@ page atributo1= "valor1" atributo2= "valor2" ... %>

Directiva de pgina Directiva de inclusin Directiva de biblioteca de etiquetas (tag library) <%@ directiva (atributo= "valor")* %>
Se repite 0 o ms veces

Se soportan 11 atributos:
autoFlush session isThreadSafe errorPage isErrorPage

Sintaxis:

language info contentType extends import buffer


133 Ral Monge, 2004 Tecnologa J2EE

Ral Monge, 2004

Tecnologa J2EE

134

Directivas de Pgina (1/3)


ATRIBUTO
language info contentType extends

Directivas de Pgina (2/3)


ATRIBUTO
import buffer autoFlush session

TIPO DE VALOR
Lenguaje de Scripting String MIME type, character set Nombre de clase

VALOR POR OMISIN


java Depende del tipo de contenedor text/html;charser=ISO8859-1 Ninguno

TIPO DE VALOR

VALOR POR OMISIN

Nombre completo Ninguno de clase o paquete Tamao del buffer o false Boolean Boolean 8192 true true

Ral Monge, 2004

Tecnologa J2EE

135

Ral Monge, 2004

Tecnologa J2EE

136

Directivas de Pgina (3/3)


ATRIBUTO
isThreadSafe errorPage isErrorPage

Observacin

TIPO DE VALOR
Boolean URL Boolean

VALOR POR OMISIN


true Ninguno false

Cada atributo debe aparecer mximo una vez, excepto import


No vlido
138

Ejemplos:
<%@ page buffer=16384 info=Pagina de Ejemplo buffer=8192 %> <%@ page import=java.io.* %> <%@ page import=java.util.Enumeration %> <%@ page import=java.io.*, java.util.Enumeration %>
Ral Monge, 2004 Tecnologa J2EE 137 Ral Monge, 2004 Tecnologa J2EE

Ral Monge, 2004

vlido

23

CURSO: Tecnologa J2EE (1 Parte)

Directiva de Pgina: Algunos Atributos (1/4)

Directiva de Pgina: Algunos Atributos (2/4)

Atributo info

Permite definir la informacin en el mtodo getServletInfo() Permite definir clase padre de la que se extiende el servlet generado (su uso debe ser hecho con mucho cuidado) Por omisin se vaca el buffer cuando se llena Si se define false debe usarse out.flush() para vaciarlo
Tecnologa J2EE 139

Atributo import

Atributo extends

Atributo autoFlush

Permite importar una clase, interfaz o todos los miembros de un paquete Tomcat por omisin asume que se importa lo siguiente: javax.servlet.* javax.servlet.http.* javax.servlet.jsp.* javax.servlet.jsp.tagext.* org.apache.jasper.runtime.*
Tecnologa J2EE 140

Ral Monge, 2004

Ral Monge, 2004

Directiva de Pgina: Algunos Atributos (3/4)

Directiva de Pgina: Algunos Atributos (4/4)

Atributo session

Por omisin una pgina participa de la gestin de sesiones Si no se requiere se recomienda deshabilitarlo para ahorrar recursos (objeto session no queda accesible) true le dice al compilador que acceso concurrente a la pgina es seguro, i.e. no requiere exclusin mutua (valor por omisin) Si se define false es equivalente a usar interfaz SingleThreadModel, que garantiza exclusin mutua
Tecnologa J2EE 141

Atributo errorPage

Atributo isThreadSafe

Especifica la URL de la pgina de error, que se desplegar cuando una excepcin no sea capturada Pgina referenciada debe tener habilitado el siguiente atributo Por omisin se supone que una pgina no es de error; pginas de error deben definir true Una pgina de error tiene acceso al objeto implcito exception
Tecnologa J2EE 142

Atributo isErrorPage

Ral Monge, 2004

Ral Monge, 2004

b) Directiva de Inclusin

Ejemplo de Inclusin
inclusion.jsp
<%@ page session="false" %> <%@ page import="java.util.Calendar" %> <%@ include file="includes/cabecera.html" %> <% out.println("Hora actual es : " + Calendar.getInstance().getTime()); %> <%@ include file="includes/cola.html" %> <HTML> <HEAD> <TITLE>Bienvenido</TITLE>
</HEAD>

Segundo tipo de directiva JSP Permite incluir contenidos de otros archivos en la actual pgina JSP til para mantener cdigo comn para varias pginas JSP Se permite inclusin anidada Sintaxis:

<%@ include file=URLrelativa %>


Tecnologa J2EE 143

</BODY> </HTML>

<BODY>
Ral Monge, 2004 Ral Monge, 2004 Tecnologa J2EE 144

Ral Monge, 2004

24

CURSO: Tecnologa J2EE (1 Parte)

c) Directiva de Biblioteca de Etiquetas

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Permite definir biblioteca de origen de etiquetas definidas por el usuario (tag lib) El tema se estudiar en detalle ms adelante en el captulo

4.5 Elementos de Scripting


Directivas Etiquetas JSP Scripting

Acciones
Ral Monge, 2004 Tecnologa J2EE 145

Elementos de Scripting
Directivas Pginas Inclusin Biblioteca de Etiquetas Scriplets Declaraciones Expresiones jsp:useBean jsp:setProperty jsp:getProperty jsp:param etc.
147

a) Scriptlets

Etiquetas JSP

Scripting

Corresponden a bloques de cdigo en una pgina JSP Comienzan con etiqueta <% y terminan con etiqueta %>, pero a diferencia de las directivas no llevan @

Acciones

Ral Monge, 2004

Tecnologa J2EE

Ral Monge, 2004

Tecnologa J2EE

148

Ejemplo de Scriptlet (1/2)


<%@ include file="includes/cabecera.html" %> <CENTER><H2>Listando Todos los Usuarios</H2> <TABLE> <TR><TH>Nombre</TH><TH>Apellido</TH><TH>Usuario</TH><TH>Password</TH></TR> <% String sql = "SELECT Nombre, Apellido, Usuario, Password FROM Usuarios"; try { Connection con = DriverManager.getConnection( "jdbc:db2j:/BASE_DATOS/BD_PRUEBA;create=true", "", ""); Statement s = con.createStatement(); ResultSet rs = s.executeQuery(sql); // en la prxima pgina sigue el while

Ejemplo de Scriptlet (2/2)


while (rs.next()) { %> <TR> <TD> <% out.print(rs.getString(1)); %> </TD> <TD> <% out.print(rs.getString(2)); %> </TD> <TD> <% out.print(rs.getString(3)); %> </TD> <TD> <% out.print(rs.getString(4)); %> </TD> </TR> <% } rs.close(); s.close(); con.close(); } catch (SQLException e) { System.out.println(e.toString()); } catch (Exception e) { System.out.println(e.toString()); } %> </TABLE> </CENTER> <%@ include file="includes/cola.html" %>
149 Ral Monge, 2004 Tecnologa J2EE 150

Ral Monge, 2004

Tecnologa J2EE

Ral Monge, 2004

25

CURSO: Tecnologa J2EE (1 Parte)

b) Declaraciones

Ejemplo de Declaraciones
<%! String obtenerTiempoSistema() { return Calendar.getInstance().getTime().toString(); } %> <%@ page import="java.util.Calendar" %> <%@ page session="false" %> <%@ include file="includes/cabecera.html" %> <B>Tiempo actual es</B> : <% out.println(obtenerTiempoSistema()); out.println("&nbsp;&nbsp;(Esta es la consulta N " + ++i + ")"); %> <%! int i=0; %> <%@ include file="includes/cola.html" %>
Ral Monge, 2004 Tecnologa J2EE 152

Permiten declarar mtodos y variables para la pgina JSP Se pueden usar para redefinir mtodos jspInit() y jspDestroy() Una declaracin comienza con <%! y termina con %> Pueden aparecer en cualquier parte de la pgina
Tecnologa J2EE 151

Ral Monge, 2004

Ejemplo Anterior

c) Expresiones

Las expresiones se evalan cuando se llama una pgina y se escriben implcitamente al objeto (mplicito) out para generar la respuesta Sintaxis:

<%= expresion %>

Ral Monge, 2004

Tecnologa J2EE

153

Ral Monge, 2004

Tecnologa J2EE

154

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Ejemplo de Expresiones
<TR> <TD><%= codificarEtiquetaHTML(rs.getString(1)) %></TD> <TD><%= codificarEtiquetaHTML(rs.getString(2)) %></TD> <TD><%= codificarEtiquetaHTML(rs.getString(3)) %></TD> <TD><%= codificarEtiquetaHTML(rs.getString(4)) %></TD> </TR>

4.6 Elementos de Acciones Estndares


Directivas Etiquetas JSP Scripting

Equivale a:
<TR> <TD><% out.print(codificarEtiquetaHTML(rs.getString(1))); %></TD> <TD><% out.print(codificarEtiquetaHTML(rs.getString(2))); %></TD> <TD><% out.print(codificarEtiquetaHTML(rs.getString(3))); %></TD> <TD><% out.print(codificarEtiquetaHTML(rs.getString(4))); %></TD> </TR>
Ral Monge, 2004 Tecnologa J2EE 155

Acciones

Ral Monge, 2004

26

CURSO: Tecnologa J2EE (1 Parte)

Elementos de Accin

Elementos de Acciones Estndares


Elementos Generales: jsp:include jsp:forward jsp:plugin jsp:param jsp:params jsp:fallback
Ral Monge, 2004 Tecnologa J2EE

Corresponde a etiquetas que se incrustan en la pgina En tiempo de compilacin se reemplazan por cdigo Java, que corresponde a la tarea correspondiente

Especficos para JavaBeans: jsp:useBean jsp:setProperty jsp:getProperty

Ral Monge, 2004

Tecnologa J2EE

157

158

jsp:include

jsp:forward

Permite incluir recursos estticos o dinmicos en la pgina actual Similar a directiva include, pero ms potente dado que permite pasar parmetros Sintaxis (2 formas):

Permite transferir el control desde la pgina actual a otro recurso (esttico o dinmico) Sintaxis (2 formas):

<jsp:forward page=URLrelativa /> < jsp:forward page=URLrelativa > (<jsp:param name=Param value=Valor /> )* </jsp:forward>

<jsp:include page=URLrelativa flush=true /> <jsp:include page=URLrelativa flush=true > (<jsp:param name=Param value=Valor /> )* </jsp:include> flush=true es obligatorio en JSP 1.2
Tecnologa J2EE 159

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

160

jsp:plugin

Ejemplo de jsp:plugin
<jsp:plugin type="applet" code="AppletPost.class codebase="/jsp/Post width="550" height="650"> </jsp:plugin> <object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" width="550" height="650" codebase= "http://java.sun.com/products/plugin/1.2.2/jinstall-1_2_2-win.cab#Version=1,2,2,0"> <param name="java_code" value="AppletPost.class"> <param name="java_codebase" value="/jsp/Post"> <param name="type" value="application/x-java-applet;"> <COMMENT> <embed type="application/x-java-applet;" width="550" height="650 pluginspage="http://java.sun.com/products/plugin/ java_code="AppletPost.class java_codebase="/jsp/Post" > <noembed> </COMMENT> </noembed></embed> </object>
Ral Monge, 2004 Tecnologa J2EE 162

Sirve para generar etiquetas HTML del tipo <OBJECT> y <EMBED> Aplicacin tpica es para incrustar Applets Algunos atributos:

type: Para applet se usa applet code: Cdigo del objeto codebase: Directorio del cdigo width: ancho height: alto name: Nombre para comunicacin entre Applets
Tecnologa J2EE 161

Ral Monge, 2004

Ral Monge, 2004

27

CURSO: Tecnologa J2EE (1 Parte)

jsp:params y jsp:param

jsp:fallback

Se usan slo dentro de jsp:plugin En applets se usan para pasar prametros de inicializacin Ejemplo:
<jsp:plugin type="applet code="AppletPost.class codebase="/jsp/Post width="550" height="650"> <jsp:params> <jsp:param name=Param1 value=Valor1 /> ... </jsp:params> </jsp:plugin>

Se usa slo dentro de jsp:plugin, que permite especificar texto alternativo para el browser en caso de no soportar el plugin Ejemplo:
<jsp:plugin type="applet code="AppletPost.class codebase="/jsp/Post width="550" height="650"> <jsp:fallback> <B>ERROR: Este ejemplo requiere soporte de Java</B> </jsp:fallback> </jsp:plugin>

Ral Monge, 2004

Tecnologa J2EE

163

Ral Monge, 2004

Tecnologa J2EE

164

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Resumen

Las pginas JSP definen un lenguaje de Scripting que permite escribir ms rpido servlets Su uso es adecuado cuando la lgica del contenido dinmico no es demasiado complicado

4.7 Uso de JavaBeans en JSP

Existen otros elementos JSP que nos facilitarn la codificacin de pginas JSP
Tecnologa J2EE 165

Ral Monge, 2004

JavaBeans

Clases Bean

Son clases Java que siguen un formato determinado para crear y manipular objetos Permite que un programa (e.g. Herramienta IDE) descubra informacin acerca de la clase En JSP, JavaBeans ayudan a separar lgica de negocios del diseo de pgina Web
Tecnologa J2EE 167

Debe tener un constructor nulo (si no se define constructor se crea automticamente) No debe tener campos miembros pblicos Valores persistentes se deben acceder a travs de mtodos:

public TipoPropiedad getXxx() public void setXxx(TipoPropiedad valor) public boolean isYyy() public void setXxx(boolean valor)
Tecnologa J2EE 168

Ral Monge, 2004

Ral Monge, 2004

Ral Monge, 2004

28

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo de JavaBean
package beans;

Instalacin de JavaBeans para su uso por Pginas JSP


JavaBean CalculadoraBean

Valor de propiedad memoria

public class CalculadoraBean { private int memoria; public void setMemoria(int numero) { memoria = numero; } public int getMemoria() { return memoria; } public int mult(int num1, int num2) { return num1 * num2; } }

Definir propiedad memoria Obtener propiedad memoria

Paquete donde se encuentran los JavaBeans

Ral Monge, 2004

Tecnologa J2EE

169

Ral Monge, 2004

Tecnologa J2EE

170

Uso del JavaBean en JSP


<jsp:useBean id="miBean" class="beans.CalculadoraBean"/> <%@ include file="includes/cabecera.html" %> <% int i = 4; int j = 7; int k = miBean.mult(i, j); out.print("4*7=" + k); %> <%@ include file="includes/cola.html" %> <jsp:useBean id="miBean" class="beans.CalculadoraBean"/> <%@ include file="includes/cabecera.html" %> <% int i = 2; %> <jsp:setProperty name="miBean" property="memoria" value=<%=100*i %>"/> El valor de la memoria es <jsp:getProperty name="miBean" property="memoria"/> <%@ include file="includes/cola.html" %>

Elementos de Accin de JavaBeans

<jsp:useBean (atributo=valor)+ />

Permite usar un bean con 1 ms atributos (debe estar al menos el atributo de class o de type)

<jsp:useBean (atributo=valor)+ > </jsp:useBean>

cdigo de inicializacin

Igual que el anterior, pero agregando cdigo de inicializacin


Tecnologa J2EE 172

Ral Monge, 2004

Tecnologa J2EE

171

Ral Monge, 2004

Atributos de Uso de JavaBeans

mbitos de Acceso (scope)

id

page

Define identificador nico para el bean Valor se usa como cualquier variable Normalmente se usa class para especificar implementacin del bean Define el mbito de visibilidad del bean Por omisin el acceso es slo de la pgina
Tecnologa J2EE 173

Acceso slo desde pgina actual Se extiende el acceso a la peticin mediante directivas include y forward Se permite acceso mientras exista objeto de sesin (extiende el acceso a otras pginas) Acceso se extiende a todas las pginas de la aplicacin (mientras funcione contenedor JSP)
Tecnologa J2EE 174

request

class o type

session

scope

application

Ral Monge, 2004

Ral Monge, 2004

Ral Monge, 2004

29

CURSO: Tecnologa J2EE (1 Parte)

JB: Obtencin de Propiedades

JB: Definicin de Propiedades

<jsp:getProperty name=nombreBean property=nombreProp />

<jsp:setProperty name=nombreBean property=nombreProp value=valor />


Se obtiene valor de la propiedad (como string) de bean nombreBean Debe existir en el bean mtodo de acceso con nombre getNombreProp Valor retornado se imprime automticamente en stream out
EQUIVALE A: <%= miBean.getMemoria() %>

Se asigna el valor a la propiedad nombreProp Debe estar definido el mtodo setNombreProp

Ejemplo:

EQUIVALE A: <% miBean.setMemoria(5); %>

Ejemplo:

El valor de la memoria es <jsp:getProperty name="miBean" property="memoria"/>


Ral Monge, 2004 Tecnologa J2EE 175

<jsp:setProperty name="miBean" property="memoria" value=5"/> El valor de la memoria es <jsp:getProperty name="miBean" property="memoria"/>

Ral Monge, 2004

Tecnologa J2EE

176

Definicin de Propiedades desde Peticin

Ejemplos de Definicin desde Peticin


<jsp:setProperty name="miBean" property="memoria" param="memoria"/> El valor de la memoria es <jsp:getProperty name="miBean" property="memoria"/>

<jsp:setProperty name=nombreBean property=nombreProp param=nombreParametro />

Se define parmetro de peticin como valor de propiedad

<jsp:setProperty name=nombreBean property=nombreProp />

Se define slo si parmetro de peticin y bean son iguales

<jsp:setProperty name=nombreBean property=* />

Se definen todos los parmetros que existan simultneamente en la peticin y el bean

<jsp:setProperty name="miBean" property="usuario"/> <jsp:setProperty name="miBean" property="password"/> <jsp:setProperty name="miBean" property="conexionUrl" value="jdbc:db2j:/BASE_DATOS/BD_PRUEBA;create=true"/> <jsp:setProperty name="miBean" property="sql"/>

Ral Monge, 2004

Tecnologa J2EE

177

Ral Monge, 2004

Tecnologa J2EE

178

Inicializacin de JavaBean
<jsp:useBean id="miBean" class="beans.HerramientaSqlBean"> <% try { Class.forName("com.ibm.db2j.jdbc.DB2jDriver"); } catch (Exception e) { out.println(e.toString()); } %> </jsp:useBean>

Creacin Condicional de Bean

El elemento de uso del Bean (useBean) permite crear un bean, dependiendo del mbito Si el identificador no existe en el mbito, se crea el objeto y se ejecuta la inicializacin Si el identificador existe, entonces ste se liga al objeto, sin inicializarlo!
Tecnologa J2EE 180

Ral Monge, 2004

Tecnologa J2EE

179

Ral Monge, 2004

Ral Monge, 2004

30

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo de Creacin Condicional (1/2)


Identificador del objeto

Ejemplo de Creacin Condicional (2/2)


package beans; public class ContadorAccesoBean { private String primeraPagina; private int contadorAcceso = 1; public String getPrimeraPagina() { return(primeraPagina); } public void setPrimeraPagina(String primeraPagina) { this.primeraPagina = primeraPagina; }

<jsp:useBean id="contador" class="beans.ContadorAccesoBean" scope="application"> <jsp:setProperty name="contador" property="primeraPagina" value="ContadorCompartido1.jsp" /> </jsp:useBean> <-- etc.... -->

mbito de Aplicacin

Slo lo ejecuta pgina creadora


}

public int getCuentaAcceso() { return(contadorAcceso++); }

Ral Monge, 2004

Tecnologa J2EE

181

Ral Monge, 2004

Tecnologa J2EE

182

CURSO DE TECNOLOGA J2EE Dr.-Ing. Ral Monge

Motivacin
4.8 Etiquetas Personales (Custom Tags)

JavaBeans permiten separar parte de la presentacin de las reglas del negocio Sin embargo slo se permite tres tipos de acciones:

jsp:useBean, jsp:getProperty y jsp:setProperty

Esto obliga muchas veces a escribir cdigo Java en la pgina JSP No es, en general, buena prctica que un JavaBean entregue cdigo HTML (limita reusablidad)
Tecnologa J2EE 184

Ral Monge, 2004

Etiquetas Personales

Creando una Etiqueta: (1/3)


Clase Manejadora de Etiqueta

Usuario puede definir nuevas etiquetas que realicen acciones especficas (puede encapsular comportamiento complejo) Ventajas:

package tags;

miEtiquetaPersonal.java

Acceso a todos los objetos de la pgina Se pueden personalizar usando atributos Operaciones complejas se reducen a una simple etiqueta Requiere ms esfuerzo su desarrollo

import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class miEtiquetaPersonal extends TagSupport { public int doEndTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.println("Hola desde la etiqueta personal de RMA."); } catch (Exception e) { } return super.doEndTag(); } }

Desventajas:

Ral Monge, 2004

Tecnologa J2EE

185

Ral Monge, 2004

Tecnologa J2EE

186

Ral Monge, 2004

31

CURSO: Tecnologa J2EE (1 Parte)

Creando una Etiqueta: (2/3)


Archivo TLD: Tag Library Descriptor (Tomcat 4.04)
<?xml version="1.0" encoding="ISO-8859-1" ?> taglib.tld <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name></short-name> <tag> <name>miEtiqueta</name> <tag-class>tags.miEtiquetaPersonal</tag-class> </tag> </taglib>

Descriptor de Biblioteca de Etiquetas

Creando una Etiqueta: (3/3)


Archivo JSP
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="facil"%> <%@ include file="includes/cabecera.html" %> <H2><facil:miEtiqueta/></H2> <%@ include file="includes/cola.html" %>

etiquetaSimple.jsp

Ral Monge, 2004

Tecnologa J2EE

187

Ral Monge, 2004

Tecnologa J2EE

188

Descriptor de Biblioteca y Descriptor de Despliegue


<?xml version="1.0" encoding="ISO-8859-1"?> web.xml <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <display-name>Ejemplos de Paginas JSP</display-name> <taglib> <taglib-uri>/Etiquetas</taglib-uri> <taglib-location>/WEB-INF/taglib.tld</taglib-location> </taglib> </web-app> <%@ taglib uri="/Etiquetas" prefix="facil"%> <%@ include file="includes/cabecera.html" %> <H2><facil:miEtiqueta/></H2> <%@ include file="includes/cola.html" %>
Ral Monge, 2004 Tecnologa J2EE 189

Elemento de Etiqueta en Descriptor de Biblioteca de Etiquetas

name

Identificador de la etiqueta (obligatorio) Clase del manejador de la etiqueta (obligatorio) Tipo de contenido si existe (i.e. empty, JSP, tagdependent) Informacin sobre el descriptor Cero o ms atributos que a su vez contienen subelementos

tagclass (tag-class)

bodycontent

info (description)

etiquetaSimple.jsp

attribute

Ral Monge, 2004

Tecnologa J2EE

190

Directiva taglib

Etiquetas Personales

Antes de usar una etiqueta personal se debe declarar la biblioteca con una directiva Sintaxis:

<prefijo:NombreEtiqueta/>

Forma ms simple

<prefijo:NombreEtiqueta> </prefijo:NombreEtiqueta>

<%@ taglib uri=biblioteca prefix=nombre %> Atributo uri

cuerpo

Especifica URI que identifica nicamente TLD asociado al prefijo Define un nombre de prefijo para asociar etiquetas personales a una determinada biblioteca

Permite definir un cuerpo de contenido

Atributo prefix

<prefijo:NombreEtiqueta (nombreAtributo=Valor)* />

Permite definir atributos que se pasan al manejador de la etiqueta

Ral Monge, 2004

Tecnologa J2EE

191

Ral Monge, 2004

Tecnologa J2EE

192

Ral Monge, 2004

32

CURSO: Tecnologa J2EE (1 Parte)

Ejemplo de Etiqueta con Atributos (1/2)


<%@ taglib uri="/misEtiquetas" prefix="num"%> <%@ include file="includes/cabecera.html" %> <H2>Muestra Nmeros Primos con Largo definido por Atributo</H2> <UL> <LI><B>Primo 20 digitos</B>: <num:primoAtributo largo="20"/> <LI><B>Primo 40 digitos</B>: <num:primoAtributo largo="40"/> <LI><B>Primo 80 digitos</B>: <num:primoAtributo largo="80"/> </UL> <%@ include file="includes/cola.html" %>

Ejemplo de Etiqueta con Atributos (2/2)

Atributo
Ral Monge, 2004 Tecnologa J2EE 193 Ral Monge, 2004 Tecnologa J2EE 194

Ejemplo de Etiqueta con Contenido


<%@ taglib uri="/misEtiquetas" prefix="tit"%> <HTML><HEAD></HEAD> <BODY BGCOLOR="#FDF5E6"> <tit:titulo bgColor="#990000" rowColor="#cc0000" fontList="Times" fontColor="#ffffff" fontSize="32"> <B>Curso de Servlet y JSP</B> </tit:titulo> <BR>Esta es una prueba de etiqueta con cuerpo!<BR> <%@ include file="includes/cola.html" %>

API de Etiquetas Personales

Un manejador de Etiqueta es invocado cada vez que el contenedor JSP encuentra un tag personal Debe implementar una interfaz o extender una clase en paquete:

Cuerpo de La etiqueta

javax.servlet.jsp.tagext Tag y BodyTag


Tecnologa J2EE 196

Interfaces ms importantes son:

Ral Monge, 2004

Tecnologa J2EE

195

Ral Monge, 2004

Mtodos de Interfaz Tag


Ciclo de Vida Inicial de un Manejador de Etiqueta (1/2)

setPageContext setParent doStartTag getParent doEndTag release

Contenedor obtiene referencia a una instancia del manejador de etiqueta y llama a setPageContext, para definir contexto Contenedor llama a setParent para definir jerarqua de etiquetas (si existe un padre) Define los atributos, si existen, llamando a los mtodos especficos (similar a JavaBeans) Llama a doStartTag para comenzar procesamiento de tag
Tecnologa J2EE 198

Ral Monge, 2004

Tecnologa J2EE

197

Ral Monge, 2004

Ral Monge, 2004

33

CURSO: Tecnologa J2EE (1 Parte)

Ciclo de Vida Inicial de un Manejador de Etiqueta (2/2)

Mtodo doStartTag

Si doStartTag retorna EVAL_BODY_INCLUDE contenedor procesar contenido del cuerpo, sino se salta el cuerpo Si se ha procesado el cuerpo, se llama a doEndTag, que puede retornar no seguir procesando la pgina o continuar Finalmente se llama a release, donde se puede escribir cdigo de limpieza.

Sintaxis:

public int doStartTag() SKIP_BODY

Valores de retorno:

El contenedor no procesar el cuerpo El contenedor procesar a continuacin el cuerpo, si existe

EVAL_BODY_INCLUDE

Ral Monge, 2004

Tecnologa J2EE

199

Ral Monge, 2004

Tecnologa J2EE

200

Mtodo doEndTag

Ejemplo Simple de Manejador de Etiqueta


package tags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.io.*; import java.math.*; import Utilitarios.Primos; // ... public class etiquetaPrimoSimple extends TagSupport { protected int largo = 50; public int doStartTag() { try { JspWriter out = pageContext.getOut(); BigInteger primo = Primos.proximoPrimo(Primos.random(largo)); out.print(primo); } catch (IOException ioe) { System.out.println("Error al generar nmero primo: " + ioe); } return(SKIP_BODY); } }

Sintaxis:

public int doEndTag() SKIP_PAGE

Valores de retorno:

El contenedor no procesar el resto de la pgina El contenedor procesar a continuacin el resto de la pgina


Tecnologa J2EE 201

EVAL_PAGE

Ral Monge, 2004

Ral Monge, 2004

Tecnologa J2EE

202

Otro Ejemplo de un Manejador de Etiqueta


package tags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.io.*; import java.math.*; public class etiquetaPrimo extends etiquetaPrimoSimple { public void setLargo(String largo) { try { this.largo = Integer.parseInt(largo); } catch (NumberFormatException nfe) { this.largo = 50; } } }
Ral Monge, 2004 Tecnologa J2EE 203

Paradigma MVC

Implementa un atributo de nombre largo

Coresponde a un patrn de diseo que significa Model-View-Controller El modelo corresponde a lgica de negocio (e.g. EJB) La visin corresponde a la presentacin (e.g. JSP) El controlador se relaciona con el modelo y delega en la visin (e.g. servlet)
Tecnologa J2EE 204

Ral Monge, 2004

Ral Monge, 2004

34

CURSO: Tecnologa J2EE (1 Parte)

Modelo MVC con EJB y Servlets y JSPs


4: Construir y retornar HTML 3: Elegir Presentacin para Respuesta

Ejemplo de Controlador (1/2)


public class CatalogoServlet extends HttpServlet { // ... Campos privados

Principal Login Carro Catlogo Producto Recibo

public void init(ServletConfig config) throws ServletException { /* ... */ } public void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Vector productos=null; try { HttpSession session = request.getSession(false); if (session == null) { response.sendRedirect(response.encodeRedirectURL("/Negocio/login")); return; } Object obj = session.getAttribute("carro"); if (obj == null) { response.sendRedirect(response.encodeRedirectURL("/Negocio/login")); return; } // continua Tecnologa J2EE Ral Monge, 2004

Controladores
1: Peticin HTTP

servlets
2: Objetos de Negocio

Cliente

Capa de Negocios Objetos EJB


Ral Monge, 2004 Tecnologa J2EE

Pginas JSP
205

206

Ejemplo de Controlador (2/2)


Carro carro = (Carro) obj; String otroProductoID = request.getParameter("Comprar"); productos=(Vector) session.getAttribute("productos"); String productoId=(String) request.getParameter("productoId"); if (otroProductoID != null) { try { ItemProducto item=getItemProducto(productos, otroProductoID); carro.agregar(new Item(item, 1, 0)); request.setAttribute("ProductoComprado", item.getNombre()); this.getServletContext().getRequestDispatcher("/catalogo.jsp").forward(request, response); return; } catch (Exception e) { throw new ServletException(e.toString()); } } else if (productoId!=null) { request.setAttribute("itemProducto", getItemProducto(productos, productoId)); this.getServletContext().getRequestDispatcher("/infoProducto.jsp").forward(request, response); return; // etc. } Ral Monge, 2004 Tecnologa J2EE 207

Ejemplo de Pgina JSP (1/2)


<%@ page import="cl.utfsm.inf.ItemProducto" %> <%@ page import="java.util.*" %> <%@ page import="java.text.*" %> <html><head> <title> Pagina de Catalogo del Negocio </title></head> <body bgcolor="#FDF5E6"> <jsp:include page="titulo.jsp" /> <center><h2>Catalogo de Productos Disponibles</h2> <b><A HREF="/Negocio/mostrarCarro">Ver Carro de Compra</A></b></center><hr> <b>Por favor eliga alguna de nuestras selecciones exclusivas de productos!</b><br><br> <table> <tr><th align=left> Producto </th> <th align=left> Precio Base </th> <th align=left> Agregar al Carro</th> </tr> <% session = request.getSession(false); Vector productos=(Vector)session.getAttribute("productos"); int tamao=productos.size(); ItemProducto item=null; for (int i=0; i<tamao;i++){ item=(ItemProducto)productos.elementAt(i); %> Ral Monge, 2004 Tecnologa J2EE 208

Ejemplo de Pgina JSP (2/2)


<tr> <td> <A href="/Negocio/catalogo?productoId=<%=item.getProductoID()%>"> <B><%=item.getNombre()%><B></A> </td> <td><%=NumberFormat.getCurrencyInstance().format(item.getPrecioBase())%> </td> <td> <A HREF="/Negocio/catalogo?Comprar=<%=item.getProductoID()%>">click</A> </td> </tr> <% } // fin del for %> </table> <center><i><a href="/Negocio/wsf.jsp">Retornar a pgina principal.</a></i></center> <jsp:include page="contacto.jsp" /> </body> </html>

Resumen

JavaBeans y Custom Tags permiten esconder cdigo Java dependiente de la lgica de negocios a las pginas JSP Custom Tags son ms poderosos que JavaBeans, pero es ms difcil su desarrollo y despliegue Servlets se combinan con pginas JSP para encapsular mejor lgica de negocios (Modelo MVC)
Tecnologa J2EE 210

Ral Monge, 2004

Tecnologa J2EE

209

Ral Monge, 2004

Ral Monge, 2004

35

You might also like