You are on page 1of 121

Tema Servlets

DESARROLLADO X : HUAMANCHAO GOMEZ SIMEON

Introduccin
Necesidad de mecanismos para desarrollar aplicaciones web contenido dinmico Cuando escribes una URL en tu navegador:
El navegador establece una conexin TCP/IP con el

servidor El navegador enva una peticin al servidor El servidor devuelve una respuesta al cliente El servidor cierra la conexin

Los mensajes intercambiados entre el cliente y el servidor son HTTP

HTTP
Especificacin de HTTP:

http://www.w3.org/Protocols/rfc2616/rfc2616 .html Bsicamente debemos saber que los comandos principales son HTTP GET y POST.

Tecnologa Servlet
Piedra angular del desarrollo de aplicaciones

web en Java
Los JSPs son de hecho servlets disfrazados

Caractersticas de los Servlets


Pensados para reemplazar a los CGIs
Cada peticin de un cliente haca al servidor lanzar

un nuevo proceso con el programa CGI

No es la nica tecnologa disponible:


ASP.NET

PHP (plataforma LAMP)

Ventajas
Rendimiento cada peticin es procesada por un nico proceso en el contenedor de servlets Portabilidad heredado de Java Rpido desarrollo acceso a las riqusimas libreras de Java Robustez gestionados por la mquina virtual

de Java (garbage collection) Amplio soporte muchos desarrolladores y compaas utilizan esta tecnologa

Arquitectura
Servlet Container = servidor web capaz de

ejecutar servlets En una aplicacin JSP, el contenedor se corresponde a un JSP container.

HTTP Request

Servlet Container HTTP Server Contenido Esttico

Servlet

Browser
HTTP Response

Funcionamiento de un Servlet
Recibir Peticin

Est el Servidor Cargado?

NO

Es el servidor reciente? S

NO

Cargar Servlet

Procesar Peticin

Enviar Respuesta

Contenedor Tomcat 5
El contenedor de Servlets ms popular Actualmente en la versin 5.0 Open source, disponible en:

http://jakarta.apache.org/tomcat/ Vamos a instalarlo ...

Instalando Tomcat 5
Requisitos:
Haber instalado Java 5

Extraer fichero: downloads\Tomcat5.5\jakartatomcat-5.5.7.zip Crear las siguientes variables de entorno, por medio de Panel de Control->Sistema>Avanzado->Variables de Entorno:
TOMCAT_HOME=<TOMCAT_INSTALL_DIR>

6 Pasos Para Crear tu Primer Servlet


1. Crear una estructura de directorios bajo

2. 3. 4.
5. 6.

Tomcat para tu aplicacin Escribir el cdigo del servlet Compilar el cdigo Crear un descriptor de explotacin (deployment descriptor) Ejecutar Tomcat Invocar el servlet desde un navegador

Crear directorio bajo Tomcat para tu aplicacin



1. 2.

El directorio %TOMCAT_HOME%/webapps es dnde cuelgas tus aplicaciones Una aplicacin web es un conjunto de servlets y otros recursos instalados bajo el espacio URL de un servidor Pasos:
Crear un directorio bajo webapps con el nombre de tu aplicacin myapp, que aparecer en la url a tu aplicacin Crear el directorio WEB-INF debajo de myApp
Crear subdirectorio clases Crear subdirectorio lib

Podis hacer copy/paste del contenido del directorio examples\servlets\ej1_holamundo_servlet bajo %TOMCAT_HOME\webapps\myapp
Vamos a reutilizar continuamente el contexto myapp

Escribir el Cdigo del Servlet


// HelloWorldExample.java import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ResourceBundle rb = ResourceBundle.getBundle("LocalStrings",request.getLocale()); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); String title = rb.getString("helloworld.title"); out.println("<title>" + title + "</title>"); out.println("</head>"); out.println("<body bgcolor=\"white\">"); out.println("<h1>" + title + "</h1>"); out.println("</body>"); out.println("</html>"); } }

Compilar el Cdigo
Guardar el cdigo en

%TOMCAT_HOME%\webapps\myapp\WEB -INF\classes Compilar el cdigo:


javac classpath %TOMCAT_HOME%\common\lib\servletapi.jar HelloWorldExample.java

Crear el web.xml
Nombre recibido por el deployment

descriptor
Debe colocarse en el directorio WEB-INF

web.xml es un documento XML que tiene

como elemento raz: <web-app> Se pueden encontra n elementos <servlet> que cuelgan de l

Crear el web.xml
<?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> <display-name>Servlet 2.4 Examples</display-name> <description> Servlet 2.4 Examples. </description> <servlet> <servlet-name>HelloWorldExample</servlet-name> <servlet-class>HelloWorldExample</servlet-class> </servlet>

<servlet-mapping> <servlet-name>HelloWorldExample</servlet-name> <url-pattern>/HelloWorldExample</url-pattern> </servlet-mapping> </web-app>

Ejecutar el Cdigo
Arrancar Tomcat si es necesario, mediante el

comando: %TOMCAT_HOME%\bin\catalina.bat run Invocar al servlet: http://localhost:8080/myapp/Hel loWorldExample

Resultado de Ejecutar Servlet

Servlets: Jerarqua
La jerarqua de clases java es...

nicamente hay que hacer polimorfismo de

los mtodos que se quieran tratar.

Las APIs
Dos paquetes permiten la programacin de

servlets:
javax.servlet
javax.servlet.http

Revisar documentacin:
Arrancar Tomcat Visitar: http://localhost:8080

Servlets: Ciclo de vida


Ciclo de vida de un servlet:

Servlets: Ciclo de vida


Viene dado por tres mtodos: init, service y

destroy INICIALIZACIN: Una nica llamada al mtodo init por parte del servidor. Incluso se pueden recoger unos parametros concretos con getInitParameter de ServletConfig. SERVICIO: una llamada a service() por cada invocacin al servlet
Cuidado! El contenedor es multihilo

DESTRUCCIN: Cuando todas las llamadas desde el

cliente cesen o un temporizador del servidor as lo indique. Se usa el mtodo destroy Revisar documentacin de la clase javax.servlet.Servlet

Demostrando el Ciclo de Vida


// examples\servlets\ej2_ciclovida_servlet import javax.servlet.*; import java.io.IOException; public class CicloVidaServlet 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"); } public String getServletInfo() { return null; } public ServletConfig getServletConfig() { return null; } }

Servlets: Operaciones duraderas


Respuestas a peticines de clientes que

