Vous êtes sur la page 1sur 13
Despliegue de Aplicaciones Web 176 insert into Libros value! (1002, *Apache Toncat 7°, *Aleksa Vukotic?, 22.22, 22); insert into libros value: (1003, *Beginning JSP, JSF,and Tomcat eb Development’, "Giulio Zambon’, 33.33, 33); Angert into Libros values (4004, *Toncat, the definitive guide’, ‘Jason Brittain’, 65.65, 55); Angert into Libros values (4005, *Profesional Apache Tomcat’, "Vivek Chopra’, 65.66, 65); select * from Libros; 1233, tyecuta el script con el comando: source C:\MySQL\TiendaLibros.txt |. Descarga del conector JDBC. JDBC es un API de Java para ejecutar sentencias SQL. Esta formado por un conjunto de clases ¢ interfaces programadas eon el propio Java. Permite interactuar con bases de datos, de forma transparente al tipo de In misma. Es decir, es una forma tiniea de programar el acceso a bases de datos desde Java, independiente del tipo de Ia base de datos. Puedes ampliar In informacién sobre JDBC en la http: // java.sun.con/ javase/technologies/ database/ index. jsp 3.1. Bn nuestro caso vamos a utilizar un driver nativo JDBC que permite la conectiv dad entre Java y MySQL. Puedes descargarlo de http: //www.mysql. com/products/ connector/, Figura 6.35. MySQL Connectors Seen ae a casei EReee SE Sad over for ys Commerc) caer tor msec emseion 8 Comecter er Opener Figura 6.35: Driver JDBC para MySQL 3.2. En conereto, descarga el archivo .2ip con el conector. En el momento de hacer esta doc ‘mentaci6n era mysql-connector-java-5.1.2U.zip. Una vez descargado descomprimelo y comprueba que esté el archivo mysql-connector-java-5.1,20-bin,jar que contiene ‘el conector. Capitulo 6. Aplicaciones JavaBE 4, Servlet de acceso a MySQL con JDBC. 4.1, Inicia Belipse y crea un nuevo proyecto Dynamic Web Project llamado AccesoDatos, Recuerda marcar Ia opeién para que se cree un descriptor de despliegue web.xml. 4.2, Para empezar a desarrollar la aplicacién vamos a crear una pagina HTML que seré. In interfaz de entrada con la que interactuaré el usuario. Afiade una pagina ConsultaLi- bros.html a la earpeta WebContent de tu proyecto AccesoDatos. Su eédigo sera el siguiente: TiendaLibros

Tienda Libros

