Sie sind auf Seite 1von 38

En este tutorial se explicar la utilizacin de Servlets para la realizacin de las prcticas de Bases de Datos 2.

Los servlets no son ms que una clase ms dentro del cada vez mayor rbol de paquetes de Java. La clase Servlet fue diseada para permitir desarrollar de una forma sencilla aplicaciones cliente-servidor. Los servlets son objetos que corren dentro del contexto de un servidor web (por ejemplo, Apache Tomcat) y extienden su funcionalidad. La palabra servlet deriva de otra anterior, applet, que se refera a pequeos programas escritos en Java que se ejecutan en un navegador web. Por contraposicin, un servlet es un programa que se ejecuta en un servidor web, mostrando al navegador el resultado de su ejecucin, por lo que, el uso ms comn de los servlets es generar pginas web de forma dinmica. Otras opciones que permiten generar pginas web dinmicas son con los lenguajes ASP, PHP, JSP y Python. De una forma ms formal, podemos decir que un servlet es un objeto Java que implementa la interfaz javax.servlet.Servlet o que hereda de alguna de su subclases. Para poder trabajar con Servlets Java nos har falta:

JDK Java: El kit de desarrollo de Java para poder compilar nuestros servlets. Apache Tomcat: Un contenedor de servlets, esto es, el lugar donde colocaremos nuestro servlets compilados y donde se ejecutarn. Ser el servidor de servlets. Navegador web: Para poder acceder al contenedor de Servlets, poder utilizarlos e interactuar con ellos. Ser el cliente y nos servir cualquiera: Firefox, lynx, Internet Explorer, Opera, etc. Oracle: Nos har falta una base de datos donde podremos almacenar nuestros datos y que ser utilizada por nuestros servlets.

Dentro de este tutorial se distinguen los siguientes apartados:


Instalacin: En esta seccin veremos como instalar el entorno de desarrollo de Java y el contenedor de servlets Apache Tomcat. Compilar/ejecutar: En este apartado veremos los pasos que hay que dar para compilar un servlet, colocarlo en Tomcat y ejecutarlo desde un navegador. Servlet: En este tutorial veremos que es un servlet, sus distintas partes y peculiaridades y como reciben parmetros y devuelven salidas. JDBC: En esta seccin veremos como conectar a bases de datos mediante la biblioteca JDBC y hacer servlets que muestren datos de una base de datos o que los modifiquen. Ejemplos: En esta seccin veremos un par de ejemplos un poco ms complejos basados en el ejemplo de la Facultad de Estudios Avanzados para poder construir informes y formularios equivalentes a los que hicimos con Developer. Fuentes: Cdigo fuente de los diversos servlets mostrados a lo largo del tutorial.

Si se quiere ampliar conocimientos sobre el uso del lenguaje HTML (imprescindible para comunicarse con un navegador web) o, ms concretamente, formularios HTML (para poder pasar parmetros a nuestros servlets) se puede consultar este tutorial de HTML o este tutorial de formularios HTML o este completo tutorial de HTML 4.0. Para empezar con el lenguaje de programacin Java, se puede consultar este tutorial de Java. Para ms informacin sobre Apache Tomcat y Servlets, se pueden visitar sus pginas oficiales.

Instalacin

Introduccin
En esta parte del tutorial se explicar como instalar J2SE Development Kit versin 5 y Apache Tomcat para poder tener disponibles dichas herramientas en nuestro ordenador personal. Para instalar la base de datos Oracle, puedes consultar el apartado instalacin del tutorial de Oracle Developer. Es probable que la instalacin de Oracle Developer y la ltima versin de Java de problemas y no permita el funcionamiento de una u otra herramienta por lo que no se recomienda su instalacin conjunta. Esto es debido a que Oracle Developer utiliza la versin 1.1 de la mquina virtual Java para su funcionamiento. Para poder seguir el tutorial en los ordenadores de prcticas de la Escuela de Informtica tendrs que instalar Tomcat en tu cuenta. Al final se explica como hacerlo y como configurar el entorno para poder trabajar. En principio no har falta instalar ningn software en el ordenador personal, ya que las prcticas se han configurado y temporizado para su realizacin en las instalaciones de la E.T.S.I.I. Sin embargo, aquellos alumnos que deseen profundizar en el conocimiento de estas herramientas u organizar su trabajo de forma personalizada, pueden acceder de forma gratuita a las mismas, para uso docente.

1 Opciones de Instalacin
Primero tenemos que decidir que tipo de instalacin queremos hacer, para ello tenemos dos posibilidades: 1. Instalar slo Java/Tomcat y acceder al servidor Oracle de la E.T.S.I.I. Para ello nos har falta una conexin a Internet. Esta es la opcin recomendada para ordenadores con poca potencia/memoria pero que dispongan de una conexin Internet 2. Instalar Java, Tomcat y Oracle 9i Personal Edition. De esta forma no nos har falta una conexin y la realizacin de las prcticas no depender de posibles cadas de red o del servidor. Tengamos en cuenta que sera conveniente tener una mquina con al menos 256MB o 512MB de memoria RAM, 1Ghz de velocidad del microprocesador y unos 8GB de espacio libre en el disco duro. Para el correcto funcionamiento de todas las herramientas, tendremos que seguir todos los pasos de este tutorial de forma ordenada y rigurosa. Lo primero que habra que hacer, si se ha decidido, as, sera instalar el servidor de bases de datos Oracle, para eso te remitimos al apartado de instalacin del tutorial de Oracle Developer. Posteriormente se instalar el kit de desarrollo de Java y, finalmente, el contenedor de servlets Tomcat.

2 Instalacin de J2SE Development Kit versin 5


Las instrucciones que se dan se han probado usando como sistema operativo

Windows XP SP2 versin de 32 bits. Para no tener problemas se aconseja seguir uno a uno los pasos de forma escrupulosa, dichos pasos son:

Descargarnos Java 2 Standard Edition Development Kit (JDK) version 5 desde la pgina web de Sun. Tngase en cuenta que para ello tendremos que aceptar las condiciones de la licencia. Ejecutar el fichero ejecutable descargado, que ser del tipo jdk-1_5_0_0Xwindows-i586-p.exe. Nos aparecer la licencia del producto. La aceptamos y pulsamos el botn Next.

Posteriormente se nos muestra la pantalla de seleccin de componentes de la instalacin del entorno de desarrollo de java (JDK - Java Development Kit), instalaremos todas las opciones (opcin por defecto) y cambiaremos el directorio de instalacin (botn Change) a c:\java\jdk. Finalmente, pulsamos el botn Next y comenzar la instalacin en si.

Una vez instalado el kit de desarrollo, nos aparece la pantalla de seleccin de componentes de la instalacin de la mquina virtual Java (JRE - Java Runtime Environment), instalaremos todas las opciones (opcin por defecto) y cambiaremos el directorio de instalacin (botn Change) a c:\java\jre. Finalmente, pulsamos el botn Next y comenzar la instalacin en si.

