Professional Documents
Culture Documents
3. Web Tier
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
Desventajas:
La pgina usa informacin de base de datos u otras fuentes al lado del servidor
ASP de Microsoft
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
Cdigo HTML
Cookies
Tecnologa J2EE
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
Tecnologa J2EE
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
Tecnologa J2EE
Tecnologa J2EE
10
Contenedor de Servlets
En principio, todo lo que se puede hacer con JSP se puede con Servlets
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
Tecnologa J2EE
11
Tecnologa J2EE
12
NO
Peticin HTTP
SI
Es el servlet actual?
Browser
Respuesta HTTP
NO
SI
Carga Servlet
Procesa Peticin
14
Es la referencia oficial de servlet 2.1 y JSP 1.0 Permite probar servlets y pginas JSP No soporta recarga automtica de 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
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()
Mtodo de Inicializacin
Servlet se inicializa cuando se llama por primera vez (sino est registrado en el servidor) Existen dos mtodos:
Se usa cuando no se requieren parmetros de inicializacin permite obtener parmetros del servidor Si se redefine debe llamarse a super.init(cfg)
Servlet tiene mtodo getInitParameter(...) que permite obtener parmetros de inicializacin por nombre
Tecnologa J2EE 19
Mtodo de Servicio
Mtodo de Destruccin
Cada vez que el servlet recibe una peticin se invoca este mtodo
En general, este mtodo no debiera redefinirse por una clase derivada Normalmente se usa clase HttpServlet
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
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
Tecnologa J2EE
24
Peticiones HTTP
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
POST
Tecnologa J2EE
26
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
TRACE
Tecnologa J2EE
27
Tecnologa J2EE
28
Clase HttpServlet
Clientes Servidor Web
Request
service()
HttpServlet
doDelete() doGet() doOptions() doPost() doTrace() doPut()
Response
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
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
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
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>
Tecnologa J2EE
35
Tecnologa J2EE
36
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
Representa el mbito de ejecucin del Servlet El contenedor le crea un contexto a cada Servlet (de tipo ServletContext)
Se puede compartir informacin mediante atributos disponibles en el contexto (tipo servletContext) Ejemplo:
Tecnologa J2EE
40
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
Tecnologa J2EE
41
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
String getContentType()
String getSchema()
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
BufferReader getReader()
Tecnologa J2EE
43
Tecnologa J2EE
44
Ejemplo de Respuesta
En la invocacin del mtodo service(...) se entrega un objeto de tipo ServletResponse Clase provee mtodos para definir la respuesta:
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
Paquete javax.servlet.http
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
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
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
Tecnologa J2EE
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
// 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]); }
Acepta un argumento (nombre del parmetro) y retorna arreglo de valores Si no se encuentra nombre, retorna null
Tecnologa J2EE 55
Tecnologa J2EE
56
Clase HttpServletResponse
API en HttpServletResponse
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
Definir la cabecera Enviar un cdigo de error Redireccionar el usuario a otra pgina Agregar un cookie
java.io.PrintWriter getWriter()
Tecnologa J2EE
57
Tecnologa J2EE
58
API en HttpServletResponse
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
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
10
Tecnologa J2EE
63
Despacho de Peticiones
Mtodo getRequestDispatcher
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
Tecnologa J2EE
65
11
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
Tecnologa J2EE
70
Tecnologa J2EE
71
12
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
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
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; }
Tecnologa J2EE
78
13
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
Tecnologa J2EE
79
Tecnologa J2EE
80
rs.close(); s.close(); } catch (SQLException e) { System.out.println(e.toString()); } catch (Exception e) { System.out.println(e.toString()); } return retorno; }
exitoso
Tecnologa J2EE
81
82
14
Necesidad de Sesin
Ejemplo
Protocolo HTTP considera que servidor cierra conexin despus de cada peticin
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:
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
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
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
Tecnologa J2EE
87
Para administrar usuarios se usa como clave de seguimiento el UID Un formulario de bsqueda genera dinmicamente las URL requeridas
Tecnologa J2EE
89
15
Tecnologa J2EE
91
Tecnologa J2EE
92
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
Tecnologa J2EE
94
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
Tecnologa J2EE
95
Tecnologa J2EE
96
16
Cookies
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:
20 cookies para cada servidor Web 300 cookies en total Tamao mximo de 4 KB por cookie
Tecnologa J2EE 99
Tecnologa J2EE
100
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
Tecnologa J2EE
101
17
Ejemplo en el Browser
Tecnologa J2EE
103
Tecnologa J2EE
104
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:
Tecnologa J2EE
105
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
URL indica desde dnde CONTENT indica segundos que debe esperar
Tecnologa J2EE
18
Cookies Persistentes
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
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
lo crea si booleana crear es true retornando nuevo objeto Si crear == false retorna null
Tecnologa J2EE
112
String getId()
long getCreationTime()
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 invalidate()
19
Tecnologa J2EE
115
Tecnologa J2EE
116
Qu Tcnica usar?
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
Motivacin
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
20
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
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
123
API de Paquete
javax.servlet.jsp
Interfaces
Objetos Implcitos
Excepciones
JspException JspError
Clases
Tecnologa J2EE
125
Tecnologa J2EE
21
Ejemplo
Pgina JSP
try {
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
Tipos de elementos:
4.4 Directivas
Directivas Etiquetas JSP Scripting
Etiquetas JSP
Scripting
Acciones
Acciones
Tecnologa J2EE
22
Directivas
a) Directivas de Pgina
Informacin para que contenedor JSP sepa cmo traducir la pgina en un servlet Existen tres tipos de directivas:
Sintaxis:
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:
Tecnologa J2EE
134
TIPO DE VALOR
Lenguaje de Scripting String MIME type, character set Nombre de clase
TIPO DE VALOR
Nombre completo Ninguno de clase o paquete Tamao del buffer o false Boolean Boolean 8192 true true
Tecnologa J2EE
135
Tecnologa J2EE
136
Observacin
TIPO DE VALOR
Boolean URL Boolean
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
vlido
23
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
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
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:
</BODY> </HTML>
<BODY>
Ral Monge, 2004 Ral Monge, 2004 Tecnologa J2EE 144
24
Permite definir biblioteca de origen de etiquetas definidas por el usuario (tag lib) El tema se estudiar en detalle ms adelante en el captulo
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
Tecnologa J2EE
Tecnologa J2EE
148
Tecnologa J2EE
25
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(" (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
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:
Tecnologa J2EE
153
Tecnologa J2EE
154
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>
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
26
Elementos de Accin
Corresponde a etiquetas que se incrustan en la pgina En tiempo de compilacin se reemplazan por cdigo Java, que corresponde a la tarea correspondiente
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
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
27
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>
Tecnologa J2EE
163
Tecnologa J2EE
164
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
Existen otros elementos JSP que nos facilitarn la codificacin de pginas JSP
Tecnologa J2EE 165
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
28
Ejemplo de JavaBean
package beans;
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; } }
Tecnologa J2EE
169
Tecnologa J2EE
170
Permite usar un bean con 1 ms atributos (debe estar al menos el atributo de class o de type)
cdigo de inicializacin
Tecnologa J2EE
171
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
29
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() %>
Ejemplo:
Ejemplo:
Tecnologa J2EE
176
<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"/>
Tecnologa J2EE
177
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>
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
Tecnologa J2EE
179
30
<jsp:useBean id="contador" class="beans.ContadorAccesoBean" scope="application"> <jsp:setProperty name="contador" property="primeraPagina" value="ContadorCompartido1.jsp" /> </jsp:useBean> <-- etc.... -->
mbito de Aplicacin
Tecnologa J2EE
181
Tecnologa J2EE
182
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:
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
Etiquetas Personales
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:
Tecnologa J2EE
185
Tecnologa J2EE
186
31
etiquetaSimple.jsp
Tecnologa J2EE
187
Tecnologa J2EE
188
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
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>
cuerpo
Especifica URI que identifica nicamente TLD asociado al prefijo Define un nombre de prefijo para asociar etiquetas personales a una determinada biblioteca
Atributo prefix
Tecnologa J2EE
191
Tecnologa J2EE
192
32
Atributo
Ral Monge, 2004 Tecnologa J2EE 193 Ral Monge, 2004 Tecnologa J2EE 194
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
Tecnologa J2EE
195
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
Tecnologa J2EE
197
33
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:
Valores de retorno:
EVAL_BODY_INCLUDE
Tecnologa J2EE
199
Tecnologa J2EE
200
Mtodo doEndTag
Sintaxis:
Valores de retorno:
EVAL_PAGE
Tecnologa J2EE
202
Paradigma MVC
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
34
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
Pginas JSP
205
206
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
Tecnologa J2EE
209
35