lunes, 26 de enero de 2009

Proyecto Final Servlet elaboracion en equipo

se utilizará Google code y subversion (SVN y subclipse: plugin de eclipse para SVN)

Proyecto Final Servlet elaboracion en equipo

Cada grupo realizará un proyecto (fecha limite: 3 febrero - 12 Horas) y entregará una memoria (fecha limite: viernes 6 febrero ) en el que se explicará las decisiones adoptadas en el diseño de clases y rol elegido. Se valorará la puesta en practica de los diferentes recursos disponibles. En el desarrollo del proyecto puede intervenir el profesor como tester-cliente y redefinición de usabilidad.
*** La aplicación debe estar preparada en los casos que el usuario intente hacer algo mal a proposito: pedir un libro que no existe, realizar un prestamo sin permiso, modificar un autor sin ser administrador ...

Servicio Préstamo de Biblioteca:

Programa de gestión de servicio de préstamo de una biblioteca.
  • El usuario anónimo podrá consultar el catálogo de la biblioteca el cual podrá estar ordenado/clasificado en géneros (ensayo, policíaco, aventuras...) y/o autores.
  • Cada libro tiene: referencia, autor, fecha publicación, genero, titulo.
  • Cada autor tiene: nombre y una lista de libros.
  • Cada genero tiene: nombre y una lista de libros. Cada usuario de la biblioteca tiene: nombre, clave, mail y lista de libros en prestamo.
  • La aplicacion/biblioteca tiene: lista de libros, lista de generos, lista de autores y lista de usuarios y un administrador (usuario especial que al registrarse tiene permisos especiales)
  • El usuario podrá ver los detalles de libro y proceder a su préstamo.
  • Para realizar un préstamo el usuario tiene que estar registrado.
  • Para registrarse el usuario debe antes existir en la lista de usuarios de la aplicación. El registro consiste en un formulario donde el usuario inserta su mail y clave y estos deben coincidir con un usuario de la lista de usuarios de la aplicacion.
  • Un usuario podrá tener un máximo de 3 libros en préstamo.
  • Un usuario no podrá tener dos libros iguales en prestamo
  • Un usuario registrado puede consultar los libros que tiene en prestamo.
  • Para realizar un préstamo de libro el usuario indica el dia de inicio y fin de prestamo que no puede ser superior a 5 dias.
  • Un usuario que no existe en la biblioteca puede solicitar a el administrador mediante un formulario el ingreso en la aplicacion para posteriormente poder registrarse
  • El administrador del programa se registra con usuario: admin, clave:admin.
  • El administrador no puede realizar prestamos pero hace tareas de administacion.
  • El administrador del programa puede aceptar las solicitudes de usuarios pendientes y convertirlos en usuarios que pueden realizar prestamos
  • El administrador del programa puede crear/modificar/borrar libros, autores y generos
  • El administrador del programa puede consultar todos los libros reservados (fecha inicio y fin y usuario que realizó el préstamo) desde que se inicio la aplicación.
  • El administrador del programa puede prohibir a un usuario el préstamo

EXTRAS OPCIONALES:
  • aplicar estilos CSS
  • separar la capa de datos (DAO) y conectar con MYSQL

Aplicacion carrito de la compra

aplicacion carrito de la compra paso a paso en:
http://groups.google.com/group/curso-j2ee/web/aplicacion-tienda-con-servlets

miércoles, 21 de enero de 2009

Ejercicios: contador visitas, cronometro, chat

Proyecto contador:
  • El Contador contabilizara todas las peticiones de todos los usuarios!
  • ContadorUsuarios contabilizará los usuarios que se han conectado a la aplicación desde que se inicia la app
  • ContadorUsuriosConectados contabilizará los usuarios conectados en el momento actual a la aplicación.




pdf: filtros en la practica


filtros project
damos de alta un servlet para el registro de usuario (formulario de registro)
activacion de seguridad con filtro de registro de usuario


algunos ejemplos sobre filtros...


martes, 20 de enero de 2009

