Dossier de prácticas Intranet / Extranet Màster d Enginyeria del Software Desenvolupament d aplicacions sobre Internet Fundació Politècnica de Catalunya Jaume Moral Ros Albert Obiols Vives
1 Dossier de prácticas Debido al crecimiento de nuestra empresa de consultoría, y la llegada de innumerables nuevos proyectos para la empresa, hemos recibido el encargo de nuestro jefe en "SC- Consulting", de montar la Intranet de la empresa. El primer objetivo es tener una agenda compartida entre los distintos empleados, que por otro lado ya no dan abasto. En esta Intranet queremos que cada uno de nuestros empleados cuando se autentifique se le muestren las reuniones que le han asignado para ese día, semana o mes. En la empresa disponemos de un PC con Windows como nuestra estación de trabajo y un servidor corporativo donde tenemos instalado el Sistema Operativo Linux, un servidor de Web con Apache y una Base de Datos Oracle, donde ya tenemos creadas las tablas con los empleados, y las tablas para la agenda. El diseño de las pantallas que tenemos para desarrollar esta Intranet, ha sido encargado a una empresa externa. La estructura de las tablas que tenos en la Base de datos es:
2 Introducción a los servlets 1.- Nuestro primer Servlet: Hello World con Plantillas En nuestro directorio de servlets tendremos el ya clásico ejemplo de Hello World, que podemos ejecutar con /servlet/hello. El objetivo de esta práctica es modificar este servlet para que funcione con plantillas. Para ello, utilizaremos la plantilla sc.html y sustituiremos la etiqueta TEXTO por el texto que nostros queramos. Recordemos que para utilizar las plantillas utilizaremos la siguiente sintaxis: import lcfib.plantilla.*;... p=new Plantilla(nombre de la plantilla); p.setlabel("texto","hello World"); out.println(p.tostring()); Donde nombre de la plantilla es el path completo del fichero plantilla. Las plantillas pueden arrojar la excepción IOException en caso de no encontrar el fichero o la PlantillaException en cualquier otro caso. Habrá que tenerlo en cuenta a la hora de compilar. Debemos asegurarnos que en nuestro classpath tenemos el fichero jsdk.jar, ya que sino el compilador no será capaz de compilar servlets. 2.- Tratando con parámetros El objetivo de nuestra segunda parte será hacer un servlet que nos enseñe los parámetros que le hemos entrado en forma de tabla. Para ello, utilizaremos la plantilla sc2.html, en la que tendremos una estructura de este tipo. @@$VARIABLES{@@...@@$NOMBRE@@...@@$VALOR @@}@@ Recordemos que para asignar los valores de dentro de una sección, primero hay que repetir la sección y después asignar las etiquetas, como por ejemplo: p.repeat("variables"); p.setlabel("nombre","parametro1"); p.setlabel("valor","valor1"); p.setlabel("nombre","parametro2"); p.setlabel("valor","valor2");
Para acceder a los parámetros, podemos buscar información sobre los siguientes métodos de la clase HttpServletRequest 3 getparameternames getparametervalues Recordemos que cada parámetro puede tener más de un valor. Hay que enseñarlos todos! 3.- Sesiones para autentificación de usuarios Queremos utilizar un sistema de autenticación de usuarios basado en sesiones. Para ello, en cada uno de nuestros servlets obtendremos una sesión y en caso de que esta sea nueva, redirigiremos al usuario hacia una servlet de que nos enseñará un formulario de login Esta servlet tendrá el siguiente funcionamiento: Si no tiene ningún parámetro, simplemente nos enseñará la pantalla de identificación Si tiene como parámetros un username y un password, comprobará que sean correctos. Si es así, nos guardaremos el username en la sesión y haremos una redirección a la página inicial, pero si no es correcto, volveremos a presentar la pantalla de login con un mensaje avisando de nuestro error. username/password cuando no tenemos sesión identificación correcta /servlet/login /servlet/hello3 Para hacer la validación del usuario simplemente comprobaremos que el username y el password sean el mismo. Posteriormente utilizaremos un método más sofisticado conectándonos a la base de datos. La página inicial de la que hemos hablado, será el Hello3, que simplemente nos mostrará el nombre del usuario de la sesión. Recordemos que si accedemos a esta pantalla sin pasar por la de login, el sistema deberá redireccionarnos automáticamente a ella al detectar que no tenemos un identificador de sesión. Opcionalmente, podemos hacer un tercer servlet que nos permita hacer un logout del sistema, es decir, invalidar la sesión.
4 Primeros pasos con la base de datos 4.- Identificación de usuarios con la base de datos Para acabar nuestra identificación de usuarios, lo que haremos es comprobar que el username y el password coinciden con el que tenemos en nuestra base de datos, utilizando JDBC. Para separar lo que son los accesos a bases de datos del código de servlet, crearemos una clase BD que encapsulará todos los accesos a bases de datos. Esta clase será la encargada de hacer todas las consultas e inserciones. En nuestro caso, lo que deberemos hacer será rellenar el contenido del método. public static void validausuario (String username, String password) {... } Para que aprovechando la conexión que ya tenemos abierta, haga la siguiente consulta a la base de datos: SELECT count(*) FROM personas WHERE password=password_entrado AND id_persona=username_entrado Y nos devuelva el valor correspondiente según el resultado La agenda En las siguientes prácticas, tendremos como objetivo realizar una agenda básica, con opciones para ver los eventos, añadirlos, modificarlos y ver las anotaciones por semana y por día 5.- Ver la lista de los eventos de la agenda Hacer un servlet que se llame VerEventos que funcione con la autenticación de usuarios mediante sesiones y que llame al método listaeventos de la clase BD, para obtener un vector de objetos evento, donde tendremos los eventos que nos afectan. Para utilizar este método, debemos pasarle el username que está haciendo la consulta y unas fechas de inicio y final, que pueden ser null. Los eventos que nos devolverá podran ser de dos tipos. 1) Eventos de tipo general, es decir, que afectan a todos los usuarios 2) Eventos que nos afectan de manera específica
5 La plantilla que usaremos para esta Servlet se llamará total.html. En esta práctica sólo sustituiremos las etiquetas NOMBRE y FECHA de la sección Eventos. El resto de las etiquetas no las tocaremos. 6.-Ver los datos de los eventos de la agenda Mostrar los datos completos de un evento cuando hacemos click sobre su nombre. Para hacer esto sustituiremos la etiqueta URL de la plantilla total, que nos permitirá escribir la URL que enseñaremos en una nueva ventana al clickar sobre el nombre del evento Esta URL será del estilo: /servlet/editarevento?id_evento=22 La servlet EditarEvento estará basada en la plantilla evento.html, en la que sustituiremos todas las etiquetas con los datos obtenidos del evento. Lógicamente, si queremos todos los datos del evento a partir de su identificador, deberemos crear un nuevo método en la clase BD que nos devuelva el objeto Evento correspondiente: public static Evento consultaevento (String id_evento) throws SQLException haciendo la consulta SELECT * FROM eventos WHERE id_evento=? Aunque esta servlet nos presenta los datos en un formulario, por ahora no permitimos hacer ninguna modificación. Todo lo que podemos hacer desde esta nueva ventana es cerrarla. 7.- Ver los eventos de hoy, de esta semana o todos. Aprovechando que nuestro método listaeventos nos permite pasar una fecha inicial y una final, queremos que las pestañas correspondientes de la plantilla nos permitan ver el día actual, siete días vista y un mes vista. Para ello, le pasaremos 3 nuevos parámetros al servlet VerEventos: la fecha inicial, la fecha final y la pestaña que queremos mostrar. En principio usaremos una plantilla distinta para cada tipo de vista, pero los datos a sustituir seran los mismos. Estas plantillas se llamaran total.html, semanal.html y diario.html.
6 8.- Insertar nuestras propias anotaciones. Utilizando el mismo formulario de ver los datos, haremos que se puedan insertar nuevas anotaciones y modificar las ya existentes. Para ello, deberemos crear una nueva servlet, llamada GuardaEvento, a la que llamaremos con el botón de Actualizar Datos y que hará lo siguiente: 1) Crear un objeto evento a partir de los parámetros que nos llegan. 2) Guardarlo en la base de datos con la función creada a tal efecto. Esta función hará un UPDATE si el objeto evento tiene ya un identificador y un INSERT si no lo tiene. La función Guardar Evento se basará en la plantilla cerrar.html en la cual no tenemos ninguna etiqueta a sustituir. En el código de esta plantilla hay Javascript que nos permitirá cerrar la ventana y recargar la ventana principal sin tener que preocuparnos. Para crear nuevas anotaciones, tenemos un botón a tal efecto en las plantillas de ver eventos. Al pulsar este botón, llamaremos a la servlet EditarEvento sin parámetros, de forma que nos mostrará la plantilla vacía y al actualizar los datos se creará un objeto Evento sin identificador que la servlet GuardarEvento añadirá a la tabla con un INSERT. 9.- Borrar anotaciones en la agenda Para borrar anotaciones, habilitaremos el tercer botón que tenemos al ver la información completa de un evento. Deberemos implementar una nueva función de la clase BD para borrar eventos dado un identificador. public static void borraevento(string id_evento) lógicamente, la sentencia SQL será DELETE FROM eventos WHERE id_evento=? La forma más sencilla de implementar el borrado es considerar que se trata de una función más que nos ofrece GuardarEvento. Si encontramos que hay un campo parámetro llamado borrar que no es null, querrá decir que hemos llegado a esta servlet dándole al botón de borrar y que por lo tanto deberemos llamar a BD.borraEvento. Una vez borrado el evento, podemos mostrar como antes la plantilla cerrar.html La agenda compartida Las dos últimas prácticas convierten nuestra agenda básica en una verdadera agenda compartida con nuestros usuarios de la Intranet. 10.- Insertar reuniones con otras personas La idea es poder introducir eventos que son reuniones con otros usuarios de nuestra intranet y que los otros usuarios verán cuando se conecten a ella. Para ello, lo que deberemos hacer es:
añadir un nuevo botón al la plantilla de ver eventos que nos abra un nuevo servlet llamado EditarReunion. Este servlet se diferenciará de EditarEvento en que podremos seleccionar los asistentes a la reunión de una lista desplegable con todas las personas de nuestra empresa, que obtendremos con la función BD.listaPersonas; Las reuniones no se pueden borrar, ya que se supone que las personas implicadas ya han estado avisadas. Para anularlas, podemos hacerlo cambiando el tipo de reunión a reunión anulada. Los asistentes a la reunión deberán verse al mostrar los datos del evento, pero tampoco podrán cambiarse. Podremos obtenerlos con BD.listaAsistentesReunion, junto con la información de si han confirmado o no. Para dar de alta la reunión necesitaremos otra servlet GuardarReunion que funcionará de la misma forma que GuardarEvento, pero que necesitará también la lista de personas convocadas y el convocante para poder guardar la información en la base de datos. 11.- Confirmar la asistencia a reuniones Si nos han convocado a una reunión, al entrar a nuestra intranet debería aparecernos una lista de reuniones a las que nos han convocado junto con dos botones para decir SI o NO. Para conseguir esto deberemos modificar las plantillas de ver eventos y crear una nueva servlet: ConfirmarReunion, que actualizará los datos correspondientes para que conste que hemos contestado afirmativamente o negativamente a la reunión. Los datos de las reuniones a las que no hemos dicho nada los obtendremos con BD.listaReunionesPendientes. 7