Una vez instalado el kit de desarrollo, nos aparece la pantalla de navegadores a los que se le va a instalar el plugin de Java. Esto es til para ejecutar applets, pero como no los vamos a ver es indiferente la opcin que elijas. Pulsamos el botn Next y cuando termine todo de instalarse, pulsamos el botn Finish. Ya tendremos instalado Java en nuestro ordenador.

Una vez instalado Java, vamos a aadir al PATH del sistema la ruta del kit de desarrollo para facilitar la utilizacin de Java desde el terminal de comandos. Para ello, seguimos los siguientes pasos: 1. Desde una ventana del Explorador de Windows o desde el Escritorio, seleccionamos Mi PC y le damos al botn derecho del ratn. 2. Elegimos la opcin de Propiedades, para visualizar las Propiedades de Sistema 3. Nos vamos a la pestaa de Opciones Avanzadas 4. Le damos al botn de Variables de Entorno. Intentaremos actualizar las variables del sistema, si no pudiramos por que no tenemos los suficientes permisos modificaremos las variables del usuario. Aadiremos o modificaremos la variable PATH 5. Si la variable PATH existe: o La seleccionamos y le damos al botn de Modificar o En valor de variable, al principio, introduciremos el directorio del entorno java y lo separaremos del resto con un punto y coma: c:\java\jdk\bin;resto_de_valores 6. Si la variable PATH no existe: o Le damos al botn Nueva o En nombre de variable ponemos PATH y en valor de variable el directorio del entorno java: c:\java\jdk\bin 7. Pulsamos Aceptar para guardar los cambios y cerramos la ventanas abiertas Para comprobar que el compilador de Java y la mquina virtual se pueden acceder sin ningn problema. Abrimos un Smbolo del sistema (o Terminal de comandos) y escribimos:

javac -version java -version

3 Instalacin de Apache Tomcat


Nos descargarnos Apache Tomcat desde su pgina web. Nos bajaremos la versin 5 para Windows. Ejecutar el fichero ejecutable descargado, que ser del tipo apache-tomcat5.5.XX.exe. Lo primero que se visualiza es la pantalla de bienvenida la asistente de instalacin de Apache Tomcat, pulsamos el botn Next.

Nos aparecer la licencia del producto. La aceptamos pulsando el botn I Agree.

Posteriormente se nos muestra la pantalla de seleccin de componentes de la instalacin, instalaremos todas las opciones (En la lista desplegable Select the type of install, escogemos la opcin full) y pulsamos el botn Next.

A continuacin aparece el directorio de instalacin, lo cambiamos a c:\java\tomcat. Pulsamos el botn Next.

Despus nos pide el puerto que va a utilizar Apache Tomcat, cambiamos al valor 8081(esto es as, debido a posibles incompatibilidades de Oracle) y el nombre del administrador de Tomcat y su contrasea. Podemos utilizar system como usuario y la contrasea usada para instalar Oracle para evitar confusiones. Pulsamos el botn Next.

Acto seguido, nos preguntar donde est la mquina virtual Java (JRE - Java

Runtime Environment), deber estar la ruta c:\java\jre. Pulsamos el botn Install y comenzar la instalacin en si.

Para terminar de instalar Tomcat pulsamos el botn Finish, dejando marcada la opcin Run Apache Tomcat.

Puede que algn cortafuegos (firewall) nos de problemas al usar el puerto 8081, si

ste es el caso se debe permitir la utilizacin de ese puerto en el cortafuegos. Una vez instalado Tomcat, en la bandeja del sistema, esto es, abajo a la derecha al lado del reloj, nos aparecer un pequeo icono con el cual podremos parar, iniciar y configurar el servidor Apache Tomcat.

Es conveniente que sepas que el servidor Apache Tomcat adems de contenedor de servlets puede servir pginas HTML y JSP. Si desde nuestro navegador favorito abrimos la direccin http://localhost:8081 debera aparecer la pgina de bienvenida de Apache Tomcat. Te aconsejo que pruebes los servlets de ejemplos (en la izquierda, la opcin Servlet Examples) para comprobar que todo funciona correctamente.

4 Instalacin del driver JDBC de Oracle


JDBC nos proporciona un interfaz unificado para acceder a bases de datos mediante SQL, no obstante, nos hace falta un driver que medie entre JDBC y la base de datos en cuestin. Como vamos a utilizar oracle, utilizaremos los drivers apropiados. Dependiendo si tenemos instalado la base de datos Oracle en nuestro ordenador procederemos de un modo u otro.

4.1 Instalacin del driver JDBC de Oracle (con Oracle instalado)


Si tenemos instalado Oracle en nuestro ordenador ya tendremos una versin del driver JDBC de Oracle, simplemente tendremos que decirle a Java donde est para que la encuentre, para ello lo que haremos ser crear/modificar la variable CLASSPATH para que use las clases que proporciona Oracle, dndole el valor C:\oracle\ora92\jdbc\lib\ojdbc14.jar;.. Observa que la ruta est pensada para el caso en que siguieras todos los pasos del apartado de instalacin de Oracle del

tutorial de Oracle Developer. Para modificar la variable CLASSPATH del sistema seguimos los siguientes pasos: 1. Desde Mi PC y le damos al botn derecho del ratn, elegimos Propiedades, nos vamos a la pestaa de Opciones Avanzadas 2. Le damos al botn de Variables de Entorno. Intentaremos actualizar las variables del sistema, si no pudiramos por que no tenemos los suficientes permisos modificaremos las variables del usuario. Aadiremos o modificaremos la variable CLASSPATH 3. Si la variable CLASSPATH existe: o La seleccionamos y le damos al botn de Modificar o En valor de variable, introducimos: C:\oracle\ora92\jdbc\lib\ojdbc14.jar;.;resto_de_valores 4. Si la variable CLASSPATH no existe: o Le damos al botn Nueva o En nombre de variable ponemos CLASSPATH y en valor de variable ponemos: C:\oracle\ora92\jdbc\lib\ojdbc14.jar;. 5. Pulsamos Aceptar para guardar los cambios y cerramos la ventanas abiertas Tambin tenemos que indicarle al servidor Tomcat que utilice el driver JDBC de Oracle, para ello nos vamos al icono de Tomcat que hay en la bandeja del sistema, pulsamos el botn derecho del ratn y nos vamos a Configure.... En la ventana que aparece, nos vamos a la pestaa Java y ah modificamos el CLASSPATH aadiendo el directorio C:\oracle\ora92\jdbc\lib\ojdbc14.jar tal y como aparece en la imagen.

4.2 Instalacin del driver JDBC de Oracle (sin Oracle instalado)