requieran de un tiempo de proceso muy largo. Puede que el servlet deba destruirse y estas operaciones aun no hayan concluido. Es responsabilidad del programador encargarse de su gestin.

Servlets: Operaciones duraderas


Necesitaremos por tanto:
Mantener un seguimiento de las tareas (threads) que

se estn ejecutando en el mtodo service Proporcionar una finalizacin correcta haciendo que los procesos largos que aun no hayan concluido puedan terminar correctamente en el mtodo destroy del servlet. En ciertos casos poder terminar los procesos que aun siguen en ejecucin si es necesario.

Servlets: Operaciones duraderas


Posible solucin: Contador
public ShutdownExample extends HttpServlet { private int serviceCounter = 0; private Object lock = new Object(); protected void enteringServiceMethod() { synchronized(lock) { serviceCounter++; } } protected void leavingServiceMethod(){ synchronized(lock) { serviceCounter--; if (serviceCounter == 0 && isShuttingDown()) notifyAll(); } } protected int numServices() { synchronized(lock) { return serviceCounter; } } protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { enteringServiceMethod(); try { super.service(req, resp); } finally { leavingServiceMethod(); } }

Servlets: Operaciones duraderas


Falta indicar la terminacin.
public ShutdownExample extends HttpServlet { private boolean shuttingDown; protected void setShuttingDown(boolean flag) { shuttingDown = flag; } protected boolean isShuttingDown() { return shuttingDown; } public void destroy() { synchronized(lock) { if (numServices() > 0) { setShuttingDown(true); } while(numServices() > 0) { try { wait(); } catch (InterruptedException e) { } } } }

Recuperando Configuracin

Recuperando informacin de configuracin del fichero web.xml <servlet> <servlet-name>ConfigDemoServletExample</servlet-name> <servlet-class>ConfigDemoServlet</servlet-class> <init-param> <param-name>adminEmail</param-name> <param-value>dipina@ilargi.org</param-value> </init-param> <init-param> <param-name>adminContactNumber</param-name> <param-value>6542214213</param-value> </init-param> </servlet>

Recuperando Configuracin

Recuperando informacin de configuracin del fichero web.xml, revisar ejemplo examples\servlets\ej3_configinfo_servlet


public class ConfigDemoServlet implements Servlet { ServletConfig cfg; public void init(ServletConfig config) throws ServletException { this.cfg = config; 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)); } } // ... }

Contexto del Servidor


ServletContext representa el entorno donde se ejecuta el

servidor, es decir, el Servlet Container

Se puede obtener una referencia a l mediante el mtodo ServletConfig.getServletContext() Algunos mtodos que se pueden utilizar son:
getMajorVersion de la Servlet API soportada por el contenedor getMinorVersion setAttribute guarda un objeto en el ServletContext getAttributeNames getAttribute removeAttribute

A travs del contexto de un servlet se puede compartir estado entre

varios servlets. Revisar ejemplo examples\servlets\ej4_contextinfo_servlet

Contexto del Servidor


