lunes, 9 de marzo de 2009

Día 38: Struts2, Spring e Hibernate

Struts 2

Deja de haber un struts-config para ahora ser un struts.xml y su ubicación también cambia y pasa de estar en el WEB-INF a estar en el src/main/resources.
En el archivo "struts.properties" se puede cambiar por dónde escucharán las acciones en el campo "struts.action.extension".
En el archivo "applicationContext.xml" podemos ver el primer uso de spring.
En las etiquetas "bean" lo que hace es como en java crear objetos, por ejemplo "bean id="helloWorldAction" class="es.cea.HelloWorldAction" singleton="false""
Tambien tiene sus propias versiones a los "getters y setters" con los "property" y sus "value"

Ejercicio
El ejercicio consiste en la creación de un nuevo formulario sobre un libro, que introduzcamos el título del libro y su referencia y después el formulario se enviará a editLibro.action que aparezcan los valores en pantalla.

Para que el ejercicio funcione correctamente debemos hacer lo siguiente (se puede variar el orden, así es como yo lo hice):
  • Primeramente crear el Action, que tenga de valores el título y la referencia.
    Colocar antes de la clase la anotación "@Validation".
    Introducir sus métodos getters y setters.
    Introducir antes de cada getter y setter de cada campo la anotación de validación. "@RequiredStringValidator(...)"
    Y por último el método "execute()"
  • Lo segundo es hacer el primer jsp, poniendo la base del formulario con el s:form y los s:textfield poniendo como "name" el nombre exacto de cada campo del libro que hicimos antes.
  • El segundo jsp pondremos directamente un mensaje diciendo que nuestro titulo y referencia es: y ahí ponemos "s:property" y de "value" el nombre del campo del libro
  • Ahora continuemos con la configuración y funcionamiento interno. Nos vamos a "applicationContext.xml" y abajo del todo haremos un nuevo "bean" de "id" el que queramos y de "class" la clase Action que creamos al principio.
  • En "struts.xml" creamos una nueva "action" de "class" con el mismo nombre que el id que pusimos antes y de "name" el nombre de la acción (que será lo que pondremos en el navegador para acceder a él, yo puse "crearLibro")
    Dentro de la etiqueta "action" ponemos un par de etiquetas llamadas "result", la primera de "name": "input" que será la página de la que enviará el formulario y el otro result, sin "name" será a la que redirigirá.

Con todos estos pasos hechos debería funcionar y a la hora de escribir "http://localhost:8080/struts2/crearLibro.action" debería salir el formulario de entrada y al enviarlo mostrar lo que escribimos.

Spring
El Spring Framework hace de factoría de objetos. Crea los objetos y los contiene además de que lo gestiona.
Como dijimos anteriormente en esta misma entrada:
"
En las etiquetas "bean" lo que hace es como en java crear objetos, por ejemplo "bean id="helloWorldAction" class="es.cea.HelloWorldAction" singleton="false""
Tambien tiene sus propias versiones a los "getters y setters" con los "property" y sus "value"
"
También recibe objetos y es que en vez de usar "value" para introducir una cadena, un valor, a un parametros, usaremos "ref" para referenciar a otro objeto, otro bean.

Conozcamos algo más de spring AQUI

Ejercicio
Crear clases: Coche con marca y Motor con 2 tipos de motor, gasolina y diesel. Creando también sus test y sus respectivos applicationContext.xml

Los pasos del ejercicio serían:
  • Nos creamos dos clases: Clase Motor: contendrá la propiedad Tipo. Clase Coche: contendrá las propiedades Marca y Motor de tipo Motor.
    Creamos sus getter y setters.
  • Creamos un applicationContext.xml nuevo, que lo llamaremos "applicationContextCoches.xml" y crearemos los objetos de tipo Motor y de tipo Coche según Spring. "bean id=motorGasolina class=eticom.di.model.Motor" con un "property name=tipo value=Gasolina" y cerramos el "/bean"
    Haremos lo mismo otra vez pero esta vez de tipo Diesel.
    Con esto lo que hacemos es crear un objeto de tipo motor con el parametro "tipo" (que es String) con el valor que le indiquemos.
  • Hacemos dentro del "applicationContextCoches.xml" los objetos del Coche. "bean id=cocheGasolina class=eticom.di.model.Coche" y sus property "property name=marca value=Ford" y el más importante: "property name=motor ref=motorGasolina" y cerramos el "/bean"
    Con el "ref" lo que hacemos es rellenar la propiedad "Motor" de tipo Motor en el objeto Coche haciendo referencia al objeto que hemos hecho de tipo motor a través de Spring.
  • Creamos un test que compruebe que las marcas, los tipos y demás propiedades sean correctas.
    Para ello debemos tener un método con la anotación "@BeforeClass" que importe el xml del cual podamos acceder.
    Resource resource = new FileSystemResource("src/main/resources/applicationContextCoches.xml");
    factory = new XmlBeanFactory(resource);

    Y en cada método que vayamos a hacer la comprobación haremos:
    Object bean = factory.getBean("motorGasolina");
    En "motorGasolina" pondremos el objeto que queramos recuperar que hizo el spring.


Hibernate

Ejercicio
Guión:
Crear clase género con un ID y un NOMBRE (En el proyecto "libreria-model")
Crear un fichero de mapeo genero.hbm.xml
(el resto es del proyecto "libreria-dao-hibernate-xml")
Incluimos el nuevo mapeo en el fichero de configuración de hibernate hibernate.cfg.xml
Modificamos import.sql
Hacemos una prueba

Pasos:
  • Primeramente creamos un bean llamado genero, con un id y un nombre.
  • Creamos un fichero nuevo de mapeo llamado Genero.hbm.xml que llama a la clase que hemos creado y nombramos la tabla que creará: "generos" además de escecificarle el id y la propiedad nombre.
  • Añadimos una nueva ruta de mapeo en el archivo de configuración de hibernate "hibernate.cfg.xml" que será el archivo que hemos creado de mapeo de generos.
  • Modificamos el import.sql para que añada dos campos nuevos.
  • Creamos un test nuevo para comprobar que nos funciona pero para ello necesitaremos crear un método nuevo en "LibreriaDAOHibernate.java" que devuelva un género dada el id y otro que devuelve una lista de géneros sin decirle nada.


Ejercicio mejorado
Guión:
Relacionar la clase libro con la clase género.
La relación es: un libro tiene siempre un género, un género puede tener 0 o muchos libros.
En genero crear un get libros.
En libro crear el genero, para que haya una relación.

Pasos:
  • Añadimos una propiedad "genero" de tipo Genero en la clase Libro y añadimos en Genero una propiedad "libros" de tipo Set y por supuesto, sus métodos getters y setters.
  • Actualizamos Genero.hbm.xml y Libro.hbm.xml añadiendo las relaciones y valores necesarios.
  • Actualizamos el import.sql
  • No nos olvidemos de actualizar el applicationContext.xml de nuestra aplicación.
  • Actualizar el import.sql de nuestra aplicación.
  • INSTALAR los proyectos que hemos modificado (libreria-model, libreria-dao-hibernate, ....

No hay comentarios:

Publicar un comentario