En el caso de que no tengamos instalado Oracle ser necesario descargar el driver JDBC de Oracle. Para ello nos iremos a pgina del driver JDBC de Oracle y nos vamos a la opcin JDBC Drivers, SQLJ and JPublisher Downloads. Nos descargamos, despus de leer la licencia, desde la ltima versin el conjunto de clases ojdbc14.jar (copia local).Tngase en cuenta que para ello tendremos que aceptar las condiciones de la licencia y estar dados de alta previamente en la pgina web de Oracle Creamos la carpeta C:\java\jdbc y opiamos el fichero descargado (ojdbc14.jar) a dicha carpeta. Ahora slo nos hace falta actualizar la variable CLASSPATH al valor C:\java\jdbc\ojdbc14.jar;. de forma anloga como se ve en el anterior subapartado. Tambin tenemos que indicarle al servidor Tomcat que utilice el driver JDBC de Oracle, para ello nos vamos al icono de Tomcat que hay en la bandeja del sistema, pulsamos el botn derecho del ratn y nos vamos a Configure.... En la ventana que aparece, nos vamos a la pestaa Java y ah modificamos el CLASSPATH aadiendo el directorio C:\java\jdbc\ojdbc14.jar tal y como aparece en la imagen.

5 Instalacin en la ETSII
Para poder programar servlets en Java dentro de la escuela de informtica utilizaremos Linux, concretamente Fedora Core 4. Ya que tenemos instalado una versin de Java 5 (en /fenix/depar/ccia/Java/jdk ) para Linux y podremos acceder mediante Java y JDBC al servidor Oracle. Slo nos falta poder servir los servlets en nuestra mquina, para ello nos har falta

Compilacin/ejecucin de Servlets
Introduccin
En esta parte del tutorial se vern los pasos que hay que dar para compilar un servlet, colocarlo en Tomcat y ejecutarlo desde un navegador. Dentro del directorio C:\java\tomcat\webapps crearemos un directorio tutorial donde iremos colocando los fuentes de todos nuestros servlets. Dentro del directorio C:\java\tomcat\webapps\tutorial crearemos WEB-INF y dentro de ste (C:\java\tomcat\webapps\tutorial\WEB-INF ) crearemos el directorio classes que ser donde guardaremos nuestros servlets compilados.

Si estamos en la escuela de informtica, dentro del directorio ~/tomcat/webapps crearemos un directorio tutorial. En el directorio ~/tomcat/webapps/tutorial crearemos el directorio WEB-INF y dentro de ste (~/tomcat/webapps/tutorial/WEB-INF ) crearemos el directorio classes.

1 Compilar un Servlet
Dentro del directorio C:\java\tomcat\webapps\tutorial\ (en la escuela, ser ~/tomcat/webapps/tutorial/) crearemos un fichero llamado HolaMundo.java que ser el cdigo fuente de nuestro primer servlet de ejemplo (el tpico ejemplo que dice Hola Mundo). Ten cuidado con las maysculas, Java es Case Sensitive y el nombre del fichero deber coincidir con la clase que hay dentro. El cdigo con el que rellenaremos nuestro HolaMundo.java es:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HolaMundo extends HttpServlet { public void init(ServletConfig conf) throws ServletException { super.init(conf); } public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Hola Mundo</h1>"); out.println("</body>"); out.println("</html>");

} }

Abrimos un Smbolo del sistema (o terminal de comandos) y nos vamos al directorio C:\java\tomcat\webapps\tutorial\ (o ~/tomcat/webapps/tutorial/), donde ya tendremos nuestro HolaMundo.java. Para compilarlo, usaremos el compilador de Java que es javac indicndoles que para compilar el programa use las clases para Servlets (que viene con Tomcat y que estar en \tomcat\common\lib\servlet-api.jar o tomcat/common/lib/servlet-api.jar) , con la siguiente sentencia:
javac -classpath c:\java\tomcat\common\lib\servlet-api.jar HolaMundo.java

Para compilar nuestro Servlets, usando Linux, en la escuela de informtica (despus de haber inicializado las variables de entorno), tendremos que poner:
javac -classpath ~/tomcat/common/lib/servlet-api.jar HolaMundo.java

Si no hay ningn problema deber compilarse correctamente y aparecer la clase compilada en un fichero HolaMundo.class, si hubiera algn problema nos lo indicar la salida de javac.

Programacin de Servlets
Introduccin
En esta parte del tutorial se vern en que partes se descompone un servlet, el ciclo de vida de un servlet y como pasar parmetros a un servlet desde un formulario HTML.

1 El Servlet HolaMundo
En la seccin de compilacin y ejecucin de servlets creamos un servlet llamado HolaMundo.java cuyo cdigo fuente era el siguiente:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HolaMundo extends HttpServlet { public void init(ServletConfig conf) throws ServletException { super.init(conf); } public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Hola Mundo</h1>"); out.println("</body>"); out.println("</html>");

} }

Comentemos un poco nuestro este primer servlet. Lo primero que nos aparece son las clases que utiliza (las bibliotecas o includes de C):
import javax.servlet.*; import javax.servlet.http.*; import java.io.*;