Alvaro Garcia wutor" value="Aleksa Vukotic">Aleksa Vukotic Giulio Zambon 43, Bjecuta el proyecto desde Helipse para acceder a la pagina http: //Localhost :8080/ AccesoDatos/ConsultaLibros.html. Para ello pulsa con el botén derecho del ratén sobre cl fichero ConsultaLibros.html , olige la opeién Run as, Run on server, Figuras 6.36, 6.37. Esto hard que se inicie el servidor Tomcat que tenemos registrado en Belipse y que se ejecute la pagina seleccionada. 44, Si pulsamos el bot6n Buscar no funcionaré, porque hemos establecido que al enviar la pagina se ejecute In URL http: //localhost :8080/AccesoDatos/consulta que co- rresponderé al Servlet que todavia no hemos desarrollado.
4.5, Ahora vamos a desarrollar el Servlet de acceso a la base de datos, Lo primer que tenemos que realizar, para que el servidor Tomeat pueda ejecutar una aplicacién util zando el driver JDBC, es colocar el fichero mysql-connector-java-5.1.20-bin.jar en cl directorio CATALINA. HOME\ ib. 46, Reinicia el servidor desde elipse para que sea posible utilizar el conector. 4,7, Tas clases que conforman él API JDBC del conector se encuentran agrupadas en el paquete java.sql. Este paquete contiene clases para cargar los drivers, realizar las conexiones a las bases de datos, consultar los datos y manejar un conjunto de registros. ‘También posee las clases para el manejo de exoepeiones que se produzean en el acceso a bases de datos. wr Despliegue de Aplicaciones Web aS fea Dies ere ores Open » fost BS & cy cme Copy Quid tone Swot! austin . ac thane| Ree a per pet Shon Retest Figura 6.36: Bjecutar aplic “Rotate HT. “ni ouleale|- ‘Gonmoactge scot: | Tienda Libros 2B twa Resources Sct Sot ares emer Suan £9 Comets ps aclbasts90/rceetater/cnelta"> © plicihonriceno Conaivesent ig ator: CTAharo Garcia Ale Vat (Gio Zanbon (Bias) Figura 6,37: Pégina HTML de acceso a la aplicacién 4.8. A continuacién veremos los pasos que se realizan en una aplicacién con acceso a datos mediante JDBC: 1 Cargar el driver JDBC. 2 Conectarse a la Base de Datos utilizando la clase Connection. 3 Crear sentencias SQL, utilizando objetos de tipo Statement. 4 Bjecutar as sentencias SQL a través de los objetos de tipo Statement 5 Bn caso que sea necesario, procesar el conjunto de registros resultante utilizando la clase ResultSet. 49. Ahora crearemos el Servlet que se encargaré de hacer la consulta a la base de datos, nade el fichero ConsultaServlet. java a la carpeta Java Resources\ sre del proyecto ‘AccesoDatos ¢ introduce el siguiente eddigo Java. 17g. Capitulo 6. Aplicaciones JavaBE import, java.io.%; import Java.sql.* import javax.cervlet.+; import javax.serviet http. +; public class ConsultaServiet oxtonds HttpServiet { // B1 nétodo doGer() se ejecuta una vex por cada peticién HTTP GET. override public void doGet (ttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 1. Fetsblerenne a1 tp MIME dal manaaja da ranpnanta response..setContentType("text/htal") // Croanos un objeto para poder escribir 1a respuesta PrintWriter out = response. gotliriter(); Connection conn = mull; Statement stat = mull; ty { UfPaso 1: Cargar 1 driver JDBC. class. fortiane(*con.ayaql. Jato Driver") newInatanca(); // Paso 2: Conectarse 4 1a Base de Datos utilizando a clase Connection String userllane="root String pasevord="desplioguo"; /URL de 1a base de datos (equipo, puerto, base de datos) ‘String urle" jdbe:nysql://localhost/TiendaLibros"; conn = DriverManager.getConnection(url, userName, password) ; // Paso 8: Crear sentencias SQL, utilizando objetos de tipo Statement stat = conn.createStatenent(); 1/ Paso 4: Ejacutar las sentencias SQL a través de los objetos Statonont String aqlstr = "select * fron Libros uhere autor = " + 09+ request. getParaneter ("autor") + "7%; // Generar wna pégina HTML cono resultado de 1a consulta out.printin("chtml>chead>Resultado de 1a consulta "); out.printin("

Gracias por tu consulta.

") ; out.printin(""); RewullSet evel ~ stut.executequery (sqlSt) ; sultante utilizando ResultSet 11 Pago 8: Procesar el conjunto de registros int count = 0; while(rset.noxt()) { out printin("