Listeners en el api de servlet y colecciones en java.util

Listeners en servlets
  • application - ServletContext
  • javax.servlet.ServletContextListener
  • javax.servlet.ServletContextAttributeListener
  • session
  • javax.servlet.http.HttpSessionListener
  • javax.servlet.http.HttpSessionAttributeListener
  • javax.servlet.http.HttpSessionActivationListener
  • javax.servlet.http.HttpSessionBindingListener
  • request - event
  • javax.servlet.ServletRequestListener
  • javax.servlet.ServletRequestAtributeListener

Ejemplos de creacion de listeners y activacion en web.xml

¿para qué sirve escuchar (y hacer algo en ese momento) cuando arranca la aplicacion o cuando se conecta por primera vez un usuario nuevo a la aplicación ?
Cuando arranca la aplicación es el momento oportuno para iniciar los recursos comunes a los componentes de la aplicación o situar en un estado concreto la información. Ejemplos de esto pueden ser: conectar con la base de datos, comenzar con una información especifica (zoo con algunos animales dentro...)...
Igualmente es interesante poder limpiar o cambiar recursos al parar o desactivar la aplicación, por ejemplo: desconectar de la base de datos, escribir mail de desactivación, escribir un registro en un fichero ...

Cuando se conecta un usuario es muy util saberlo para inicializar aquellos objetos que el usuario puede utilizar, por ejemplo: el carrito de la compra, servicios, colecciones de objetos ...
Igualmente cuando se desconecta el usuario es util para limpiar recursos asociados con su uso (session)






Ejercicio continuacion de zoo: implementacion de listener de session y de aplicacion

Iniciar la session de usuario con las colecciones iniciadas.
Finalizar la session de usuario añadiendo sus colecciones a un atributo de aplicacion que se llamara "todosLosAnimales" y que será una coleccion de animales de todos los usuarios
session
al iniciar la aplicacion...
arg0.getSession().getServletContext().setAttribute("todosLosAnimales", coleccion);
al finalizar la aplicacion...
List coleccion=arg0.getSession().getServletContext().getAttribute("todosLosAnimales");
coleccion.addAll(arg0.getSession().getAttribute("animales"));





viernes, 16 de enero de 2009

Entender la sobreescritura de metodos 2: sobreescribir equals()

Cómo mantener información de usuario utilizando el objeto session
(y con ello Demostración de llamadas a métodos de la clase java.lang.Object: equals y hascode en relación al uso de colecciones
)


Para la siguiente demostración vamos a crear una discoteca: programa para coleccionar discos.
La funcionalidad va a consistir en 2 paginas web o URLs. Una pagina o peticion(/discoteca) para mostrar el contenido de los discos almacenados en la coleccion del usuario (para almacenar objetos de tipo disco vamos a utilizar la clase java.util.List). Otra pagina o solicitud para (/disco) para mostrar formulario de incluir nuevo disco.

Comenzamos definiendo la clase Disco con las propiedades: titulo, cantante y referencia.

Seguimos con el formulario de nuevo disco que se enviara a la discoteca...
Es decir creamos un nuevo servlet que pintará el formulario y lo damos de alta en el web.xml para que escuche las peticiones en /disco


Creamos el servlet discoteca y lo damos de alta en el web.xml.
El servlet discoteca en esta primera fase de desarrollo, lo unico que hace es comprobar que la discoteca (List ) esta en la session y en caso contrario la crea. Posteriormente la pinta en pantalla (aunque por ahora siempre estará vacía)

En dicho servlet accedemos al objeto session (HttpSession) a través del objeto request.getSession(), obteniendo con este objeto la capacidad de acceder a atributos session.getAttribute("clave") o incluir atributos session.setAttribute("clave", objeto).


Una vez que esto funciona, modificamos el codigo para que: si recibimos el formulario de /disco entonces creamos un nuevo Disco y lo metemos en la coleccion.

Sobreescribimos el metodo toString() de la clase Disco para que imprima el nombre y autor del disco