Vemos que utiliza las clases correspondientes a servlets ( javax.servlet.*), las clases correspondientes a servlets que utilizan el protocolo HTTP (javax.servlet.http.*). El protocolo HTTP es el protocolo estndar en la web (o WWW - World Wide Web). Por eso, cuando en un navegador abrimos una direccin, la mayora empieza por http://. Tambin utiliza clases de entrada/salida (java.io.* - io viene input/output) para poder escribir en pantalla. Lo segundo que vemos es el nombre de la clase ( class HolaMundo) que es pblica (public), en el sentido de que cualquiera puede usarla sin ningn tipo de restriccin) y que hereda (extends) de la clase HttpServlet.
public class HolaMundo extends HttpServlet {

Algo que debemos saber es que toda clase, para que se considere un servlet, debe implementar el interfaz javax.servlet.Servlet. Para conseguirlo lo ms sencillo es hacer que nuestra clase herede o bien de la clase javax.servletGenericServlet o

javax.servlet.http.HttpServlet. Con la primera obtendremos un servlet independiente del protocolo, mientras que con la segunda tendremos un servlet HTTP. En este tutorial, slo vamos a ver servlets que funcionen con el protocolo HTTP as que, por tanto, siempre heredarn de HttpServlet. Resumiendo, slo cambiar el nombre de la clase para cada servlet que hagamos. El siguiente trozo de cdigo que aparece (y que tenemos que implementar siempre) es la redefinicin del mtodo init. El servidor invoca a este mtodo cuando se crea el servlet y en este mtodo podemos hacer todas las operaciones de inicializacin que queramos. Como en este servlet no nos hace falta inicializacin ninguna, lo nico que hacemos es llamar al mtodo init por defecto (al de la superclase).
public void init(ServletConfig conf) throws ServletException { super.init(conf); }

Podemos observar que el mtodo init es pblico, no devuelve ningn tipo (void), que puede lanzar una excepcin (ServletException) y que tiene un parmetro (ServletConfig conf). De estos dos ltimos aspectos (excepcin y parmetro) no nos tenemos que preocupar pues es el servidor quien ejecuta el mtodo init. En el peor de los casos, tendramos que lanzar la excepcin (si sabemos hacerlo), si por algn motivo el mtodo init que nosotros implementemos falle (por ejemplo, que no se pueda conectar a la base de datos y evitamos mostrar un mensaje de error) Lo siguiente que hacemos redefinir el mtodo service, cuando el servidor web recibe una peticin para un servlet llama al mtodo public void service(HttpServletRequest req, HttpServletResponse res) con dos parmetros: el primero, de la clase HttpServletRequest, representa la peticin del cliente y el segundo, de la clase HttpServletResponse, representa la respuesta del servidor (del servlet, ms concretamente).
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Hola Mundo</h1>"); out.println("</body>"); out.println("</html>");

Como en este primer ejemplo no necesitamos ninguna informacin del cliente, no usaremos para nada el parmetro HttpServletRequest, ms adelante veremos como hacerlo. De la clase HttpServletResponse usamos dos mtodos:

setContextType(String str) para establecer el tipo de respuesta que vamos a dar. Para indicar que se trata de una pgina web, como haremos siempre, usamos el tipo "text/html".
res.setContentType("text/html");

PrinterWriter getWriter(void) con el que obtendremos una clase PrinterWriter en donde iremos escribiendo los datos que queremos que el cliente reciba (como podra ser el stdout de C o el cout de C++):
PrintWriter out = res.getWriter();

Una vez que hemos establecido el tipo de respuesta ( text/html)y tenemos el flujo de salida (variable out) slo nos queda utilizar el mtodo println de la clase PrinterWriter para ir escribiendo en dicho flujo de salida la pgina HTML que queremos que visualice el cliente.

2 Servlet GetPost
Vamos a ver un ejemplo, un poco ms complicado. Si llamamos un servlet desde un formulario HTML, podremos hacerlo de dos formas: GET y POST. Con la primera los parmetros del formulario estn incluidos la url que se utiliza para invocar el servlet y en el segundo caso los parmetros se almacenan en un buffer especial del servidor. Para procesar el primer tipo de peticiones (GET) est el mtodo doGet mientras que para el segundo tenemos el mtodo doPost . La implementacin por defecto del mtodo service es capaz de determinar el tipo de peticin HTTP que en un momento dado recibe el servlet. Una vez identificada llama o al mtodo doGet o al doPost segn el caso. Como, en la mayora de los casos, seremos nosotros quien programe el formulario que llame al servlet, sabremos que tipo de llamada se har, por lo que podemos optar por redefinir uno slo de los mtodos. En el caso de que no lo supiramos se deben implementar los mtodos doGet y doPost. Un servlet que tiene diferente respuesta en funcin de la llamada que se le hace es el ejemplo GetPost.java cuyo cdigo fuente era el siguiente:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class GetPost extends HttpServlet { public void init(ServletConfig conf) throws ServletException { super.init(conf); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Hola Mundo (llamada GET)</h1>"); out.println("</body>"); out.println("</html>"); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Hola Mundo (llamada POST)</h1>"); out.println("</body>"); out.println("</html>");

} }

Para llamar al servlet con un tipo de llamada get, podemos usar el ejemplo get.html. Que podemos colocar en el directorio C:\java\tomcat\webapps\tutorial\ y cuyo cdigo es:
<html> <body> <h1>Mtodo GET</h1> <form method="GET" action="/tutorial/servlet/GetPost"> <input type="submit"> </form> </body> </html>

Para llamar al servlet con un tipo de llamada post, podemos usar el ejemplo post.html. Que podemos colocar en el directorio C:\java\tomcat\webapps\tutorial\ y cuyo cdigo es:
<html> <body> <h1>Mtodo POST</h1> <form method="POST" action="/tutorial/servlet/GetPost"> <input type="submit"> </form> </body> </html>

3 Ciclo de vida de un Servlet