" + rset. getString(“autor") +) © + reet.gotString(*titulo") + rsot.getDouble("precio") + "

") counts > ‘out .prantin( "

‘out -printin(""); Y catch (Exception ox) { + count +" rogistros encomtrades =====

"); 179 Despliegue de Aplicaciones Web ex.printStackTrace(); ¥ finally ¢ out.close(); // Cerranos el flujo de escritura wy ( // Corvanos e1 resto de recursos if (stmt |+ nut) stmt.close() if (conn |= null) conn.close() > cateh (SQLException ox) { ex.printStackTrace(); > 4.10. Finalmente y para que este Serulet sea accesible edita el descriptor de despligue aftadiendo la siguiente informacién: Consul tallsuario ConsultaServlet Consul taUsuario /consulta 4.11, Prueba a ejecutar el proyecto desde Helipse para comprobar su correcto funcionamiento. Recuerda que la pégina http: //Lecalhost :8080/AccesoDatos/ConsultaLibros. hts seré el punto de entrada a Is aplicacién, 4.12. Marea la opeién Alvaro Garcia y pulsa sobre el botén Buscar. Una peticién HTTP Get es ‘eaviada a la URL especificada en el atributo action de la etiqueta form: Observa Ia URL de la peticién HTTP GBT: inetp://Localhost :8080/AecesoDatos/consulta?autor-AlvarotGarcia La peticién consiste en dos partes, una URL correspondiente al atributo action y separado por una *?” aparece Ia pargja “name: cextraida de la etiqueta input. Observa cémo los blaneos son reemplazados por “+ porque los espacios en blanco no estan permitides en las URLs. 4.13. Si ocurriera algsin error en la ejecucién realizada desde Belipse se mostrarfa un mensaje en la consola, Figura 6.38, sn también presente que no es necesario volver a iniciar el servidor cada vez que realicemos un ‘cambio en el Servlet. Cualquier cambio en el cédigo es automsticamente reflejado en el servidor ‘Tomeat registrado en Belips. Aad, 180 Capitulo 6, Aplicaciones JavaEE cocaine Diane © mE Moabwases/AcaeConmaaLnesm Tienda Libros gees ator: bro Garcia Ai itt Ce Zahn [EEE [Pepe Ser 9 Oa Sore ow [E Henat9 Seascape one Cog el Entoresclen: starting retacenanior Pate i'n an esr we seoe Figura 6.38: La consola mostrard los errores de ejecucién 4.15. Despliegue de la aplicacién de Acceso a Datos con JDBC. Una vez que hemos comprobado en el entorno de desarrollo que la aplicacién funciona, deten- dremos el servidor Tomeat desde Helipse, Figura 6.39, Gaels por tm consulta, “Tecmo ot we mr =A Gr Aero Gara Seis de Ree re 280 reac ents xr Figura 6.39: Para el servidor Tomeat desde Eclipse 4.16. Es interesante indicar que la ejecucién del servidor Toment que realizamos deste Eclipse uti- liza sus propios ficheros de configuracién, Figura 6.40, diferentes de los ubicados CATALT- NA.HOME\cont 4.17. Exporta el proyecto AecesoDatos a un fichero AecesoDatos.war, marcando la opcién s0- breescribir si el fichero ya existe, 181 Despliegue de Aplicaciones Web 2 Serves “4 © Tomcatv2.0 Server at ocahost-contig policy catalina properties {8 contextxmi (i) several UX tomeat-serseml £8) webamt Figura 6.40: Ficheros de configuracién de Tomeat en Eelipse 4.18. Inicia ahora el servidor Tomcat, ejecutando el script de arranque startup, situado en CATA LINA_HOME\| 4.19. Para desplegar el proyecto en Tomeut, copia el fichero AccesoDatos.war en la carpeta CA- TALINA_HOME\webapps. 4.20. Puedes comprobar cémo funciona desde el navegador, Figura 6.41 Bete dete comate 4 € BD teat tn Roatan Gracias por tu consulta. “Ta consua es: select "from Hbros where autor= Alvaro Garcia’ ‘Alvaro Garcia, Senicos de Rede Internet, 25.0 == 1 registros encontrados = Figura 6.41: Funcionamiento de la aplicacién una vez desplegada 5. Peticiones POST. HTTP define los métodos para realizar peticiones: GET y POST. En este ejemplo hemos uusado el método GET, como especificamos en la pigina ConsultaLibros.html: La peticién GET es procesada por el método doGet del Serulet ConsultaServet {Cusl es Ia diferencia entre los dos métodas?. [in las peticiones POST los parémetzos se envian en el cuerpo de mensaje, por lo que no son visibles en la URL como pasa con las peticiones GET. Las ventajas radican en que: = El cliente no ve una extraiia cadena, query string, on la URL. «= Existe una limitacién en la longitud de la query string de la peticién GET, mientras ‘que la peticién POST earece de esa limitacién. 182 Capitulo 6. Aplicaciones JavaBE En Ia préctica es habitual utilizar el mismo método para gestionar tanto las peticiones GET y POST. Vamos a aplicar esta idea a nuestro ejemplo para que el serulet sea capaz de atender tanto las peticiones GET como las POST. |. Afiade una nueva pagina llamada pégina ConsultaLibrosPost.html con el siguiente eédigo: TiondaLibros

Tionda Libros

ELige un autor: Aleksa Yukotic checkbox" nane="autor" value="Giulio Zasbon">Giulio Zanbon subast" value="Buscar"> Observa edo hemos cambiado ef método por el eual se enviard la peticién method= “post”. ‘También hhomos cambiado la forma de indicar qué recurso serd el destinatario de la accién. Ahora indicamos action="consulta”, sin indicar su ruta absolute htep://Localhost :8080/AcceseDatos/consult, como hicimos en ConsultaL.ibros.html, Respecto al serulet que procesaré Ia peticién POST no es necesario escribir uno nuovo, simplemente Invocaremos al método doGet desde el método doPost que trataré Ia peticién POST. Afade el Siguiente cédigo al servlet ConsultaServlet public void doPost (HttpServletRequest request, littpServletResponse response) throws ServletException, IOException { doGet(request, response); // Redirecciona 1a peticién POST al método doGet() r Observa cémo utilizar Ia pigina ConsultaLibrosPost.html no aparecen los parémetros en la URL, Figura 6.42: PiResuitado dela consults + alos 290/acceseDater/eomule Gracias por tu consulta. ‘Ta consuta ex: select * fom bros where ator ='Alvaro Garcia! Atvaro Garcia, Servicios de Rede Internet, 25.0 registros encontrados —= Figura 6.42: Funcionamiento de la peticién POST 183, Despliegue de Aplicaciones Web 6.6. Sesiones con Servlets En esta préctica utilizaremos Servlets para gestionar sesiones en nuestra aplicacién, HTTP es un protocolo sin estado y no orientado a conexién, esto quiere decir que cada peticién xno conoce que se ha hecho en las peticiones anteriores. Sin embargo la mayorfa de las aplicaciones ‘comerciales necesitan: * Sesién, es decir, el servidor debe ser capaz de diferenciar distintas solicitudes de un mismo cliente. = Estado, es decir, el servidor debe ser eapaz de almacenar/recordar informacién de anteriores solicitudes de un cliente. Existen tres formas de gestionar las sesiones: Cookies. Pequeito fichero de texto almacenado en ol cliente que se envia al servidor en cada peticién. Se puede colocar Ia informacién dle In sesién en una cookie de sesién. El mayor problema se produce porque los clientes pueden deshabilitar las cookies. de la sesidn, 131908643. Es = Reescritura de URLs. Se afiade un texto al final de cada URL con la inform: or ejemplo http: //Localhost :8080/Sesiones/inicio. html; jsessioni necesario reescribir todas las URLs para incluir esta informacién = Campos ocultos en un formulario. Se pasa informacién de Ia sesién en campos ocultos del formulario. Hay que incluir esta informacién en todas las pi Programar In gestién de la sesién mediante estos mecanismos puede resultar tedioso y complejo. Para mejorar esta situacién el API Servlet proporciona un mecanismo de gestién de sesiones mediante la interfaz, HltpSession que permite: = Gestionar Ia sesién, + Visualizar informacion de Ia sesién como su identificador o fecha de creacién, += Enlazar objetos a la sesién permitiendo que la informacién del usuario se mantenga a lo largo de miiltiples peticiones. La especificacién del API Serulet realiza el registro de sesién utilizando el mecanismo de cookies, debido a que el servidor configura autométicamente una cookie “jsessionid” para el control de la sesién. $i el navegador del cliente no admite cookies autométicamente se emplea reescritura de URE. 1. Para realizar un ejemplo de sesiones inicia sesi6n en el equipo DesarrolloWTXX. 2. Vamos a probar a crear y recuperar objetos de sesidn con los métodos session.setAttribute y session.getAttribute. También veremos emo obtener otra informacién de la sesién como sit identificador o su tiempo maximo permitido de inactividad. 3. Crea un nuevo Dynamic Web Proyect llamado Sesiones y aijacle un Servlet llamado Ses- sionServlet.java con el siguiente eédigo: import java.io.*; smport javax.eervlet. import javax.servlet.http.¢; import java.util.Date; 184 Capitulo 6. Aplicaciones JavaBE public class SessionServlet extends HtepServiet { Override public void doGet (HttpServletRequest request, HttpServletRespon ‘throws IOException, ServletException { // Bstablece 61 tipo MINE del mensaje de respuesta reeponse.setContentType("text/htal") ; 7/ Crea wn flujo de ealida para escribir 1a respuesta a 1a peticién dol cliente Printiiriter out = response. getifriter(); response) // Racoge 1a seeién actual si existe, en otro caso crea una nueva HetpSeasion session = request.cotSossion() Integer contadorAcces: synchronized (session) { ‘contadoriccesos = (Integer) 4£ (contadorecesos == mull) { contadorkecesos = 0: } else { contadoriccesos = new Integer(contadorAccesos + 1) son. gotAttribute ("contadorAccesos' ? session. cotAttribute("contadoricc + contadortccesos) ; y // Bacribe el wensaje de respuesta on una pégina htal try ‘out println("") ; out .printin(*"); out printIn(*Accesos: " + contadorAccesos +" on esta sesién."); out. printin("

(Identificador de sesién: " + sossion.getTa() + ")

"); out printin(*

(Facha de creaciéa de la sesién: "+ new Date (session. gatCreationTine()) + "

"; out printin("

(Facha de ditino acceso a la sesién " + new Date(session.gatLastAccessedTime()) + ")

" out printin("

(Maximo tiempo inactivo de 1a sesién: " + session.getMaxInactivelnterval() +" seconds)

"); out. printin("

Refrescar"); out printIn("

Rofrescar con reescritura de URLs"); out .printIn("") ; 2 finely { out-close(); // Cerrar el flujo de salida UTP-8'>"); > r > 4, Afinde ahora la siguiente informacién al descriptor de despliegue: ServletPruebaSesion SeseionServlet 185, Despliegue de Aplicaciones Web 10, 4 12, 13, 186 ServletPrucbaSesion /prusbasesion . Exporta el proyecto Sesiones a un fichero Sesiones.war, marcando la opeién sobreescribir si el fichero ya existe Inicia ahora el servidor Tomcat, ejecutando el script de arranque startup, situado en CATALI- NAHOME\bin Para docplegar ol pengecta en ‘Tament, copia el Richero Sesiones.war en Ia carpeta CATALI- NA_HOME\webapps. ‘Accede a la aplicacién con Ia siguiente URL htep: //locathost:8080/Sesiones/pruebasesion, Fi- gura 6.43, [Bs speci El ess Has accedido a este sitio 2 veces en esta sesién. (enador de resi: $1DODGEBL468CEDI94CISEEFEES2955) (ect de renin dea ses: Sm J 08 20.4617 CEST 2012) (ect di ceo a ss Son Jo 0 204620 CEST 2012) (tine Sompo nave de ses 1800 second) Refer esscr sonseceines de URLs Figura 6.43: Sesiones Realiza las siguientes pruebas: * Actualiza Ia pagina pulsado FS o el enlace Refrescar. * Abre otra pestaiia en el navegador y comprueba cémo se conserva In sesién, + Cierra el navegador y vuelve a abrislo y comprueba cémo se ha perdido la sesién, A continuacién accede utilizando Firefor a nuestra aplicacién nttp: //Locathost:8080/Sesiones/ prucbasacion. Sobre la psigina web, pulsando con el botén derecho del ratén en Ver informacién de la pagina, cen Ia pestaiia Seguridad, Ver cookies, puodes observar la cookie que ha enviado nuestra aplicacién, para gestionar Ia sesign, Pigura 6.44 Si observas Ia cookie puedes ver o6mo su nombre es JSBSSIONID y su contenido es el identificador de la sosién que también puedes ver en la pagina web. Por defecto el método que utiliza API Servlet para gestionar la sesién son las cookies, pero si estas cstuvieran deshabilitadas on ol navegador dol eliento, automzticamente utilizara reescritura de URLs. isnt era ein (nnd sein: SIDODIEEBL ASH (Fecha crema ses: Se a 0821 Fecha ein aco alas Sn 08) (oti Sep inte dela ee 1802 Retest Refs coreecia de URLs Has accedido a este sitio 2 Capftulo 6. Aplicaciones JavaEE rs STi sesiacc| | ea Cater coin ec Afar stoe Figura 6.44: Cookie de sesién 14, Cuando se utiliza este método de gestién de sesiones, todas las URLs reescritas emitidas por el servidor deben pasar a través del método response.encodeURL( ) pata afiadir formacién de la 15, Para comprobar eémo funciona la gestién de sesién utilizando reescritura de URLs deshabilita las Gookies en Firefor, Figura 6.45. FR 6 a @ i a Ou rive [Reid Sorted lest stra ene ie ede ‘rao (Ura nies pon ee [Meds primate denne pds (Recor eneaecn (Rear ces (Pant omar eee Eh tet cede Tieole detent np tb nnaeos ee [Contaonin-] Conte des [irene] Figura 6.45: Deshabilita Cookies 187 Despliegue de Aplicaciones Web 16. Ahora accede a In aplicacién http: //Locathost:8080/Sesiones/pruebasesion y comprueba cémo no funciona el seguimiento de Ia sesién actualizando la pagina o pulsando en el enlace Refrescar. Solo utilizando el enlace Refresear con reescritura de URLs funcionard la gestién de la sesién, sin utilizar Cookies, Figura 6.46. set dept dessin Has accedido a este sitio 2 veces en esta sesion. (eestor de ein 000276A OBSBEFABEBICEAI22SDB(D24) (Fecha de creas de ses Son 08 204752 CEST 2012) (Fecha Se tino aces ala ssn Son J 08 20474 CEST 2012) (isin empo inactive dela ses: 180 sees) Reficscar URL: Figura 6.46: Sesién con reescritura de URLS 17. Observa emo el identifieador de la sesién escrito on la URL os el mismo que el mostrado en ta pagina, 18. Recuerda que si utilizamos el método response.encodeURL( ) y las cookies no estén deshabilitadas centonces este método no afiadiré el identificador de Ia sesién a la URL. 19, Como prueba final, vamos a acceder al descriptor de despliogue, web.xml, para modificar el tiempo ‘méximo, en minutos, que dura inactiva una sesin 1 20. Una ver hecha esta modifieacién vuelve a desplegar la aplicacién y comprueba eémo la sesién caduca tras un minuto de inactividad 6.7. Servlets, contexto, configuracién y filtros En esta prictica seguiremos analizando eonceptos relativos a los Serulets: Pariimetros de inicializacin de Servlet con SeruletConfig. Parimetros de inicializacién de aplicacién con ServletContezt. = Pardmetros de inicializacién de servidor * Filtros, 188

Vous aimerez peut-être aussi