Limitamos los discos duplicados (implementamos metodo equals y hascode en la clase Disco) para poder utilizar el metodo de la clase List contains: boolean existe=coleccion.contains(object)

Ejercicio: zoo.
Paquete es.cea.zoo
Para practicar los conceptos anteriores: atributos de session, servlets, sobreescritura de metodos (equals y tostring) vamos a realizar un programa para la gestion de un zoologico...
  1. Creamos en eclipse un nuevo proyecto web dinamico. Como nombre le indicamos "zoo"
  2. seleccionamos la pestañita de "servers" dentro de eclipse y boton derecho ->add and remove projects... y le añadimos el recien creado
  3. Los animales que tendremos que gestionar en el zoo serán: leones, jirafas, panteras. Cada animal tendra un nombre y una edad
  4. Creamos un servlet que responda a la peticion "/visita" y nos pinte en pantalla la coleccion de leones, de jirafas y de panteras (en tres lineas, una debajo de la otra)
  5. Creamos un servlet que pinte un formulario para introducir una nueva jirafa en la URL: '/jirafa', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  6. Creamos un servlet que pinte un formulario para introducir una nueva pantera en la URL: '/pantera', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  7. Creamos un servlet que pinte un formulario para introducir un nuevo leon en la URL: '/leon', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  8. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/jirafa', entonces creará una nueva jirafa y la incluira a la coleccion de jirafas existentes
  9. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/pantera', entonces creará una nueva pantera y la incluira a la coleccion de panteras existentes
  10. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/leon', entonces creará un nuevo leon y lo incluira a la coleccion de leones existentes
  11. Modificar el metodo equals de las clases correspondientes (Leon, Jirafa, Pantera) para que al incluirlas a la coleccion no existan duplicados [dos animales se consideran iguales si su nombre y edad es igual*]
  12. aplicar herencia entre las diferentes clases de animales para eliminar el codigo redundante



más sobre la clase Object


En java todo es un objeto! (excepto los tipos primitivos)

Java es un lenguaje orientado a objetos porque existe una herencia "invisible" (sin declarar de forma especifica) de la clase java.lang.Object . Esto quiere decir que todas nuestras clases heredan de la clase java.lang.Object, y con ella 5 de los metodos que declara:
  • clone()
  • equals(Object)
  • finalize()
  • hascode()
  • toString()

Ya hemos visto como sobreescribir el comportamiento del metodo toString() en la entrada anterior, y ahora vamos a cambiar el comportamiento del metodo equals(Object).
Este metodo esta diseñado para saber si un objeto es igual a otro objeto. Un ejemplo de esto sería con cadenas de texto:
String una="ejemplo";
String dos="ejemplo2";
String unaBis="ejemplo";

una.equals(dos)==false
una.equals(unaBis)==true

Este comportamiento sería el esperado, pero si lo probamos en objetos que no son de tipo String entonces comprobaremos que el metodo equals no responde a nuestras expectativas...
http://code.google.com/p/cursoj2ee/source/detail?r=15

En el ejemplo anterior se pone de manifiesto que dos alumnos con el mismo nombre e igual DNI no son iguales como objeto. Es decir al compararlos con equals nos devuelve false.
La razón de ello es que la comparación de objetos no se realiza por sus propiedades sino por la implementación del metodo equals en la clase correspondiente. Si no sobreescribimos el metodo equals dos objetos (obtenidos con new ClaseDeObjeto()) nunca son iguales aunque sus propiedades sean iguales.


Diferencias entre igualdad e identidad
boolean iguales=a.equals(b);
boolean identicos=(a == b);

5dia

Ejercicio: Sobreescribir metodo tostring

4 dia

