Diapositivas Servlets y JSP
Diapositivas Servlets y JSP
Diapositivas Servlets y JSP
1. Servlets.
1. 2. 3. 4. 5. 6. Introduccin. Objeto Request. Objeto Response. Cookies. Sesiones. Reescritura de URLs
2. JSP.
1. 2. 3. 4. Introduccin. Elementos JSP. Java Beans. Etiquetas personalizadas. 5. JDBC 6. Integracin Servlets y JSP
Qu son? (I)
? Los Servlets son la alternativa Java a los CGIs. ? Actan como capa intermedia entre:
? Peticin proveniente de un Navegador Web u otro cliente HTTP ? Bases de Datos o Aplicaciones en el servidor HTTP
? Son aplicaciones Java especiales, que extienden la funcionalidad del servidor HTTP, dedicadas a:
? Leer los datos enviados por el cliente. ? Extraer cualquier informacin til incluida en la cabecera HTTP o en el cuerpo del mensaje de peticin enviado por el cliente. ? Generar dinmicamente resultados. ? Formatear los resultados en un documento HTML. ? Establecer los parmetros HTTP adecuados incluidos en la cabecera de la respuesta (por ejemplo: el tipo de documento, cookies, etc.) ? Enviar el documento final al cliente.
2
Servidor Web
BD
Servlet
BD externa
Aplicacin
Qu son? (II)
? Los objetos servlets cumplen los siguientes requisitos:
? Estn basados en el marco de Servlets. ? Utilizan el Servlet Application Programming Interface (SAPI) ?El interfaz SAPI define una manera estndar para que las peticiones HTTP sean procesadas por esta clase Java (independiente del servidor).
? Asociados a la URL de la peticin, son manejados por el contenedor de servlets con una arquitectura simple.
? El contenedor provee el entorno de ejecucin para todos los servlets basados en los anteriores requisitos.
? Disponibles para la gran mayora de servidores web. ? Son independientes de la plataforma y del servidor.
4
? Potencia.
? Son programados en Java, por lo que se puede emplear todas las clases y herramientas disponibles para esta plataforma.
? Seguridad.
? Controlada por la mquina virtual de Java. ? La mayora de problemas de seguridad encontrados en los CGIs no aparecen en los Servlets.
? Portabilidad.
? Puede ser utilizados sobre cualquier SO. y en la mayora de servidores Web.
? Precio.
5
Servidor Web Proceso Hijo del CGI-1 Proceso Hijo del CGI-2 Proceso Hijo del CGI-1 Servidor Web
JVM Servlet-1 Thread Servlet-2
Servlet
HttpServlet
MiServlet
Estructura bsica
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; // Para PrintWriter // Para ServletException // Para HttpServlet*
public class PlantillaServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // El objeto "request" se utiliza para leer la // cabecera HTTP, cookies, datos enviados (GET o POST) // El objeto "response" para fijar la respuesta PrintWriter out = response.getWriter(); // out Se utiliza para enviar el contenido al cliente } // Idem para el mtodo doPost }
8
Ejemplo
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HolaMundo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD " + "HTML 4.0 Transitional//EN\">" + "<html> <head><title>Hola Mundo</title></head>" + "<body> <h1>Hola Mundo</h1> </body></html>"); } }
9
11
Peticin HTTP
SAPI
Servlet en Memoria?
SI
Ejecutar Servlet
SAPI
Env o de la respuesta
Respuesta HTTP
12
? doGet y doPost
? Manejan las peticiones GET y POST.
? Incluyen el cdigo principal del servlet
? destroy
? Se invoca cuando el servidor decide eliminar el servlet de la memoria (NO despus de cada peticin).
13
service()
doPost()
destroy()
? Objeto response
? Es una instancia de HttpServletResponse (javax.servlet.http.HttpServletRequest) ? Organiza los datos enviados al cliente.
? Objeto session
? Es una instancia de HttpSession (javax.servlet.http.HttpSession) ? Almacena informacin con mbito de sesin.
15
? Objeto out
? Es una instancia de PrintWriter (java.io.PrintWriter) ? Escribe contenido dentro de la pgina HTML.
? Objeto config
? Es una instancia de ServletConfig (javax.servlet.ServletConfig) ? Contiene informacin relacionada con la configuracin del servlet.
16
Ejemplo (I)
public class MuestraMensaje extends HttpServlet { private String mensaje; private String mensaje_por_defecto = "No hay mensaje"; private int repeticiones = 1; public void init() throws ServletException { ServletConfig config = getServletConfig(); mensaje = config.getInitParameter("mensaje"); if (mensaje == null) { mensaje = mensaje_por_defecto; } try { String repetir_cad = config.getInitParameter("repeticiones"); repeticiones = Integer.parseInt(repetir_cad); } catch(NumberFormatException nfe) {} }
17
Ejemplo (II)
// (continua ..)
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String titulo = "Servlet MuestraMensaje"; out.println("HTML 4.0 Transitional//EN\">" + "<html><head><title>" +titulo + "</title></head>" + "<body bgcolor=\"#FDF5E6\">\n" + "<h1 align=\"center\">" + titulo + "</h1>"); for(int i=0; i< repeticiones; i++) out.println(mensaje + "<br>"); out.println("</body></html>"); } }
18
Datos de un formulario
? La forma de leer los datos enviados desde un formulario es independiente del mtodo de envo (GET o POST). ? String request.getParameter(nom_var)
? Devuelve el valor (decodificado URL-encoded) encontrado en la primera ocurrencia de la variable dentro de los datos enviados por el cliente. ? Devuelve null si la variable no ha sido enviada.
? String request.getParameterValues(nom_var)
? Devuelve un array de valores (decodificados URL-encoded) con todos los valores asociados a la variable (SELECT multiple). Si slo aparece un vez, devuelve un array de un elemento. ? Devuelve null si la variable no ha sido enviada.
? Enumeration request.getParameterNames()
? Devuelve una enumeracin con los nombres de las variables enviadas.
20
23
25
32
34
? ServletOutputStream ?La referencia se extrae con response.getOutputStream() ?Cuando el cdigo generado es binario (p.e. una imagen)
ServletOutputStream out = response.getOutputStream();
35
? Servlets
? Permiten obtener y mantener una determinada informacin acerca de un cliente ? Informacin accesible a diferentes servlets o entre diferentes ejecuciones de un mismo servlet
Enviando/Recibiendo Cookies
? Para enviar cookies al cliente se crea un objeto de la clase Cookie, y se invoca el mtodo addCookie del objeto response pasndole como parmetro dicha cookie.
Cookie c = new Cookie("nombre", "valor"); c.setMaxAge(...); // Segundos de vida del cookie response.addCookie(c);
? Para leer las cookies se emplea el mtodo getCookies del objeto request. ste devuelve un array con todos las cookies recibidas del cliente.
Cookie[] cookies_recb = request.getCookies(); if (cookies_recb != null) for(int i=0; i<cookies_recb.length; i++) { if (cookies_recb[i].getName().equals(alquiler")) && (cookies_recb[i].getValue().equals(coche")) {cookies_recb[i].setMaxAge(0)//Eliminara el cookie } //fin del if } // fin del for } // fin del if
39
41
Ejemplo UtilidadesCookie
public class UtilidadesCookie { public static String ExtraeValor ( Cookie[] cookies, String nom_cookie ) { String valor = ""; if ( cookie != null ) for ( int i=0; i<cookies.length; i++) { Cookie cookie=cookies[i]; if ( nom_cookie.equals(cookie.getName()) ) valor = cookie.getValue(); } return valor; }
42
Ejemplo UtilidadesCookie
public static boolean EsSegura ( Cookie[] cookies, String nom_cookie ) { boolean segura = false; if ( cookie != null ) for ( int i=0; i<cookies.length; i++) { Cookie cookie= cookies[i]; if ( nom_cookie.equals(cookie.getName()) ) segura = cookie.getSecure(); } return segura; } } // Fin UtilidadesCookie
43
Objeto HttpSession
? Las sesiones se implementan a travs de objetos de la clase HttpSession, creados por el contenedor cuando se inicia una sesin para un nuevo usuario.
? Para extraer la referencia a este objeto desde un servlet:
HttpSession mi_sesion = request.getSession(true);
? Las sesiones se utilizan para almacenar variables que transmiten su valor a lo largo del conjunto de pginas visitadas por el cliente durante la sesin.
44
45
46
Ejemplo 1
... HttpSession miSesion=req.getSesion(true); CarritoCompras compra = (CarritoCompras) miSesion.getValue(miSesion.getId()); if(compra==null) { compra = new CarritoCompras(); miSesion.putValue(miSesion.getId(), compra); } ..
47
Ejemplo 2
..... HttpSession session = request.getSession(true); Integer acc = (Integer)session.getAttribute("accesos"); String presentacion; if (acc == null) { acc = new Integer(0); presentacion = "Bienvenido, nuevo usuario"; } else { presentacion = "Bienvenido de nuevo"; acc = new Integer(acc.intValue() + 1); } session.setAttribute("accesos", acc); ....
48
Reescritura de URLs
? Puede suceder que ciertos clientes no soporten cookies o bien las rechacen
? El servidor asocia ese identificador con datos que ha guardado acerca de la sesin ? Mtodos: encodeURL() y encodeRedirect()
? Leen un String ( URL o URL de redireccin) y si es necesario lo reescriben aadiendo el identificativo de la sesin.
? Algunas Desventajas ? Se deben codificar todas las URLs referentes al sitio propio ? Todas las p ginas deben generarse dinmicamente
49
Ejemplo
... HttpSession miSesion=req.getSesion(true); CarritoCompras compra = (CarritoCompras)miSesion.getValue(miSesion.getId()); if(compra==null) { compra = new CarritoCompras(); miSesion.putValue(miSesion.getId(), compra); } ... PrintWriter out = resp.getWriter(); resp.setContentType("text/html"); ... out.println("Esto es un enlace reescrito"); out.println("<a href\""+ resp.encodeUrl("/servlet/buscador?nombre=Javier")+"\"</a>"); ...
50
Marco JSP
? Los servlets son aplicaciones java que crean contenido HTML a base de sentencias out.print
? Se hace tedioso crear pginas HTML. ? Es ms complicado mantener el contenido HTML.
? JSP es la otra alternativa java a la generacin de contenidos de forma dinmica en el lado del servidor. ? El cdigo Java queda embebido dentro del cdigo HTML de forma similar a PHP o ASP.
? Separa el cdigo java del HTML. ? Ms conveniente que los servlets para generar contenido HTML.
Ejemplo.jsp
<html> <head><title>Ejemplo JSP</title> </head> <body> <h1>Saludos</h1> <%-- Esto es un comentario --%> <% String[] nombres={"Juan","Pedro","Ana","Inma","Carmen"}; for ( int i = 0; i < nombres.length; i ++ ) { %> <font color="green" size="<%=i+2%>"> a <i><%= nombres[i]%></i><br> <% } %> </body> </html>
52
Ventajas (I)
? Frente a CGI.
? Seguridad
? Entorno de ejecucin controlado por la JVM
? Eficiencia
? Cada nueva peticin es atendida por un hilo, no por un nuevo proceso
? Frente a PHP
? Lenguaje ms potente para la generacin dinmica
? Lenguaje de script orientado a objetos (Java)
? Frente a ASP
? Mejores rendimientos.
? Cdigo compilado, no interpretado (SDK 1.4 o superior)
Ventajas (II)
? Frente a servlets puros
? La lgica de negocio y la presentacin estn ms separados. ? Simplifican el desarrollo de aplicaciones Web
? Ms conveniente para crear HTML (no es necesario println).
? Ms fcil para desarrolladores Web. ? Soporte para reutilizar software a travs de JavaBeans y etiquetas adaptadas. ? Puede utilizarse herramientas estndar (p.e. Homesite) ? Recompila automticamente las modificaciones en las pginas jsp ? No es necesario ubicar las pginas en un directorio especial
? /srv/www/tomcat/base/webapps /ROOT/pagina.jsp
54
http://servidor/Hola.jsp
navegador
<html> <body> Hola </body> </html>
Contenedor Servlet/JSP
genera
Hola.java
compila ejecuta
Hola.class
Peticiones posteriores
Servidor HTTP
55
? Fase de compilacin
? Dicho servlet es compilado para poder servir la peticin del cliente. ? Normalmente las fases de traduccin y compilacin ocurren juntas, y son realizadas por el contenedor automticamente en la primera peticin.
? Fase de ejecucin
? Se crea una instancia de dicho servlet, que residir en memoria de forma permanente mientras el servidor sigua en funcionamiento. ? Para las peticiones posteriores se emplea la misma instancia del servlet (no se vuelve a compilar la pgina).
56
Evento de inicio
_jspService()
Peticin Respuesta
jspDestroy()
JSPServlet
Evento de destruccin
? jspDestroy():
? Permite ejecutar cdigo antes de que finalice el servlet.
57
Correspondencia JSP/servlet
? Ejemplo.jsp:
<html><body> <h3>num. aletorio: <%= Math.random()%> </h3> </body></html>
Elementos bsicos
? Los comentarios en las pginas JSP se escriben:
<%-- comentario --%>
? Elementos de script
? Los elementos JSP permiten insertar cdigo Java en el servlet que se genera a partir de la pgina JSP. ? Tres tipos: ?Scriptlets:
? El cdigo se inserta en el mtodo _jspService del servlet
?Expresiones :
? Evaluadas e insertadas en la salida del servlet
?Declaraciones :
? El cdigo es insertado en la clase del servlet, fuera de los mtodos.
? Directivas
? Instrucciones que controlan la generacin del servlet que resulta de la pgina JSP.
59
Scriptlets
? Formato usual:
? <% cdigo %>
? Usado para introducir cdigo java arbitrario dentro del mtodo _jspService (invocado desde service)
<% String datos_enviados = request.getQueryString(); out.println("Datos enviados con el mtodo GET:" + datos_enviados + "<br>"); %>
60
Expresiones
? Formato usual:
<%= expresin % >
61
Declaraciones
? Se usan para indicar declaraciones de variables globales, es decir persistentes ? Formato:
? <%! Cdigo % > ? <jsp:declaration> cdigo </jsp:declaration>
? Se utiliza para declarar nuevos atributos y mtodos dentro de la clase servlet derivada (fuera de cualquier mtodo existente), que pueden ser utilizados dentro de scriptlets y expresiones.
<%! public java.util.Date FechaActual() { return (new java.util.Date()); } %> <html> <head><title>Ej. declaracin</title></head><body> La fecha actual es: <%= FechaActual()%> </body></html>
62
Directivas
? Formato: ?<%@ directiva %> ?<jsp:directive directiva /> ? Dan informacin de alto nivel sobre el servlet que ser generado a partir de la pgina JSP. ? Controlan:
? Las clases importadas. ? La clase padre del servlet. ? El tipo MIME generado. ? La inclusin del servlet dentro de sesiones. ? El tamao y comportamiento del buffer de salida. ? Las pginas que manejan los errores inesperados.
63
64
?isErrorPage : Estipula que la pgina puede ser usada como pgina de error.
65
66
Directiva include
? Incluye el contenido de un fichero texto (con cdigo html y/o jsp) en una pgina JSP. ? Formato:
? <%@ include file =url_relativa %> ?Durante la fase de traduccin (contenido fijo) ? <jsp:include page =url_relativa flush=true/> ?Durante la fase de ejecucin (contenido cambiante)
<%@ page import="java.util.Date"%> <%! private int num_accessos = 0; private Date fecha_acceso = new Date(); %> <html><body> <% num_accessos++; %> Accessos hasta el momento <%= num_accessos%><br> Fecha del ultimo acceso <%= fecha_acceso %><br> <% fecha_acceso = new Date(); %> Fecha actual <%= fecha_acceso %><br><hr> <%@ include file="InfoContacto.jsp" %></body></html>
67
Directiva taglib
? Permite extender, dentro de la pgina, las etiquetas JSP con etiquetas personalizadas definidas por el propio programador. ? Formato:
? <%@ taglib uri ="URLLibreria " prefix ="PrefijoEtiq" %> ? El valor de uri hace referencia a la biblioteca donde estn definidas las etiquetas personalizadas, y el valor de prefix asocia el prefijo usado para distinguir dichas etiquetas.
? Ejemplo:
<%@ taglib uri="http://www.uv.es/ist_tags" prefix="ist" />
...
<ist:iniConsulta>
...
</ist:iniConsulta>
68
Ejemplo2.jsp
<%@ page language='java' contentType="text/html" info='Mi primera pgina en JSP" import='java.util.*' errorPage='errorQueTeCagas.jsp' %> <%! int count=0; %> <html> <head><title>Hola y nmeros. Intro to JSP</title></head> <body bgcolor="white"> Hola, mundo. Te lo repito <%= count++ %> <% if (count == 1) { %> vez <% } else { %> veces <% } %> </body></html>
69
Ejemplo22.jsp
<%@ page language='java' contentType="text/html" info='Mi primera pgina en JSP" import='java.util.*' errorPage='errorQueTeCagas.jsp' %> <%! int count=0; %> <html> <head><title>Hola y nmeros. Intro to JSP</title></head> <body bgcolor="white"> Hola, mundo. Te lo repito <%= count++ %> <% if (count == 1) System.out.println('vez') } else { System.out.println('veces') } %> </body></html>
70
peticin
peticin
respuesta
71
72
Objetos implcitos
? request: Engloba la informacin enviada desde el cliente.
<body bgcolor=<%=request.getParameter("color_fondo")%>>
? session: Incluye los datos compartidos entre pginas de la sesin ? application ? out: Objeto utilizado para insertar contenido dentro de la pgina.
<% out.println("Buenos dias " + nombre +">br>"); %>
Ejemplo (I)
<%@ page errorPage="PaginaError.jsp" %> <%@ page import = "java.util.*" %> <%! private int num_pagina = 1 %> <% String usuario = (String)request.getParameter("login"); String clave = (String)request.getParameter("passwd"); if ( usuario == null || clave == null ) { %> <html> <head><title>Pgina de inicio de sesin</title></head> <body> <center> Es necesario identificarse para iniciar la sesin: <form name="formulario" method="POST"> Usuario:<input type="text" name="login"><br>
74
Ejemplo (II)
Contrasea:<input type="text" name="passwd"><br> <input type="submit" value="Comenzar la sesin"> </form></body></html> <% } else { /* Sobre estas lneas, faltara comprobar que el usuario y la clave son correctos (consultado una BD) */ session.setAttribute("nombre", usuario); session.setMaxInactiveInterval(600); String sig_pag = "http://" + request.getServerName() + "/pagina" + num_pagina + ".jsp"; num_pagina ++; response.sendRedirect(sig_pag); } %>
75
Qu son?
? Los componentes JavaBeans son clases java especiales diseadas para ser fcilmente reutilizables, para lo que siguen ciertos convenios entre los que destaca:
? El constructor no tiene argumentos. ? No suelen permitir el acceso directo a sus variables (propiedades privadas). ? Suelen existir mtodos especiales:
? Para leer los valores de la propiedad: getNomPropiedad() ? Si el atributo es booleano: isNomPropiedad() ? Para rescribir sus valores: setNomPropiedad(valor)
Ejemplo de JavaBean
package cbns; public class StringBean { private String mensaje; public StringBean() { mensaje = Mensaje no fijado; } public String getMensaje() { return (mensaje); } public String setMensaje(String mensaje) { this.mensaje = mensaje; } }
? Ejemplo: <jsp:useBean id= "carr" class= "CarritoCompra" scope= "session" /> ? Ejemplo equivalente usando sintaxis Java: <% CarritoCompra carr = (CarritoCompra)Session.getAtribute("carr"); if (carr==null) { carr = new CarritoCompra(); Session.setAtribute("carr"); } %>
79
80
? Va jsp:getProperty:
<jsp:getProperty name ="nomBean" property= "nomPropiedad" /> ? El nombre del bean nomBean debe ser el mismo fijado en el atributo id de jsp:useBean ? Debe existir un m todo llamado getNomPropiedad definido dentro de la clase del Bean.
? Ejemplo:
<jsp:getProperty name="carr" property="cantidad" />
81
Ejemplo
<html> .... <jsp:useBean id="entrada" class="Ventas" /> <jsp:setProperty name="entrada" property = "item" param="id_item" /> <%-- La anterior sentencia es equivalente a: --%> <jsp:setProperty name="entrada" property = "item" value="<%= request.getParameter("id_item")%>" /> <jsp:setProperty name="entrada" property = "cantidad" param="cantidad" /> ..... El Total de las ventas es: <jsp:getProperty name="entrada" property="total" /> .... </html>
82
Introduccin
? Para invocar los mtodos de los JavaBeans an son necesarios scriptlets.
<jsp:useBean id="miBean" /> <% miBean.miMetodo(x) %>
? Permiten separar las funciones del diseador web (que usa HTML y XML) de las del programador web (que usa Java) ? Ofrecen mayor potencia que los JavaBeans
? Las etiquetas se empaquetan en una librera (fichero XML con extensin .tld)
83
?Incluir la etiqueta dentro de la librera de etiquetas (fichero XML de extensin .tld) describiendo las propiedades de la etiqueta ?Utilizar la librera de etiquetas dentro de un fichero JSP
?Importando la librera de etiquetas
<%@ taglib uri=.... Prefix="ist"%>
84
? Esta clase constituye un javaBean que hereda dos mtodos bsicos de TagSupport :
? doStartTag() invocado cuando se abre la etiqueta ? doEndTag() invocado cuando se cierra
? Si la etiqueta tiene atributos se definen mtodos (set y get) para tratar los valores de los mismos ? Si adems tiene cuerpo, hereda de BodyTagSupport dos mtodos:
? doInitBody () y doAfterBody ()
85
? Se definen mtodos que se encargan de tratar sus valores. public void setAtrib1(String valor) {...}
86
87
Ejemplo clase
package p; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; import java.io.*; import java.math.*; public class PrimeTag extends TagSupport { protected int len = 50; public int doStartTag() { try { JspWriter out = pageContext.getOut(); BigInteger primo = new BigInteger(len,4,new Random()); out.print(primo); } catch (IOException ioe) { } return(SKIP_BODY); } public void setLength(String length) { try { len = Integer.parseInt(length); } catch (NumberFormatException nfe) { } }
} 88
Librera de etiquetas
? El fichero TLD asocia la etiqueta a la clase, y define otras propiedades importantes de la etiqueta:
<tag> <name> nombre de la etiqueta </name > <tagclass> clase asociada a la etiqueta </tagclass> <bodycontent> X </bodycontent> Donde X es: ? EMPTY si la etiqueta no tiene contenido ? JSP si la etiqueta contiene cdigo JSP ? TAGDEPENDENT si el contenido es procesado por la clase <info> descripcin de la etiqueta </info> <attribute> <name >nombre del atributo </name > <required>false o true</required> indica si es opcional <rtexprvalue>false o true </rtexprvalue>
indica si el valor puede ser una expresion JSP
89
91
Introduccin
? JDBC (Java dataBase Connectivity) proporciona una librera estndar para la conexin de aplicaciones java (web: servlets y JSP) a bases de datos relacionales. ? El API JDBC proporciona un mtodo estndar, independiente de la BD, para:
? Establecer la conexin con el servidor BD. ? Inicializar consultas. ? Realizar consultas y crear tablas con los resultados. ? Cerrar las conexiones con el servidor.
92
Drivers JDBC
? JDBC permite cambiar el SGBD sin modificar el cdigo del servlet o de la pgina JSP. ? JDBC consiste en:
? Un API basado en Java ? Un manejador del driver JDBC:
? Se comunica con el driver especfico (proporcionado por el vendedor del SGBD) que es el que realiza la conexin real con la BD.
Servlet / JSP
API JDBC
Pasarela JDBC-ODBC
BD
3
BD
4. Realizar la consulta:
Statement estado = conex.createStatement(); String consul = "SELECT col1, col2 FROM tabla1"; ResultSet resultado = estado.executeQuery(consul);
? Para modificar la BD se utiliza executeUpdate pasndole una cadena con la operacin: UPDATE, DELETE o INSERT.
int nfilas = estado.executeUpdate("DELETE FROM tabla1 WHERE ...");
95
? La clase ResultSet proporciona varios mtodos get Xxx que toman como parmetro el nmero de la columna o el nombre de la columna y devuelven los datos.
6. Cerrar la conexin
connection.close();
96
Introduccin (I)
? En las aplicaciones web desarrolladas con Servlets y JSP suele haber una separacin clara del cdigo dedicado a la lgica de negocio, al manejo de los datos y a generar la parte del interfaz.
? En aplicaciones complejas, JSP slo no suele ser suficiente. ? Se suele utilizar JSP para desarrollar y mantener la presentacin (contenido HTML). ? El cdigo real se ubica en clases separadas (lgica de negocio): ?JavaBeans. ?Etiquetas personalizadas. ?Incluso, servlets. ? La administracin de los datos es gestionada por SGBD (JDBC)
97
Introduccin (II)
? JSP puede ser incluso insuficiente para presentaciones donde los resultados son totalmente diferentes dependiendo de los datos que se reciben.
? La combinacin JSP + JavaBeans + Etiquetas personalizadas, aunque muy potente, no puede superar la limitacin que impone la secuenciacin relativamente fija de los elementos JSP. ? Solucin: usar servlets y JSP. ?El servlet puede manejar la peticin inicial, procesar parcialmente los datos, iniciar los javabeans y pasar a continuacin los resultados a un conjunto de pginas JSP.
? De una sola peticin pueden derivar mltiples resultados substancialmente diferentes.
Modelo JavaBeans
Evento (peticin)
(prop. beans)
Vista JSPs
respuesta Evento (forward) (HTML)
Controlador servlet
peticin
Interfaz Navegador
99
4. 5. 6.
100
Pasando peticiones
? Para que los servlets puedan pasar las peticiones:
? Se crea un objeto de la clase RequestDispatcher. ? Se utiliza su mtodo forward para transferir el control a la URL asociada.
public void doGet(...) throws ... { String operacion = request.getParameter("operation"); String direccion; if (operacion.equals("order")) direccion = "pedido.jsp"; else if (operation.equals("cancel")) direccion = "cancelacion.jsp"; ... RequestDispatcher dispatcher = request.getRequestDispatcher(direccion); dispatcher.forward(request, response); }
101
? En el mbito de la sesin:
? El servlet: session.setAttribute("clave", valor); ? La pgina JSP:
<jsp:useBean id="clave" class="UnaClase" scope="session"/>
? En el mbito de la aplicacin:
? El servlet: getServletContext().setAttribute("clave",valor); ? La pgina JSP:
<jsp:useBean id="clave" class="UnaClase" scope="application"/>
102
el navegador los interpreta como relativos al servlet, no a la pgina JSP. ? Solucin: indicar para cada recurso el camino a partir del directorio raz virtual:
<link rel="stylesheet" href="/camino/esti.css" ...>
103
105