Como hemos visto antes, cuando se crea un servlet, el servidor llama al mtodo init y cada vez que un cliente acceda al servlet el servidor llamar al mtodo service que se encargar de redirigir la llamada doGet o a doPost. Esto nos quiere decir que cuando se llama por primera vez a un servlet se ejecutara primero init y despus service, pero ... Y la segunda vez y sucesivas tambin se llama a init o slo a service?. Normalmente, el servidor crea el servlet (llama, por tanto, al mtodo init) y lo mantiene funcionando, si ha pasado un tiempo suficiente (y que puede ir desde unos segundos a nunca) sin que el servlet se llame lo deja de ejecutar. Es decir, un servlet se empieza a ejecutar con la primera llamada y, normalmente, se seguir ejecutando. De esta forma, vamos a crear un servlet que cuente el nmero de visitas que recibe, para ello nos bastar crear una variable contador que inicializaremos en el mtodo init y que incrementaremos en doPost/doGet. Por lo que, el contador se inicializar cuando se llame por primera vez al servlet y se ir incrementando en llamadas sucesivas. Este ejemplo, lo llamaremos Contador.java y su cdigo fuente era el siguiente:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Contador extends HttpServlet { //variable contador int contador; public void init(ServletConfig conf) throws ServletException { super.init(conf);

//inicializamos la variable contador contador = 1; } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); int tmp = contador; //incrementamos la variable contador contador++; out.println("<html>"); out.println("<body>"); out.println("<h1>Numero de peticiones " + tmp +"</h1>"); out.println("</body>"); out.println("</html>"); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet(req, res); } }

NOTA: Observa que un mismo servlet puede ser llamado por ms de un cliente a la vez. En este caso, el servidor crea una hebra del servlet por cada peticin y esas dos hebras accedern concurrentemente a los mismos datos (la variable contador). Como la lectura e incremento de contador no es una operacin atmica, se podra utilizar la primitiva de sincronizacin syncronized para que se realice de forma atmica:
..... PrintWriter out = res.getWriter(); int tmp; synchronized(this) { //leemos el contador tmp = contador; //incrementamos la variable contador contador++; } out.println("<html>"); .....

4 Parmetros desde un formulario HTML


Normalmente los servlets tendrn parmetros o fuentes de informacin que le darn su aspecto dinmico. Es decir, para generar una simple pgina HTML no nos complicamos tanto la vida, se escribe la pgina HTML y se ha terminado. Las fuentes de informacin de las que un servlet hace uso, pueden ser varias: el propio servlet, el servidor web, ficheros o bases de datos a los que pueda acceder o parmetros que le pase el cliente. De todas estas fuentes, nos interesan los accesos a bases de datos que veremos ms adelante y los pa;rmetros que nos pasa el cliente mediante formularios HTML. Cuando pasamos parmetros a travs de un formulario, en los Servlets a travs de la clase ServletRequest, disponemos de los siguientes mtodos para su tratamiento:

String getParameter(String nombre): Nos devuelve el valor del parmetro cuyo nombre le indicamos. Si la variable no existiera o no tuviese ningn valor, devolvera null Enumerate getParameterNames(): Nos devuelve una enumeracin de los nombres de los parmetros que recibe el servlet. Enumerate getParameterValues(String): Nos devuelve los valores que toma un parmetro dado, esto es til para listas de seleccin mltiple donde un parmetro tiene ms de un valor.

Veamos un ejemplo de un pequeo formulario que tenga distintos tipos de parmetros, se los enve a nuestro servlet y ste los muestre por pantalla (an no sabemos guardarlos en la base de datos). El formulario los llamaremos formulario.html. Que podemos colocar en el directorio C:\java\tomcat\webapps\tutorial\ y cuyo cdigo es:
<html> <title>Formulario de ejemplo</title> <body> <h1>Formulario</h1> <form method="POST" action="/tutorial/servlet/Parametros"> Nombre: <INPUT TYPE="TEXT" NAME="nombre"><BR> Primer Apellido:<INPUT TYPE="TEXT" NAME="apellido1"><BR> Segundo Apellido:<INPUT TYPE="TEXT" NAME="apellido2"><BR> <hr> Correo electronico: <INPUT TYPE="TEXT" NAME="email"><BR> Clave: <INPUT TYPE="PASSWORD" NAME="clave"><BR> <hr> Comentario: <TEXTAREA NAME="comenta" ROWS=3 COLS=40> </TEXTAREA><BR> <hr> Sexo:<BR> <INPUT TYPE="RADIO" NAME="sexo" VALUE="hombre">Hombre<BR> <INPUT TYPE="RADIO" NAME="sexo" VALUE="mujer">Mujer<BR> Areas de inters:<br> <SELECT NAME="intereses" MULTIPLE> <OPTION>Informatica</OPTION> <OPTION>Derecho</OPTION> <OPTION>Matematicas</OPTION> <OPTION>Fisica</OPTION> <OPTION>Musica</OPTION> </SELECT> <center><input type="submit" value="Enviar"></center> </form> </body> </html>

Veamos primero un servlet que conociendo de antemano los distintos parmetros que va a recibir los vaya mostrando en una pgina HTML. El servlet lo llamaremos Parametros.java y su cdigo es:
import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Parametros extends HttpServlet { public void init(ServletConfig conf)

throws ServletException { super.init(conf);

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<h1>Parmetros del servlet desde un formulario HTML</h1>"); out.println("<br> Nombre:"+req.getParameter("nombre") ); out.println("<br> Primer apellido:"+req.getParameter("apellido1") ); out.println("<br> Segundo apellido:"+req.getParameter("apellido2") ); out.println("<br> Correo electrnico:"+req.getParameter("email") ); out.println("<br> Contrasea:"+req.getParameter("clave") ); out.println("<br> Comentario:"+req.getParameter("comenta") ); out.println("<br> Sexo:"+req.getParameter("sexo") ); out.println("<br> Areas de inters:"+req.getParameter("intereses") ); out.println("</body>"); out.println("</html>"); } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet(req, res); } }

Si en la lista de de seleccin mltiple escogemos ms de un valor en la implementacin actual slo mostrara la primera eleccin, si quisiramos mostrar todos los valores deberamos de usar getParameterValues("intereses") e ir recorriendo y mostrando cada uno de los valores seleccionados del parmetro intereses. Otra posible implementacin del servlet Parametros.java sera uno que mostrase los parmetros y sus valores sin tener que conocerlos previamente. El cdigo sera:
import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.util.*;

public class Parametros extends HttpServlet { public void init(ServletConfig conf) throws ServletException { super.init(conf); } public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); //Escribimos el principio de la pgina HTML out.println("<html>"); out.println("<body>"); out.println("<h1>Parmetros del servlet desde un formulario HTML</h1>"); //cogemos los nombres de los parametros Enumeration paramNames = request.getParameterNames(); //vamos mostrando los parmetros en unwhile while(paramNames.hasMoreElements()) { //cogemos el siguiente parmetro String paramName = (String)paramNames.nextElement(); //Mostramos el nombre del parmetro out.print(paramName + " = "); //Cogemos los valores del parmetro String[] paramValues = request.getParameterValues(paramName); //Miramos si tiene ms de un valor if (paramValues.length == 1) { //Si tiene un slo valor, miramos si est vaco o no String paramValue = paramValues[0]; if (paramValue.length() == 0) out.println("<i>Sin valor</i><br>"); else out.println(paramValue + "<br>"); } else { //Si tiene ms de un slo valor, los mostramos for(int i=0; i<paramValues.length; i++) out.println(paramValues[i] + ", "); out.println("<br>"); } }//end while //Escribimos el final de la pgina HTML out.println("</body>"); out.println("</html>"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }

Conexin con Bases de Datos (JDBC)

Introduccin
JDBC (Java Database Connectivity) es la parte de Java que nos va a permitir conectarnos con bases de datos relacionales utilizando el lenguaje SQL. JDBC permite la integracin de llamadas SQL dentro del cdigo de nuestro Servlet Java proporcionando clases que nos permiten interactuar de forma fcil, cmoda y homognea con bases de datos externas. En este tutorial seguiremos con el ejemplo de la Facultad de Estudios Avanzados centrndonos en una parte del mismo. Del diagrama Entidad/Relacin nos quedaremos con el siguiente trozo para ilustrar el uso de Oracle Developer:

De donde obtenemos las siguientes tablas:


Persona: PID, nombre, apellido1, apellido2, direccion, cp, localidad, provincia, telefono, email, lugarNacimiento, fechaNacimiento, NIF, sexo, nacionalidad Alumno: PID, login, password, familiaNumerosa, centroProcedencia, acceso, notaAcceso Profesor: PID, login, password, categoria, fechaAlta, departamento, despacho, telefonoDpcho Matricula: IDMatricula, IDAlumno, tipo, numeroPlazos, fechaExpedicion, curso, PID Pago: IDPago, cantidad, abonado, fechaPago, IDMatricula Asignatura: nombre, creditosTeoricos, creditosPracticos, tipo, cuatrimestre DetalleMatricula: IDMatricula, nombre

Para el diseo fsico de la base de datos tenemos tres ficheros:


CreaBD.sql: Fichero que contiene el conjunto de sentencias SQL necesario para crear la base de datos. DatosBD.sql: Fichero que contiene el conjunto de sentencias SQL que inicializan la base de datos con unas cuantas tuplas de ejemplo. BorraBD.sql: Fichero que contiene el conjunto de sentencias SQL que borra la base de datos.

1 Conexin con la base de datos con JDBC


Antes de acceder a la base de datos, es necesario conectarse desde nuestro Servlet (Cliente, en este caso) a la base de datos (servidor), esto se hace mediante dos pasos:

Leer el driver especfico de la base de datos que vamos a utilizar, en nuestro caso, ser:
Class.forName("oracle.jdbc.driver.OracleDriver")

Establecer la conexin. Una vez que tenemos el driver cargado en memoria, tendremos que crear una conexin (objeto de la clase Connection), indicando el driver a usar (jdbc:oracle:thin), la mquina(localhost), el puerto(1521), el SID de la base de datos(ProgBD2), el usuario(fjgarcia) y su contrasea(claveSecreta). Por ejemplo:
Connection conexion = DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:ProgBD2", "fjgarcia", "claveSecreta");

Cuando leemos el driver especfico de la base de datos (en nuestro, caso oracle.jdbc.driver.OracleDriver) se puede producir una excepcin del tipo (ClassNotFoundException que ocurrir si no tenemos instalado correctamente el driver JDBC (revisar parte de instalacin). Al leer el driver este se quedar en memoria y ser el que se utilice internamente por JDBC. Cuando creamos una conexin (nos devuelve un objeto Connection) se abre una conexin con la base de datos que posteriormente debemos cerrar. Para crear la conexin se utiliza, como hemos visto, el mtodo getConnection de la clase DriverManager, que como vemos tiene tres parmetros, el primero ser la cadena de conexin, el segundo el usuario y el tercero la contrasea de dicho usuario. En la cadena de conexin tenemos el driver que se va a utilizar, nosotros siempre usaremos jdbc:oracle:thin la mquina a la que nos vamos a conectar precedida de una arroba (nosotros podremos usar @localhost para nuestro ordenador local o @oracle0.ugr.es para el servidor de la escuela), el puerto a utilizar (tanto local, como remoto usaremos el 1521) y el SID de la base de datos a utilizar (en local ser ProgBD2 y en el servidor de la escuela ser PRACTBD. Como hemos mencionado anteriormente para toda conexin que abramos tendremos que cerrarla, eso se har mediante el mtodo close()de Connection Veamos un pequeo ejemplo que slo conecte a la base de datos local para ver si hubiera algn problema y que guardaremos como ConectaBD.java:
import import import import javax.servlet.*; javax.servlet.http.*; java.io.*; java.sql.*;

public class ConectaBD extends HttpServlet { public void init(ServletConfig conf) throws ServletException { super.init(conf); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { Connection conexion = null; res.setContentType("text/html"); PrintWriter out = res.getWriter();

try { //Leemos el driver de Oracle Class.forName("oracle.jdbc.driver.OracleDriver"); //Nos conectamos a la BD local conexion = DriverManager.getConnection ( "jdbc:oracle:thin:@localhost:1521:PROGBD2", "fjgarcia","claveSecreta"); /*//Nos conectamos a la BD de la ETSII String clave="claveSecretaETSII"; conexion = DriverManager.getConnection ( "jdbc:oracle:thin:@oracle0.ugr.es:1521:PRACTBD", "fjgarcia",clave); */ //Decimos que nos hemos conectado out.println("<html>"); out.println("<body>"); out.println("<h1>Hemos conectado!</h1>"); out.println("</body>"); out.println("</html>"); } catch (ClassNotFoundException e1) { //Error si no puedo leer el driver de Oracle out.println("ERROR:No encuentro el driver de la BD: "+ e1.getMessage()); } catch (SQLException e2) { //Error SQL: login/passwd mal out.println("ERROR:Fallo en SQL: "+e2.getMessage()); } finally { //Finalmente desconecto de la BD try { if (conexion!=null) conexion.close(); } catch (SQLException e3) { out.println("ERROR:Fallo al desconectar de la BD: "+ } } } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet(req, res); } } e3.getMessage());

Observa que dentro de las bibliotecas que vamos a usar hemos aadido la lnea import java.sql.*; que no sirve para utilizar las clases de JDBC

El resultado si todo ha sido correcto debera ser:

Si no encuentra el driver de Oracle es que no lo ha encontrado en la variable CLASSPATH

Cuando se produce un error SQL (en este ejemplo que no encuentre la BD o que hayamos introducido un usuario/clave incorrectos) se produce una excepcin del tipo SQLException. Este tipo de excepcin siempre ocurrir cuando haya un problema fuera de Java y relacionado con la base de datos. Ejemplos tpicos son cuando no se puede conectar a la base de datos, hacemos una consulta mal construida, insertamos una tupla violando alguna restriccin de integridad, etc. En nuestro ejemplo nos hemos identificado mal el resultado ser:

Ten en cuenta que en las aulas de ordenadores de la escuela de informtica no hay ninguna base de datos instalada por lo que tendrs que usar, sin otro remedio, el servidor Oracle de la escuela, esto es, oracle0.ugr.es. Por tanto la cadena de conexin, para todos los servlets que crees en la escuela de informtica sern del tipo:
con = DriverManager.getConnection ("jdbc:oracle:thin:@oracle0.ugr.es:1521:PRACTBD", usuario,clave);

EJERCICIO: Hacer un formulario HTML que enve dos parmetros a un servlet


(Usuario/Clave) y ste los utilice para conectarse a la base de datos.

2 Sentencias JDBC
Como con la conexin a la base de datos no nos basta, vamos a ver como se ejecutan sentencias en la misma para consultar datos, actualizar tuplas y aadir/borrar registros. Una Sentencia JDBC es un objeto Statement (traducido sera Sentencia) de JDBC y se utiliza para mandar sentencias SQL a la Base de Datos y no debera confundirse con una sentencia SQL, es decir, sentencia JDBC (objeto Statement) y sentencia SQL no son lo mismo. Un objeto Statement se asocia con una conexin abierta y no con una sentencia SQL en particular, por tanto, un objeto Statement es una pasarela entre la Base de Datos y nuestro Servlet que nos va a permitir ejecutar una o ms sentencias SQL en la Base de Datos. Para crear un objeto Statement nos hace falta una conexin abierta con la base de datos, por ejemplo:
//Nos conectamos a la BD local conexion = DriverManager.getConnection ( "jdbc:oracle:thin:@localhost:1521:PROGBD2", "fjgarcia","claveSecreta"); //Creamos una sentencia a partir de la conexin Statement sentencia=conexion.createStatement();

Tenemos que tener en cuenta que una sentencia va asociada a una conexin, por lo que si se cierra la conexin se cierra la sentencia. Tambin podemos cerrar las sentencias mediante el mtodo close() de forma anloga como hacamos con las conexiones.

3 Consultas SQL desde JDBC


Ya sabemos conectarnos y crear sentencias JDBC para poder ejecutar sentencias SQL, veamos como se pueden ejecutar consultas (sentencias SELECT) desde nuestro servlet. Para poder ejecutar consultas tenemos un mtodo executeQuery (traducido sera ejecutarConsulta) de la clase Statement cuyo parmetro es una cadena con una consulta SQL. Por ejemplo:
resultados = sentencia.executeQuery("SELECT * FROM Asignatura");

El resultado de la consulta lo almacenar en un objeto de la clase ResultSet (traducido es ConjuntoDeResultados). Por lo tanto, para hacer una consulta nos har falta crear un objeto Statement que nos permita ejecutar la consulta y objeto ResultSet que nos permita almacenar el resultado de la consulta. Como hemos visto, el objeto Statement nos lo dar el objeto con el cual se ha hecho la conexin. Por ejemplo, si nos fijamos en un trozo del servlet AsignaturasBD.java:
..... Connection conexion = null; //Objeto para la conexin a la BD Statement sentencia = null; //Objeto para la ejecutar una sentencia ResultSet resultados = null;//Objeto para guardar los resultados //Variables conexin String

cadenaConexion="jdbc:oracle:thin:@oracle0.ugr.es:1521:PRACTBD"; String cadenaConexion2="jdbc:oracle:thin:@localhost:1521:PROGBD2"; String usuario="fjgarcia"; String clave="claveSecreta"; //La salida ser una pgina HTML res.setContentType("text/html"); PrintWriter out = res.getWriter(); try { //Leemos el driver de Oracle Class.forName("oracle.jdbc.driver.OracleDriver"); //Nos conectamos a la BD conexion = DriverManager.getConnection (cadenaConexion,usuario,clave); //Creamos una sentencia a partir de la conexin sentencia=conexion.createStatement(); //Cogemos todos los datos de la asignaturas resultados=sentencia.executeQuery("SELECT * FROM asignatura"); ....

En el anterior cdigo el resultado de nuestra consulta se debe haber almacenado en el objeto resultados de ResultSet, si hubiera habido algn problema en la ejecucin de la consulta nos saltara una excepcin del tipo SQLException. 3.1 Trabajar con los resultados de una consulta Como hemos visto el mtodo executeQuery de la clase Statement nos devuelve un objeto de la clase ResultSet donde tendremos el conjunto de tuplas resultado de la consulta. La clase ResultSet nos proporciona gran cantidad de mtodos para poder movernos entre las tuplas de la consulta y, para cada tupla, entre los distintos atributos que la componen. Por ejemplo, mirando el servlet AsignaturasBD.java:
.... //Cogemos todos los datos de la asignaturas resultados=sentencia.executeQuery("SELECT * FROM asignatura"); //Escribimos la cabecera de la pgina out.println("<html>\n <body>\n <h1>Asignaturas</h1>"); //Mostramos las distintas asignaturas while(resultados.next()) { out.println("<br>Nombre="+resultados.getString("nombre")+ " Tipo="+resultados.getString("tipo")+ " Cuatrimestre="+resultados.getString("cuatrimestre")); }//Fin while //Escribimos el final de la pgina out.println("</body>\n </html>"); ....

Si ejecutamos el servlet AsignaturasBD.java el resultado debera ser:

La clase ResultSet tiene un cursor que puede ser usado para movernos entre las distintas filas de los resultados de la consulta y que inicialmente apunta a la primera fila. Podemos usar el mtodo next() (como hemos hecho en el ejemplo anterior) para irnos de una fila a la siguiente, por lo que la llamada de dicho mtodo nos devolver true si hay una siguiente tupla y false si ya estamos en la ltima. Para obtener los distintos atributos de una tupla se utilizarn, normalmente, los mtodos getString(atributo) o getObject(atributo), cuyo parmetro es una cadena con el nombre del atributo que queremos recuperar. La diferencia entre ambos mtodos es que el primero nos devuelve una cadena (clase String) y el segundo un objeto genrico (clase Object). A partir de la clase Object podemos convertir el atributo al tipo de dato que nos interese aunque tambin podemos utilizar el mtodo get apropiado. Para ms informacin podemos consultar la Tabla 1:

Tipo de dato SQL BIGINT BINARY BIT CHAR DATE

Tipo de dato Java devuelto por getObject() Long byte[] Boolean String java.sql.Date

Mtodo get apropiado

long getLong() byte[] getBytes() long getLong() String getString() java.sql.Date getDate()

DECIMAL

java.math.BigDecimal

java.math.BigDecimal getBigDecimal double getDouble() double getDouble() int getInt() InputStream getBinaryStream() InputStream getAsciiStream() InputStream getUnicodeStream() java.math.bigDecimal getBigDecimal() float getFloat() short getShort() java.sql.Time getTime() java.sql.Timestamp getTimestamp() byte getByte() byte[] getBytes() String getString() String getString()

DOUBLE FLOAT INTEGER

Double Double Integer

LONGVARBINARY

byte[]

LONGVARCHAR

String

NUMERIC

java.math.BigDecimal

REAL SMALLINT TIME

Float Integer java.sql.Time

TIMESTAMP

java.sql.Timestamp

TINYINT VARBINARY VARCHAR VARCHAR2

Integer byte[] String String

TABLA 1:Mtodos para extraer los datos de los atributos a partir de un objeto ResultSet

En lugar de utilizar el nombre del atributo, ya que puede que no lo conozcamos, podemos utilizar el nmero de columna:
.... //Mostramos las distintas asignaturas while(resultados.next()) { String nombre = resultados.getString(1); int creditos = resultados.getInt(2)+resultados.getInt(3);

String cuatrimestre = resultados.getString("cuatrimestre"); String tipo = resultados.getString("tipo"); out.println("<br>Nombre="+nombre)+ " Crditos totales="+tipo+ " Tipo="+tipo+" Cuatrimestre="+cuatrimestre); }//Fin while ....

Hay que tener en cuenta que el objeto ResultSet est ligado al objeto Statement con el que fue creado por lo que si se cierra o se vuelve a usar para otra sentencia SQL el contenido de ResultSet se elimina automticamente. Tambin tenemos mtodos para saber en que fila nos encontramos como son getRow() (nos da el nmero de fila), isFirst()(nos pregunta si es la primera), isBeforeFirst()(si estamos justo antes de la primera fila), isLast()(si es la ltima fila), isAfterLast()(si ya no nos quedan ms filas). Nos puede interesar sabe que datos son nulos pero observa que objetos como getInt() no nos pueden devolver un valor null, para ello la clase ResultSet nos proporciona el mtodo wasNull() para ver si hemos obtenido un valor nulo. Por ejemplo:
.... int creditosP = resultados.getInt("CreditosPracticos") ; if ( !resultados.wasNull() ) out.println(" Crditos Prcticas="+creditosP); else out.println(" Sin Prcticas "); ....

5 Cambiando la Base de Datos con JDBC


Normalmente en la base de datos haremos muchas ms operaciones que consultar tablas, pero son operaciones donde no nos esperamos un conjunto de resultados (ResultSet), como son operaciones de insercin, modificacin o borrado de tuplas. Para este tipo de sentencias SQL usaremos el mtodo executeUpdate(codigo_sentencia) de la clase Statement. Dicho mtodo nos devolver el nmero de tuplas modificadas. Por ejemplo:
//Creamos una sentencia a partir de la conexin sentencia=conexion.createStatement(); //Insertamos una tupla en la tabla asignaturas int n=sentencia.executeUpdate("INSERT INTO Asignatura "+ "VALUES('Base de Datos','6,0','4,5','O','1')");

Adems de insertar/modificar/borrar tuplas con executeUpdate podemos ejecutar sentencias DDL (data definition language), como crear/borrar/modificar tablas. En sentencias DDL el valor que devuelve el mtodo executeUpdate es siempre cero. Por ejemplo:
//Creamos una sentencia a partir de la conexin sentencia=conexion.createStatement(); //Creamos una tabla Insertamos una tupla en la tabla asignaturas sentencia.executeUpdate(

"CREATE TABLE Asignatura ("+ "nombre VARCHAR(50) PRIMARY KEY,"+ "creditosTeoricos NUMBER(2,1) NOT NULL,"+ "creditosPracticos NUMBER(2,1) NOT NULL,"+ "tipo CHAR(1) NOT NULL CHECK (tipo IN ('O','T','P','L')),"+ "cuatrimestre NUMBER(1)"+ ");"); //Hacemos un commit conexion.commit();

Adems de executeQuery y executeUpdate, tenemos el mtodo genrico execute(cadena_sentencia) que nos devuelve true si tiene algn ResultSet para devolvernos y false en caso de que no devuelva un ResultSet. Es decir, devuelve verdadero si es una sentencia de consulta y falso si es otro tipo de sentencia. Si no es una sentencia de consulta podemos acceder al nmero de tuplas que se han modificado con la sentencia usando el mtodo getUpdateCount(), en el otro caso, se ha ejecutado una consulta, por lo que para poder acceder al ResultSet que devuelve la sentencia ejecutada podemos usar el mtodo getResultSet(). Ten en cuenta que cada vez que modifiquemos la base de datos tendremos que hacer un commit para que los cambios e hagan permanentes, para ello usaremos el mtodo commit() de la conexin (clase Connection).

Ejemplos de Servlets

Introduccin
En esta seccin del tutorial se presentarn unos cuantos ejemplos de servlets, ms o menos, avanzados tal y como se hizo en el tutorial de Oracle Developer con el objetivo de que puedan servir como punto de partida para la realizacin de las prcticas. Tambin se puede acceder a al cdigo fuente de todos los ejemplos usados en el tutorial

1 Informe Asignaturas
En este servlet implementamos el informe Asignaturas (documentacin de la clase Asignaturas.java), el cual muestra una pgina HTML con las distintas asignaturas que hay en la tabla Asignatura de la base de datos. La consulta SQL utilizada ha sido:
SELECT nombre,tipo,cuatrimestre, creditosPracticos, creditosTeoricos FROM asignatura;

En este ejemplo se tienen los siguientes mtodos:


cabeceraHTML: Este mtodo escribe la cabecera HTML de la pgina web. doGet: Aqu se implementa el mtodo doGet que se encargar de conectarse a la base de datos extraer los datos y mostrar el informe doPost: El mtodo doPost, simplemente hace una rellamada a doGet. init: Mtodo init por defecto pieHTML: Este mtodo escribe el pie de la pgina.

tablaAsignaturas: Escribe una tabla HTML a partir del conjunto de resultados de una consulta tituloHTML: Aqu se escribe el titulo de la pgina HTML aunque tambin sirve para mostrar un posible error de la BD.

El aspecto final en ejecucin del servlet Asignaturas.java ser el siguiente:

2 Informe Matrcula
En este servlet implementamos el informe Matriculas (documentacin de la clase Matriculas.java), el cual muestra una pgina HTML donde, para cada alumno, nos muestre las matrculas que ha realizado y para cada matrcula los pagos de la misma. La consulta SQL utilizada ha sido:
SELECT curso, matricula.idmatricula, tipo, numeroplazos, fechaexpedicion, cantidad, abonado, fechapago, persona.nombre, persona.apellido1, persona.apellido2 FROM pago, matricula, persona WHERE (pago.idmatricula=matricula.idmatricula) and (matricula.idalumno=persona.pid);

En este ejemplo se tienen los mismo mtodos que en el anterior informe, pero tengamos en cuenta que la consulta realizada en el mtodo doGet no es la misma, es la mostrada justo en el prrafo anterior. Y que en lugar de tablaAsignaturas se tiene un mtodo llamado tablaMatriculas. El mtodo tablaMatriculas va mostrando los distintos elementos de la consulta y comprueba los casos en los que hay atributos repetidos: mismo alumno para diferentes matrculas y misma matrcula para diferentes pagos. El aspecto final en ejecucin del servlet Matriculas.java ser el siguiente:

3 Formulario Persona
En este servlet implementamos el formulario Persona (documentacin de la clase Persona.java), el cual crea un formulario HTML donde nos mostrar las personas que hay dentro de nuestra base de datos, habiendo un botn de anterior y otro de siguiente para poder ir visualizando los distintos registros de la tabla persona. Tambin nos permite modificar y borrar el registro visualizado, as como aadir uno nuevo. En este ejemplo se tienen los mismo mtodos que en el informe Asignaturas, pero hay nuevos mtodos y mostraremos los mtodos que presentan diferencias sustanciales:

muestraFormulario: Este mtodo escribe una tabla HTML con un formulario que muestra la tupla en memoria, para consultar/crear/introducir/modificar los datos de la tabla Persona barraHerramientas: En este mtodo se aade a la pgina la barra de herramientas, es decir, el botn de Anterior, Siguiente, Modificar, Borrar y Nuevo. barraHerramientasNuevo En este mtodo se aade a la pgina la barra de herramientas cuando se va a aadir un nuevo registro, slo hay dos acciones Crear y Cancelar. cogeParametros: En este mtodo se recogen los parmetro que recibe el servlet desde el formulario HTML. Adems de los datos de la Persona correspondientes de la base de datos hay dos ms de inters: accion, que nos indica la accin a realizar sobre los datos (por ejemplo, modificar o borrar) y num, que nos dice el nmero de registro actual con el que estamos trabajando. cogeRegistro: En este mtodo se obtiene de la base de datos mediante una consulta el registro que se quiere mostrar en el formulario HTML doGet: Este mtodo implementa el mtodo doGet que se encargar de conectarse a la base de datos, mostrar el formulario e interpretar la accin a ejecutar. Si es slo mostrar (botones Anterior y Siguiente) mostrar el registro correspondiente en el formulario. Si es crear uno nuevo, mostrar el formulario vaco con un nuevo PID (que no existe en la base de datos). Si la accin es Aadir, se guardar en la base de datos y se visualizar el registro que se le ha pasado como parmetro al servlet. Si es borrar o modificar, ejecutar la opcin pertinente sobre el registro actual.

El aspecto final en ejecucin del servlet Persona.java ser el siguiente:

4 Formulario Persona-Alumno
En este servlet implementamos el formulario Persona-Alumno (documentacin de la clase Alumno.java), el cual crea un formulario HTML donde nos mostrar los alumnos que hay dentro de nuestra base de datos, habiendo un botn de anterior y otro de siguiente para poder ir visualizando los distintos registros de la tabla persona. Tambin nos permite modificar y borrar el registro visualizado, as como aadir uno nuevo. En este servlet se muestran tanto los datos de la tabla Persona como los datos de la tabla Alumno. En su implementacin es casi igual al formulario Persona, pero cambian las operaciones de la base de datos si se hace una consulta a Persona se tiene que hacer tambin a Alumno, si se borra se tienen que borrar en ambas tablas. Tambin tendremos que crear un formulario que visualice adems los datos de la tabla Persona y tener en cuenta que son nuevos parmetros del servlet. El aspecto final en ejecucin del servlet Alumno.java ser el siguiente:

http://flanagan.ugr.es/docencia/2005-2006/2/servlets/fuentes.html

Das könnte Ihnen auch gefallen