Entender la Sobreescritura de metodos (Override methods ...)


  • En el siguiente Servlet (Clase java que extiende de HttpServlet) se imprimen dos objetos que se crean en el mismo Servlet. En concreto se crea un objeto de tipo Alumno y otro de tipo Profe, ambos reciben al construirse un parametro de tipo String con el nombre de cada uno...
  • Para imprimir un objeto (de cualquier tipo) se hace de la misma forma que un String, es decir pw.println(objeto+"comentario"+objeto2)
  • Cuando se imprime un objeto en realidad se llama al metodo toString() que comparten todos los objetos, y que nos permite imprimir la dirección del objeto y su clase, pero no valores inteligibles para el usuario
  • Al sobreescribir este metodo cambiaremos la forma de imprimirse un objeto...
  • si intentamos pintar colecciones de objetos (List, Set ...) se imprimiran los objetos contenidos segun la implementacion de toString de cada uno de ellos


rediseñamos la herencia al comprobar puntos comunes entre diferentes clases



Nomenclatura


  • Nombres de clases comienzan con mayuscula y continuan con sintaxis de camello
  • Nombres de clases de prueba con mayuscula y continuan con sintaxis de camello y acaban en Test
  • Nombres de propiedades/objetos/variables comienzan con misnúscula y continuan con sintaxis de camello
  • Nombres de métodos comienzan con misnúscula y continuan con sintaxis de camello
  • Nombres de paquetes: todas las letras en minúscula

Ejercicios Servlets

¿Qué es una aplicación web y que archivos y configuración son necesarios?

aplicacion/
_______/archivo.html
_______/archivo.jsp
_______/imgs/...
_______/css/...
_______/masjsps/archivo.jsp
_______/mashtmls/archivo.jsp
_______/WEB-INF/
web.xml
_______
/WEB-INF/classes/es.cea...
_______
/WEB-INF/lib/librerias.jar

Ejemplos

¿Cómo crear un servlet?
  1. Se crea una clase java que herede (extienda) de HttpServlet (javax.servlet.http.HttpServlet)
  2. se sobreescriben los dos metodos encargados de procesar las solicitudes via GET y via POST
  3. public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
  4. public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
  5. Se reenvia todo lo que pase por doPost a doGet incluyendo en la implementacion del metodo doPost la siguiente linea: doGet(req,res);
  6. Se escribe la respuesta en el metodo doGet utilizando el objeto Writer a traves del objeto response: res.getWriter()
  7. Se da de alta el servlet en el archivo de configuración de la aplicación web: web.xml
  8. Se despliega la aplicación
  9. Consultamos el servlet en la dirección http://localhost:8090/nombreAplicacion/bienvenida


¿cómo imprimimos los resultados del servlet en la pagina web?
  1. Accedemos al objeto PrintWriter para imprimir los resultados: PrintWriter pw = res.getWriter();
  2. Imprimimos lineas con el metodo println("mensaje"): pw.println("

    HOLA SOY UN SERVLET

    ");
  3. Cerramos el objeto de impresion pw.close();

Ejercicios
  1. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/ciudad y que imprima la palabra SEVILLA
  2. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/academia y que imprima la palabra CEA
  3. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/enlaces y que imprima los enlaces del blog del curso
  4. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/formulario y que imprima este formulario
  5. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/calculadora y que imprima este otro formulario
  6. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/registro y que imprima un formulario con los campos usuario y clave y se envie(atributo action) a la direcion /registrar



¿cómo recuperamos los parametros que el usuario nos envia a traves de URLs?
  1. Accedemos al objeto request y utilizamos su metodo getParameter("nombreParametroEsperado")
  2. El valor que retorna se lo asignamos a una variable
  3. si la variable es diferente de null entonces lo imprimios en el resultado
Ejercicios
  1. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/envioFormulario y que imprima los valores nombre y apellidos
  2. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/calcular y que imprima el resultado de los parametros sumando1 y sumando2
  3. crear otro servlet que responda a la peticion http://localhost:8090/nombreAplicacion/registro y que imprima el resultado de los parametros usuario y clave.

miércoles, 14 de enero de 2009

Instalacion de herramientas

descarga e instalacion de eclipse
descarga e instalacion de jboss tools
descarga e instalacion de tomcat

creacion de cuenta gmail, blogger y delicious
configuracion de firefox con delicious

configuracion de eclipse con tomcat, nuevo proyecto web dinamico y despligue