ServletConfig servletConfig; public void init(ServletConfig config) throws ServletException { servletConfig = config; } public void service(ServletRequest request, ServletResponse response) 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); System.out.println("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()); }

Peticines y Respuestas
En el mtodo service() los parmetros:

ServletRequest representa la peticin del cliente y ServletResponse la respuesta del servidor getParameterNames getParameter getRemoteAddress getRemoteHost getWriter

ServletRequest tiene los siguientes mtodos:

ServletResponse tiene entre otros el mtodo:


Revisar

examples\servlets\ej5_requestresponse_servlet

Ejemplo ServletRequest y ServletResponse


public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<HTML>"); // ... out.println("<BR>Server Port: " + request.getServerPort()); out.println("<BR>Server Name: " + request.getServerName()); out.println("<BR>Protocol: " + request.getProtocol()); out.println("<BR>Character Encoding: " + request.getCharacterEncoding()); out.println("<BR>Content Type: " + request.getContentType()); out.println("<BR>Content Length: " + request.getContentLength()); out.println("<BR>Remote Address: " + request.getRemoteAddr()); out.println("<BR>Remote Host: " + request.getRemoteHost()); out.println("<BR>Scheme: " + request.getScheme()); Enumeration parameters = request.getParameterNames(); while (parameters.hasMoreElements()) { String parameterName = (String) parameters.nextElement(); out.println("<br>Parameter Name: " + parameterName); out.println("<br>Parameter Value: " + request.getParameter(parameterName)); } Enumeration attributes = request.getAttributeNames(); while (attributes.hasMoreElements()) { String attribute = (String) attributes.nextElement(); out.println("<BR>Attribute name: " + attribute); out.println("<BR>Attribute value: " + request.getAttribute(attribute)); } out.println("</BODY>"); out.println("</HTML>"); }

Clase GenericServlet
El uso de la interfaz Servlet tiene dos

inconvenientes:
Hay que proveer implementaciones de los cinco

mtodos de Servlet Hay que cachear la referencia a ServletConfig pasada como parmetro

La clase GenericServlet provee una

implementacin vaca de los 5 mtodos de Servlet y recuerda ServletConfig

Ejemplo GenericServlet
import javax.servlet.*; import java.io.IOException; import java.io.PrintWriter; public class SimpleServlet extends GenericServlet { public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<HEAD>"); out.println("<TITLE>"); out.println("Extending GenericServlet"); out.println("</TITLE>"); out.println("</HEAD>"); out.println("<BODY>"); out.println("Extending GenericServlet makes your code simpler."); out.println("</BODY>"); out.println("</HTML>"); } }

Paquete javax.servlet.http
Normalmente siempre vamos a trabajar con l cuando programemos servlets. Sus miembros y mtodos son ms convenientes y ofrecen ms funcionalidad Principalmente vamos a tratar con tres clases:
HttpServlet HttpServletRequest HttpServletResponse

HttpServlet
Hereda de GenericServlet Tiene 6 mtodos doXXX que son invocados cada

vez que el correspondiente comando HTTP es recibido:


doPost doPut doGet doDelete doOptions doTrace

Servlets: Explicacin de mtodos HTTP


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

servicio o recurso del servidor. Mtodo doGet

GET /query.html?keyword='diego' HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.msexcel, application/vnd.ms-powerpoint, application/msword, application/x-shockwaveflash, */* Accept-Language: es,eu;q=0.7,en-gb;q=0.3 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) Host: localhost:9999 Connection: Keep-Alive

Servlets: Explicacin de mtodos HTTP

POST: Lo mismo que GET pero los parmetros van en lnea aparte dentro del cuerpo de la peticin. El manejo es idntico pero a travs del mtodo doPost.
POST /cgi-bin/search.sh HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* Referer: http://localhost:9999/search.html Accept-Language: es,eu;q=0.7,en-gb;q=0.3 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) Host: localhost:9999 Content-Length: 13 Connection: Keep-Alive Cache-Control: no-cache keyword=diego

Servlets: Mtodos
Por defecto retornan BAD_REQUEST(400) Son llamados desde el mtodo service. Reciben interfaces instanciadas:
HttpServletRequest para manejo de la

informacion enviada por el usuario. HttpServletResponse para poder enviar una respuesta en forma de pagina web.

Servlets: Respondiendo en HTML


2 pasos:
Indicar una cabecera de respuesta de contenido (antes de

cualquier tipo de respuesta)

Una manera es usando el mtodo setHeader de HttpServletResponse. Al ser un proceso tan comn existe un mtodo que nos lo soluciona directamente: setContentType de HttpServletResponse.

Crear y enviar cdigo HTML vlido.

Revisar

examples\servlets\ej6_dogetdopost_se rvlet

Ejemplo doGet() y doPost()


// compile: javac -classpath %TOMCAT_HOME%\common\lib\servlet-api.jar DoGetDoPostServlet.java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class DoGetDoPostServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<HEAD>"); out.println("<TITLE>The GET method</TITLE>"); out.println("</HEAD>"); out.println("<BODY>"); out.println("The servlet has received a GET. " + "Now, click the button below."); out.println("<BR>"); out.println("<FORM METHOD=POST>"); out.println("<INPUT TYPE=SUBMIT VALUE=Submit>"); out.println("</FORM>"); out.println("</BODY>"); out.println("</HTML>"); }

Ejemplo doGet() y doPost()


public void doPost( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<HEAD>"); out.println("<TITLE>The POST method</TITLE>"); out.println("</HEAD>"); out.println("<BODY>"); out.println("The servlet has received a POST. Thank you."); out.println("</BODY>"); out.println("</HTML>"); } }

Servlets: Recogiendo la informacin de usuario.


2 formas de envo de informacin:
En la lnea URL mediante una ? En una lnea separada.

En los antiguos CGIs el parseo era muy

complejo. En Servlets usar getParameter de HttpServletRequest que devuelve (si no hay valor) o null (si no existe).

Servlets: Recogiendo la informacin de usuario


Si el parametro tiene mas de un valor se usa

getParameterValues de HttpServletRequest que devuelve un array de strings. Los nombres de los parametros son accesibles mediante getParameterNames de HttpServletRequest que devuelve un Enumeration de strings. Se puede leer la lnea directamente con getReader o getInputStream de HttpServletRequest. Revisar: examples\servlets\ej7_listparams_servlet

Listando Parmetros Recibidos


// compile: javac -classpath %TOMCAT_HOME%\common\lib\servlet-api.jar PruebaServlet.java import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class PruebaServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<HEAD>"); out.println("<TITLE>Obtaining the Parameter</TITLE>"); out.println("</HEAD>"); out.println("<BODY>"); out.println("The request's parameters are:<BR>");

Listando Parmetros Recibidos


Enumeration enumeration = request.getParameterNames(); while (enumeration.hasMoreElements()){ String parameterName = (String) enumeration.nextElement(); out.println(parameterName + ": " + request.getParameter(parameterName) + "<BR>" ); } out.println("<FORM METHOD=GET>"); out.println("<BR>First Name: <INPUT TYPE=TEXT NAME=FirstName>"); out.println("<BR>Last Name: <INPUT TYPE=TEXT NAME=LastName>"); out.println("<BR><INPUT TYPE=SUBMIT VALUE=Submit>"); out.println("</FORM>"); out.println("</BODY>"); out.println("</HTML>"); } }

Servlets: Recogiendo la informacin de usuario


Cabeceras: Adems de la informacin de la lnea de peticin, datos aadidos opcionales (excepto

Content-Length en los mtodos POST).

Accept Los tipos del formato MIME que acepta el navegador cliente. Accept-Charset Los sets de caracteres que el navegador cliente espera. Accept-Encoding Las codificacines de datos (por ejemplo gzip) que el navegador cliente soporta y conoce. As el servlet puede consultar explcitamente informacin de codificacin y as aprovechar las ventajas de HTML gzipeado indicndolo en la cabecera de respuesta Content-Encoding.

Servlets: Recogiendo la informacin de usuario


Accept-Language El lenguaje que el navegador cliente espera. Authorization Informacin de autentificacin, que generalmente se crea como respuesta a una cabecera WWW Authenticate enviada desde el servidor. Connection Indica si se va a usar conexin persistente. Si un servlet recibe el valor Keep-Alive o una peticin con una lnea indicando HTTP 1.1 podr hacer uso de las ventajas que estas ofrecen ahorrando tiempo en pginas con muchos elementos pequeos como imgenes o applets. El servlet ha de indicar el tamao del contenido a enviar como respuesta mediante la cabecera Content-Length. Para ello se puede usar la clase ByteArrayOutputStream y al final enviar todos los datos. Content-Length Usada en los mensajes POST para indicar el tamao de los datos.

Servlets: Recogiendo la informacin de usuario


Cookie Una cabecera muy importante para envo de informacin. From La direccin de email del cliente. Host El host y el puerto sacados de la URL original. If-Modified-Since Para indicar que solo han de enviarse documentos posteriores al actual. Si no es as, se enva una respuesta 304 "Not Modified". Pragma Si contiene el valor no-cache indica que el servidor ha de enviar una nueva copia del documento. Referer La URL de la pgina que contena el link que el cliente sigui para llegar a la pagina actual. User-Agent El tipo de navegador que usa el cliente. Es til si se va enviar contenido especifico para un tipo de navegador. UA-Pixels, UA-Color, UA-OS, UA-CPU Cabeceras no estndar enviadas desde IE indicando el tamao de pantalla, la profundidad de color, el SO y el tipo de cpu usado en el cliente.

Servlets: Recogiendo la informacin de usuario


Los mtodos para acceder a estas cabeceras son:
getHeader de HttpServletRequest que

devuelve un String. getHeaderNames de HttpServletsRequest que devuelve un Enumeration de strings.

Puede que algunos clientes recojan informacin de

un servlet. Para ello se puede hacer polimorfismo del mtodo getServletInfo que debe devolver un String. Revisar: examples\servlets\ej8_listheaders_se rvlet

Listando Cabeceras
http://localhost:8080/myapp/servlet/PruebaServlet // compile: javac -classpath %TOMCAT_HOME%\common\lib\servlet-api.jar PruebaServlet.java import javax.servlet.*; import javax.servlet.http.*;

import java.io.*;
import java.util.*; public class PruebaServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Enumeration enumeration = request.getHeaderNames(); while (enumeration.hasMoreElements()) { String header = (String) enumeration.nextElement(); out.println(header + ": " + request.getHeader(header) + "<BR>"); } }

Servlets: Polticas de acceso concurrente (threading)


Los servlets estn diseados para soportar mltiples accesos simultneos por defecto.

El problema puede surgir cuando se hace uso de un recurso compartido.


Se exponen soluciones a poder considerar:
Hacer que el servlet permita un nico acceso cada vez.
Hacer que el recurso sea el que posea la poltica de

acceso concurrente.

Servlets: Polticas de acceso concurrente (threading)


Para hacer que el servlet trate a un cliente

cada vez, nicamente hay que hacer que nuestra clase, adems de heredar de HttpServlet, implemente la interfaz SingleThreadModel que es una interfaz sin mtodos.

Servlets: Accediendo a variables CGI


Una coleccin de informacin derivada de muchos elementos que es accesible a travs del

objeto HttpServletRequest y el contexto del servlet. Estas variables pueden ser proporcionadas por:

La peticin (la lnea de peticin o parte del URI o las

cabeceras). Del socket en s (la IP). De los parmetros de instalacin del servidor web (los mapeos de las URL a los paths).

Servlets: Accediendo a variables CGI


AUTH_TYPE El esquema especificado si se recibe una cabecera Authorization. Puede ser basic o digest. request.getAuthType() CONTENT_LENGTH Solo para peticines POST e indica el numero de bytes enviados. String.valueOf(request.getContentLength()) o request.getContentLength CONTENT_TYPE El tipo de MIME. request.getContentType() DOCUMENT_ROOT La ruta el directorio http://host/ getServletContext().getRealPath("/") http_XXX_YYY Acceso a libreras HTTP request.getHeader("Xxx-Yyy")

Servlets: Accediendo a variables CGI


PATH_INFO Informacin de path aadida a la peticin. De todas formas no tiene por que ser tratada de manera independiente (no como en los CGIs). request.getPathInfo() PATH_TRANSLATED Informacin de path de mapeo en el las rutas reales del servidor. request.getPathTranslated() QUERY_STRING Para las peticines GET. Es un string aun codificado en URL. Mejor usar request.getParameter request.getQueryString() REMOTE_ADDR La IP del cliente. request.getRemoteAddr() REMOTE_HOST El nombre de dominio del cliente. Si no se puede devuelve la IP. request.getRemoteHost()

Servlets: Accediendo a variables CGI


REMOTE_USER La parte de usuario de una cabecera Authorization. request.getRemoteUser() REQUEST_METHOD El tipo de peticin: GET, POST, HEAD, PUT, DELETE, OPTIONS, o TRACE. request.getMethod() SCRIPT_NAME El path al servlet request.getServletPath() SERVER_NAME El nombre del servidor web request.getServerName() SERVER_PORT El numero del puerto donde el servidor web esta escuchando. Equivalente a String.valueOf(request.getServerPort()) Pero directamente request.getServerPort()

Servlets: Accediendo a variables CGI


SERVER_PROTOCOL Nombre y versin usados en la lnea de peticin (e.i. HTTP/1.0 or HTTP/1.1). request.getProtocol()

SERVER_SOFTWARE
Informacin de identificacin del servidor web getServletContext().getServerInfo()

Servlets: Respondiendo: Cdigos de estado


La respuesta esta compuesta por:

Una lnea de estado (200 OK). Cabeceras de respuesta. Una lnea en blanco. Un documento.

La lnea de estado indica la versin del protocolo http y un cdigo de estado para indicar diferente informacin al cliente:
Enviar al usuario a otros enlaces. Indicar que el contenido es una imagen, PDF... Requerir un password.

Servlets: Respondiendo: Cdigos de estado


La lnea de estado consta de:
Versin del protocolo HTTP: La suministra el servidor. El cdigo de estado: Lo podemos indicar nosotros.

Usar el mtodo setStatus de HttpServletResponse. Un mensaje: Suele estar relacionado con el cdigo de estado.

El cdigo debe indicarse antes de cualquier acceso al PrintWriter.

Ejemplo HTTP Response


HTTP/1.1 200 OK Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 22 Jun 1998 09:23:24 GMT Content-Length: 6821 Connection: close Content-Type: text/html

Cuerpo de la respuesta ...

Servlets: Respondiendo: Cdigos de estado


Aunque setStatus es la manera ms flexible, hay unos cdigos muy comunes y unos

mtodos para usarlos:


sendError enva un mensaje de error 404. sendRedirect que se usa para enviar un mensaje

302 conjuntamente con la cabecera de respuesta Location indicando la nueva URL.

Es importante conocer la versin de protocolo HTTP soportado con getProtocol de HttpServletRequest.

Servlets: Respondiendo: Cdigos de estado


100 Continue Continuar con la peticin parcial. (HTTP 1.1) 101 Switching Protocols El servidor debera responder con la cabecera Upgrade y asi cambiar de protocolo. (HTTP 1.1) 200 OK

Todo correcto. Por defecto en los servlets.


201 Created El servidor ha creado un documento. En la cabecera Location se incluye la URL. 202 Accepted La peticin ha sido aceptada pero el procesamiento no ha terminado.

Servlets: Respondiendo: Cdigos de estado


203 Non-Authoritative Information El documento ha sido devuelto correctamente pero alguna cabecera es incorrecta (HTTP 1.1) 204 No Content No hay nuevo documento. El cliente debe presentar el actual. 205 Reset Content No hay nuevo documento pero el cliente debe refrescar el actual. Para resetear las variables CGI de los formularios (HTTP 1.1) 206 Partial Content El cliente envio una peticin parcial con una cabecera Range y el servidor la ha rellenado. (HTTP 1.1) 300 Multiple Choices El documento que se ha solicitado se puede encontrar en mltiples sitios. La preferida o por defecto del servidor se ha de indicar en la cabecera Location.

Servlets: Respondiendo: Cdigos de estado


301 Moved Permanently El documento solicitado est en otro sitio. Se indica la URL en la cabecera Location. El navegador debera ir directamente. 302 Found Similar a 301, pero la nueva URL debe entenderse como temporal. "Moved Temporarily" en HTTP 1.0, con la constante SC_MOVED_TEMPORARILY de HttpServletResponse, (no SC_FOUND). Tambien se puede usar el mtodo directo response.sendRedirect(url).

303
See Other Lo mismo que 301/302. (HTTP 1.1) 304 Not Modified Cuando se determina que el cliente hace una peticin condicional y se quiere indicar que el documento que actualmente posee es el correcto (e.i. como respuesta a una cabecera If-Modified-Since). 305 Use Proxy El documento solicitado debera ser accedido por el proxy indicado en la cabecera Location. (HTTP 1.1)

Servlets: Respondiendo: Cdigos de estado


307 Temporary Redirect Identico a 302. No hay una variable en HttpServletResponse. (HTTP 1.1) 400 Bad Request peticin con sintaxis errnea. 401 Unauthorized El cliente intento acceder a una pagina protegida con password sin la autorizacion necesaria. La respuesta incluye una cabecera WWW-Authenticate para que el cliente introduzca los datos en un dialogo que envia sus datos en la cabecera Authorization. 403 Forbidden El recurso no esta disponible por un error en el servidor (permisos, acceso erroneo). 404 Not Found El recurso no pudo ser accedido. Posee un mtodo propio HttpServletResponse: sendError(message).

Servlets: Respondiendo: Cdigos de estado


405 Method Not Allowed El mtodo de peticin (GET, POST, HEAD, DELETE, PUT, TRACE, etc.) no es permitido para el recurso solicitado. (HTTP 1.1)

406
Not Acceptable Incompatibilidad de tipo MIME. (HTTP 1.1) 407 Proxy Authentication Required Lo mismo que 401, pero se obliga a usar una cabecera Proxy-Authenticate por parte del servidor. (HTTP 1.1) 408 Request Timeout El cliente tardo demasiado en enviar una peticin. (HTTP 1.1) 409 Conflict Generalmente en mtodo PUT. Suele enviarse si se ha solicitado una versin incorrecta de un recurso. (HTTP 1.1)

Servlets: Respondiendo: Cdigos de estado


410 Gone El documento no esta disponible. La diferencia con 404 es que tiene carcter temporal. (HTTP 1.1) 411 Length Required El servidor no puede procesar la peticin si el usuario no enva una cabecera Content-Length. (HTTP 1.1) 412 Precondition Failed Alguna precondicin especificada en las cabeceras de peticin era falsa. (HTTP 1.1) 413 Request Entity Too Large El documento solicitado es mayor de lo que el servidor esta dispuesto a gestionar. Si el servidor estar dispuesto de gestionarlo mas tarde deber incluir una cabecera de respuesta RetryAfter. (HTTP 1.1) 414

Request URI Too Long La URL es demasiado larga. (HTTP 1.1)

Servlets: Respondiendo: Cdigos de estado


415 Unsupported Media Type La peticin esta en un formato desconocido. (HTTP 1.1) 416 Requested Range Not Satisfiable El cliente introdujo una cabecera Range inadecuada en su peticin. (HTTP 1.1) 417 Expectation Failed El valor de la cabecera de peticin Expect no se ha podido contrastar. (HTTP 1.1) 500 Internal Server Error Un mensaje genrico para indicar que el servidor est confuso. 501 Not Implemented El servidor no posee la funcionalidad para completar la peticin. Por ejemplo si el usuario ha hecho una peticin PUT que el servlet no es capaz de procesar. 502 Bad Gateway Usado por servidores que funcionan como proxies o puertas de enlace para indicar que recibi una respuesta incorrecta por el servidor remoto.

Servlets: Respondiendo: Cdigos de estado


503 Service Unavailable El servidor no puede responder por mantenimiento o colapso de conexiones. Se puede enviar conjuntamente a una cabecera Retry-After. 504 Gateway Timeout Usado por servidores que funcionan como proxies o puestas de enlace para indicar que no recibido respuesta del servidor remoto en un tiempo adecuado. (HTTP 1.1) 505 HTTP Version Not Supported El servidor no es capaz de responder a la version del protocolo http indicado en la peticin. (HTTP 1.1)

Servlets: Respondiendo: Cabeceras de respuesta


Un componente ms en la lnea de estado. ntimamente ligadas con los cdigos de estado.
Especificar cookies Suministrar la fecha de modificacin (para la cach) Instruir al navegador sobre la recarga de la pgina

despus de un intervalo designado Decir cuanto tiempo va a estar el fichero usando conexiones persistentes ...

Servlets: Respondiendo: Cabeceras de respuesta

El mtodo ms general para indicar una cabecera de respuesta es setHeader de HttpServletResponse y recibe 2 strings:
1. 2.

El nombre de la cabecera. El valor de la cabecera.

Antes de usar PrintWriter.

Existen 2 mtodos para cabeceras relacionadas

Servlets: Respondiendo: Cabeceras de respuesta


con:

FECHAS: setDateHeader para ahorrar el tener

que pasar una fecha Java (Date) a milisegundos. ENTEROS: setIntHeader para ahorrar el tener que pasar un entero a String.

Servlets: Respondiendo: Cabeceras de respuesta


Se puede consultar si una cabecera ya ha sido

indicada en la respuesta mediante el mtodo containsHeader. Para aadir un valor a una cabecera que ya haya sido seleccionada, se usan los mtodos addHeader, addDateHeader y addIntHeader.

Servlets: Respondiendo: Cabeceras de respuesta


"HttpServletResponse" tambin suministra unos mtodos para especificar cabeceras comunes:
"setContentType" selecciona la cabecera Content-

Type. "setContentLength" selecciona la cabecera Content-Length, til si el navegador soporta conexiones HTTP persistentes (keep-alive). "addCookie" selecciona un cookie (no existe el correspondiente setCookie, ya que es normal que haya varias lneas Set-Cookie). "sendRedirect" selecciona la cabecera Location y el cdigo de estado 302.

Servlets: Respondiendo: Cabeceras de respuesta


Allow Indica los mtodos que soporta el servidor Content-Encoding Indica el mtodo usado para codificar el documento. El usar compresin puede reducir el tamao de los documentos pero antes es mejor asegurarse que la compresin esta soportada usando la cabecera Accept-Encoding (e.i. request.getHeader("Accept-Encoding")). Content-Length Indica el numero de bytes que se estn enviando. Solo es necesaria si se estn usando conexiones http persistentes (sep-alive). Lo mas sencillo es escribir en un ByteArrayOutputStream, luego ver el tamao e indicarlo en Content-Length y al final enviarlo con byteArrayStream.writeTo(response.getOutputStream()). Content-Type Indica el tipo de codificacin MIME del documento. Por defecto es text/plain, por lo que se suele indicar text/html. Existe un mtodo para ello en HttpServletResponse que es setContentType. Date Indica la hora actual. Hay que usar el mtodo setDateHeader.

Servlets: Respondiendo: Cabeceras de respuesta


Expires Indica el tiempo en el que el contenido debe considerarse no valido y por lo tanto no introducirlo en la cache. Last-Modified Indica cundo cambio el documento por ltima vez. El cliente puede preguntar por ello usando la cabecera de peticin If-Modified-Since que se trata como una GET condicional y se responde con Last-Modified si la fecha es posterior. En otro caso se envia 304 (Not Modified) como estado. Usar setDateHeader. Location Indica la URL donde el cliente debe ir. Se suele usar con el estado 302 y el mtodo sendRedirect de HttpServletResponse. Server Indica el tipo de servidor. No lo suele indicar el servlet sino el propio servidor web. Set-Cookie Indica la cookie asociada a la pgina. Es recomendable no usar response.setHeader("Set-Cookie", ...), y en su defecto addCookie de HttpServletResponse.

Servlets: Respondiendo: Cabeceras de respuesta


Refresh Indica cundo debera pedir el navegador una pgina actualizada. En lugar de recargar la pgina actual, podemos especificar otra pgina a cargar mediante setHeader("Refresh", "5; URL=http://host/path"). Se suele seleccionar mediante la cabecera HTML <META HTTP-EQUIV="Refresh" CONTENT="5; URL=http://host/path"> en la seccin HEAD, mejor que una cabecera explcita desde el servidor. Esto es porque la recarga o el reenvio automtico es algo deseado por los autores de HTML que no tienen accesos a CGI o servlets. Pero esta cabecera significa "Recarga esta pgina o ve a URL especificada en n segundos" y no significa "recarga esta pgina o ve la URL especificada cada n segundos". Por eso tenemos que enviar una cabecera Refresh cada vez. De todas formas no es una cabecera oficial del HTTP 1.1, pero es una extensin soportada por Netspace e Internet Explorer WWW-Authenticate Indica el tipo de autorizacin y dominio que debera suministrar el cliente en su cabecera Authorization. Esta cabecera es necesaria en respuestas que tienen una lnea de estado 401 (Unauthorized). (e.i. response.setHeader("WWWAuthenticate", "BASIC realm=\"executives\"")).

Servlets: Acceso a recursos

ACCEDER A RECURSOS DEL SERVIDOR


Posibilidades:
1. 2. Hacer que el servlet haga una peticin HTTP. Pedir el recurso mediante el "RequestDispatcher".

Para acceder al RequestDispatcher hay que recoger el contexto del servlet mediante el mtodo getServletContext.

Servlets: Acceso a recursos


Seguidamente debemos acceder al recurso:
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(/pagina.html");

Una vez tenemos el recurso accesible podemos: Hacer que el recurso sea el encargado de dar la respuesta a la peticin. Usamos el mtodo forward por lo que no podemos responder nosotros. Hacer una respuesta conjunta a la peticin entre el recurso y nuestro servlet usando el mtodo include

Servlets: Acceso a recursos


En otra ocasiones puede que se quiera

compartir recursos entre distintos servlets. Hacer uso de los atributos del ServletContext. til para servlets del mismo servidor y sobre todo para servlets de la misma aplicacin.

Servlets: Acceso a recursos


CONVENCIN PARA NOMBRES DE ATRIBUTOS: Se suele usar la misma

nomenclatura usada para los paquetes para evitar conflictos.


Aadir un atributo: Se usa el mtodo

setAttribute de ServletContext. Esto se suele hacer en la inicializacin del servlet. El control de que varios servlets manejen un mismo atributo es responsabilidad del desarrollador. Recoger un atributo: Se usa el mtodo getAttribute de ServletContext. Hay que convertir el objeto que devuelve al tipo requerido.

Servlets: Acceso a recursos


Eliminar un atributo: Se puede eliminar un atributo del

contexto usando el mtodo removeAttribute de ServletContext.

Reenviando Respuestas
Es posible delegar el procesamiento de un servlet a otro mediante la clase

javax.servlet.RequestDispatcher Define dos mtodos:


include sirve para incluir contenido de otro

recurso forward para enviar una peticin de un servlet a otro


Difiere de HttpServetResponse.sendRedirect(), que redirige la peticin con la ayuda del navegador

Reenviando Respuestas
Para obtener un objeto RequestDispatcher:
A partir del mtodo getRequestDispatcher o

getNamedDispatcher de javax.servlet.ServletContext path recibido relativo al directorio raz del servidor o nombre del recurso El mtodo getRequestDispatcher de javax.servlet.ServletRequest recibe un path como parmetro relativo a la peticin actual HTTP

Reenviando Respuestas
// Revisar: examples\servlets\ej10_include_servlet RequestDispatcher rd = request.getRequestDispatcher("/servlet/SecondSe rvlet?name=diego"); rd.include(request, response); // Revisar: examples\servlets\ej11_forward_servlet RequestDispatcher rd = request.getRequestDispatcher("SecondServlet"); rd.forward(request, response);

Gestin de Sesiones
HTTP no tiene estado Necesario utilizar trucos para permitirlo:
Reescritura de urls Campos hidden <input type=hidden

name=saludo value=hola> Cookies HttpSession

Servlets: Respondiendo: Cookies


Pequeos trozos de informacin textual que el servidor puede enviar al cliente y que ste no

modifica y reenva al servidor cuando vuelve a visitar el mismo sitio.


Identificar a un usuario concreto. Para sitios con baja necesidad de seguridad, poder

evitar el login y password. Personalizar las webs recordando cada peculiaridad de cliente. Publicidad enfocada (personalizada) dado que se puede almacenar informacin sobre las preferencias del usuario mientras navega, busca informacin etc.

Servlets: Respondiendo: Cookies


Las cookies no son un grave problema de seguridad. Los navegadores slo permiten 20 cookies por sitio web y 300 en total. Limitadas a 4kb. Pueden ser un problema de privacidad. Puede que algunos usuarios desactiven las cookies por diversas razones por lo que no se recomienda depender completamente del uso de ellas.

Servlets: Respondiendo: Cookies


Para utilizar cookies lo nico que hay que hacer es: 1) Crear una cookie: new Cookie(String name, String value) El nombre no puede contener ni espacios ni:

[ ] ( ) = , " / ? @ : ; 2) Especificar algn atributo a la cookies mediante alguno de sus mtodos:


la cookie.

getComment/setComment: Comentarios asociados a

Servlets: Respondiendo: Cookies


getDomain/setDomain: Indicar el dominio al

que se aplica la cookie. Por defecto la cookie se devuelve a la misma direccin que la envi, pero as podemos indicar que se reenve a otros servidores en el mismo dominio. El dominio debe empezar por un . getMaxAge/setMaxAge: Indicar el tiempo que debe pasar en segundos hasta que la cookie expire. Si no se indica la cookie dura una sesin.

Servlets: Respondiendo: Cookies


getName/setName: Indicar el nombre de la

cookie. getPath/setPath: Indica a que rutas responde la cookie. Si no se indica nada, la cookie se enva para cualquier pgina en el mismo path actual. Se podra usar para usos generales como someCookie.setPath("/"). Hay que incluir al menos el directorio actual. getSecure/setSecure: Slo vale para sesiones seguras (e.i. SSL).

Servlet: Respondiendo: Cookies


getValue/setValue: Indicar el valor de la

cookie. getVersion/setVersion: Indicar con que version del protocolo funciona esta cookie.

3) Aadir la cookie a la respuesta:

response.addCookie(Cookie)

Servlets: Respondiendo: Cookies


Para acceder a las cookies que el cliente

reenva cada vez que accede al recurso se usa el mtodo getCookies de HttpServletRequest que devuelve un array de cookies. Con los mtodos getName y getValue de Cookie se accede a la informacin de la cookie.

Servlets: Seguimiento de sesin


El protocolo HTTP no posee la capacidad de almacenar

estados. Se complican mucho las tareas de guardar las acciones (e.i. Compras) de un usuario. 3 posibles soluciones:
Cookies. Aadir informacin en la URL Usar campos ocultos de formularios (HIDDEN)

Revisar:

examples\servlets\ej12_cookie_servlet

Servlets: Seguimiento de sesin


Los servlets proporcionan una solucin

tcnica: La API HttpSession. Una interfaz de alto nivel construida sobre los cookies y la reescritura de las urls (pero transparente para el desarrollador). Permite almacenar objetos.

Servlets: Seguimiento de sesin


Pasos para trabajar con sesiones:
BUSCAR EL OBJETO HttpSession

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

Servlets: Seguimiento de sesin


BUSCAR INFORMACION ASOCIADA A LA SESION:

Usar los mtodos getValue (o getAttribute para versiones del API Servlet 2.2+) que devuelve un Object o null. Para asignar un valor dentro de una sesin se usa el mtodo putValue (o setAttribute para versiones del API Servlet 2.2+). Para conocer los nombres de los valores estn los mtodos getValueNames (o getAttributeNames para versiones del API Servlet 2.2+) que devuelve un Enumeration. Existen otros mtodos que aportan informacin sobre la sesin.

Servlets: Seguimiento de sesin


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

Servlets: Seguimiento de sesin


AADIR INFORMACION A UNA SESION: Los mtodos

putValue y setAttribute eliminan (machacan) el valor anterior del atributo por lo que para aadir informacin hay que recuperar el valor primero y despus de modificarlo, volver a pasarlo a la sesin. INVALIDAR UNA SESION: Automticamente el servidor web invalida tras un periodo de tiempo (30) sin peticiones o manualmente usando el mtodo invalidate.

Revisar:

examples\servlets\ej13_session_servlet

JDBC de Javasoft: arquitectura I


Aplicacin Java Aplicacin Java API JDBC Gestor de Drivers Driver API JDBC-ODBC Tipo 1 API Nativo Parte en Java Tipo 2 Driver de Red en Java Puro Tipo 3
Protocolo de Red Propietario

Protocolo Nativo Driver en Java Tipo 4

Gestor de Driver ODBC Driver ODBC

Driver de SGBD Nativo

Servidor

Driver de SGBD Nativo


Protocolo SGBD Nativo Protocolo SGBD Nativo Protocolo SGBD Nativo Protocolo SGBD Nativo

JDBC de Javasoft: arquitectura II


Gestor de drivers es ncleo de arquitectura y comunica aplicaciones Java con cuatro tipos

diferentes de drivers:
Puente ODBC-JDBC ms el driver ODBC
Traduce JDBC en ODBC No adecuado si parte cliente es annima
Necesidad de registrar fuente ODBC en cada mquina

Uso: aplicaciones de dos capas en red local

JDBC de Javasoft: arquitectura III


API Nativo parte en Java:
Traduce JDBC en protocolo especfico de BD: Oracle JDBC/OCI driver Requieren algo de cdigo nativo en cada mquina cliente en forma de un driver especfico que se debe instalar Uso: servidores RMI, servlets

Driver de Red en Java Puro:


Utiliza protocolo comunicaciones publicado para la comunicacin con un servidor remoto Servidor se comunica con la BD utilizando ODBC o un driver nativo Java puro: applets se descarga lo mnimo No requiere cdigo instalado en mquina cliente

JDBC de Javasoft: arquitectura IV


Protocolo nativo en Java Puro: Implementan protocolo de BD de un suministrador Especficos para BD concreta No tienen necesidad de intermediarios Alto rendimiento

JDBC URLs
URL: esquema de nombres para

localizar BD Sintaxis:
jdbc:<subprotocolo>:<subnombre> jdbc:odbc:cliente jdbc:msql://www.deusto.es:1112/c

atalogo jdbc:mysql://localhost:3306/docm an

Correspondencia tipos SQL/Java


Tipo SQL CHAR VARCHAR NUMERIC BIT INTEGER REAL DATE TIME Tipo Java string string java.math.BigDeci mal boolean int float java.sql.Date java.sql.Time Un carcter Cadena de caracteres de longitud variable Valor numrico para cantidades econmicas Valor binario (0 o 1) Entero de 32 bits con signo Valor en punto flotante Formato Fecha aaaa-mm-dd Formato Hora hh-mm-ss Descripcin

JDBC API: java.sql.* I

Carga de un driver
Crea instancia de si mismo Se registra con el gestor
String myDriver = sun.jdbc.odbc.JdbcOdbcDriver; Class.forName(myDriver);

Conexin a la BD:
String url = jdbc:odbc:clientes; String user = dba; String pass = sql; Connection dbCon = DriverManager.getConnection(url, user, pass);

JDBC API: java.sql.* II


Ejecucin de sentencias SQL


Statement stmt = dbCon.createStatement();

executeQuery() 1 conjunto de resultados ResultSet res = stmt.executeQuery(select * from compradores where prio=1); executeUpdate() DML (insert, update, deletee) n filas afectadas DDL (create table) 0 int total = stmt.executeUpdate(insert into prioridad (cod-pri, descripcion) values (4, crtica)); execute () Cuando no se sabe que va a devolver ResultSet o n

3 posibilidades:

JDBC API: java.sql.* III

Otras posibilidades:
PreparedStatement, se genera el plan de acceso la primera vez que se solicita la ejecucin
PreparedStatement ps = dbCon.prepareStatement(sqlString);

Defecto automtico (1 SQL 1 commit) Deshabilitar (N SQL 1 commit o rollback) dbCon.setAutoCommit(false); dbCon.commit();

CallableStatement procedimientos almacenados Acceso al esquema o metadatos Control transaccional superficial

Un ejemplo JDBC
import java.sql.*; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:CuentasBD"; con = DriverManager.getConnection(url, "", ""); stmt = con.createStatement(); Vector cuentas = new Vector(); String sql = "select * from CUENTAS order by numeroCTA"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { cuentas.add(new CuentaBancaria(rs.getString("numeroCTA"), rs.getDate("fechaExpiracion"), rs.getFloat("saldo"))); } stmt.close(); con.close();

SQL Inmerso (Embedded SQL ESQL) ESTTICO


El lenguaje de programacin junto con el cual se utiliza

SQL se denomina lenguaje anfitrin Objetivo: insertar sentencias SQL en aplicaciones codificadas en cualquier lenguaje:
separar las instrucciones de SQL inmerso y el cdigo del lenguaje anfitrin:

C, C++, COBOL, FORTRAN, Pascal, ADA y Java Identificadores especiales para cada lenguaje, se usan para Java SQLJ: # sql {insert into Pedidos values(:p1 :p2}; C PRO*C: EXEC SQL DECLARE stu_cursor CURSOR FOR SELECT * FROM STUDENT ORDER BY NAME;

Precompilador genera cdigo en lenguaje apropiado a

partir de las sentencias SQL incrustadas

SQL Embebido (Embedded SQL ESQL) (cont)


Ventajas:
Verificacin de sintaxis en tiempo de

compilacin mayor eficiciencia

Desventajas:
BD debe ser conocida y su esquema accesible en

tiempo de compilacin Precompiladores no estndar y propietario para cada BD

String vName; int vSalary; String vJob; Java.sql.Timestamp vDate; ... ESTTICO SQLJ #sql { SELECT Ename, Sal INTO :vName, :vSalary FROM Emp WHERE Job = :vJob and HireDate = :vDate };

SQLJ vs. JDBC

String vName; int vSalary; String vJob; Java.sql.Timestamp vDate; ... DINMICO JDBC PreparedStatement stmt = connection.prepareStatement( "SELECT Ename, Sal " + "FROM Emp " + "WHERE Job =? and HireDate = ?"); stmt.setString(1, vJob); stmt.setTimestamp(2, vDate); ResultSet rs = stmt.executeQuery(); rs.next(); vName = rs.getString(1); vSalary = rs.getInt(2); rs.close();

Servlet con JDBC


// examples\servlets\ej14-db_servlet public class RegistrationServlet extends HttpServlet { private private private private String String String String firstName = ""; lastName = ""; userName = ""; password = "";

public void init() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); System.out.println("JDBC driver loaded"); } catch (ClassNotFoundException e) { System.out.println(e.toString()); } }

Servlet con JDBC


public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException { sendPageHeader(response); firstName = request.getParameter("firstName"); lastName = request.getParameter("lastName"); userName = request.getParameter("userName"); password = request.getParameter("password"); boolean error = false; String message = null; try { Connection con = DriverManager.getConnection("jdbc:odbc:UsersDB"); System.out.println("got connection: " + password); Statement s = con.createStatement(); String sql = "SELECT UserName FROM Users" + " WHERE userName='" + StringUtil.fixSqlFieldValue(userName) + "'"; ResultSet rs = s.executeQuery(sql); System.out.println("Ejecutando select: "); if (rs.next()) { rs.close(); message = "The user name <B>" + StringUtil.encodeHtmlTag(userName) + "</B> has been taken. Please select another name."; System.out.println(message); error = true; } // ...

Servlet Filters
Un filtro te da acceso a los objetos

HttpServletRequest y HttpServletResponse antes y despus, respectivamente, de que lleguen a un recurso web. Los filtros se declaran en el web.xml con el elemento xml <filter> y su uso se indica mediante <filtermapping>
Se puede asociar un filtro a un patrn de url Adems los filtros se pueden encadenar

Definidos por los interfaces: Filter, FilterConfig

y FilterChain Revisar: examples\servlets\ej15_filter_servlet

Ejemplo Filter
// compile: javac -classpath %TOMCAT_HOME%\common\lib\servletapi.jar;. UpperCaseFilter.java import java.io.*; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import java.util.Enumeration; public class UpperCaseFilter implements Filter { private FilterConfig filterConfig = null;
public void destroy() { System.out.println("Filter destroyed"); this.filterConfig = null; }

Ejemplo Filter
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("Filter"); Enumeration enum = request.getAttributeNames(); while (enum.hasMoreElements()) { String attributeName = (String) enum.nextElement(); String attributeValue = (String) request.getAttribute(attributeName); request.setAttribute(attributeName, attributeValue.toUpperCase()); } chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { System.out.println("Filter initialized"); this.filterConfig = filterConfig; } }

Web.xml
<web-app> <filter> <filter-name> Trim Filter </filter-name> <filter-class> TrimFilter </filter-class> </filter> <filter-mapping> <filter-name> Trim Filter </filter-name> <servlet-name> DoublyFilteredServlet </servlet-name> </filter-mapping> <servlet> <servlet-name> DoublyFilteredServlet </servlet-name> <servlet-class> DoublyFilteredServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>DoublyFilteredServlet</servlet-name> <url-pattern>/servlet/DoublyFilteredServlet</url-pattern> </servlet-mapping> </web-app>

Servlet
Son flexibles y muy potentes Sin embargo, es muy lioso mezclar cdigo de

marcado y cdigo Java


A menudo hay ms cdigo de marcado que cdigo

Java
SOLUCIN JSP