viernes, 8 de febrero de 2008

SPRING - HIBERNATE - Ejemplo

(Tengo que editar 1 par de cosas, como problema al mostrar el código del jsp)

Partiendo de una petición hecha por un usuario a través de una petición web, vamos a obtener una lista de editoriales.



Teniendo en cuesta que ya existe una peticón de 'getUsers', simplemente haremos lo mismo pero con las editoriales.



Partiremos de la clase UserController (myapp/src/main/java/org.appfuse.web), aquí nuestra clase controlador es quien recibira la petición hecha y controlará a donde se redireccionará y que datos debemos cargar.

Por lo tanto, debemos pedir los datos a cargar, que para ellos y sabiendo que pedimos las editoriales, debemos hacer una consulta a nuestra base de datos para pedir las editoriales.

Mediante el diagrama que hemos mostrado, nuestra clase UserController se comunicarña con la clase EditorialManager (que es un Servicio). Ésta a su vez se comunicara con un DAO y ésta a su vez hara la consulta pertinente.

Empezaremos creando un EditorialManager y se la añadiremos a la clase UserController. Por lo tanto nos quedaría:



@Autowired
private EditorialManager editorialManager;

Ahora debemos crear una interfaz EditorialManager. La interfaz la crearemos en: myapp/src/main/java/org.appfuse.service.

Esta interfaz sólo tendrá el método getEditoriales. Por lo tanto nos quedará:



public interface EditorialManager {
public List
getEditorial();
}

Puesto que es una interfaz, debemos implemetar sus métodos con una clase que crearemos en myapp/src/main/java/org.appfuse.service.impl. La clase la llamaremos EditorialManagerImp.

Puesto que nuestro Manager (servicio) se comunica con el Dao, crearemos un dao con el nombre editorialDao de la clase EditorialDao que crearemos posteriormente. Y ahora implementaremos los métodos de la implementación y los getters & setter del editorialDao.
(Recuerda que si al editorialDao le pones otro Nombre cómo dao, hacer un método setEditorialDao)

Al final obtendremos:



public class EditorialManagerImpl implements EditorialManager
{
public EditorialDao editorialDao;

@Override
public List getEditorial() {
return editorialDao.getEditorial();
}
public getEditorialDao()

{
return this.editorialDao;
}

public setEditorialDao(EditorialDao editorialdao)
{
this.editorialDao=editorialDao;
}
}


En estos momentos nos dirá que no existe la clase EditorialDao y por lo tanto no reconoce la variable editorialDao. Crearemos el interfaz EditorialDao en el paquete org.appfuse.dao, y le añadiremos el método getEditorial.

Una vez creada la interfaz vamos retocar un archivo de configuración para decirle que siempre que se quiera acceder a la interfaz EditorialManager, se debe ir a su implementación EditorialmanagerImpl. Para ello accdemos al applicationContext.xml (myapp/src/main/webapp/WEB-INF) y añadiremos:

Añadimos el Bean de editorialManager. (buscad por el id)

Aquí podeis ver el applicationContect.xml.

Una vez modificado el application-context, insertaremos el método getEditoriales a la interfaz.

public interface EditorialDao {
public List
getEditorial();
}


Pueto que es una interfaz, ahora debemos implementarla. Para ello nos crearemos una clase EditorialDaoImp y la guardaremos en el paquete org.appfuse.dao.impl. Y le diremos que extienda de HibernateDaoSupport para que se pueda conectar a la base de datos e implemente de la interfaz EditorialDao.

En el método getEditoriales, haremos una consulta a la base de datos a traves de la siguiente linea de código:

getHibernateTemplate().find("from Editorial")

Ésto nos devolvería una lista de Editoriales, qué es lo que deseamos, por lo tanto esto lo iremos devolviendo hasta llegar al UserControler.

Al final nos quedará:



public class EditorialDaoImpl extends HibernateDaoSupport implements
EditorialDao {
@Override
public
List getEditorial() {
return
getHibernateTemplate().find("from Editorial");
}

}

Al igual que antes modificamos el applicationContext, ahora debemos modificar el applicationContext-hibernate para decirle que siempre que se llame a la interfaz donde debe buscar su implementación. Y a parte para decirle que donde debe ir a buscar la tabla cuando haga la consulta y que estructura seguirá.






Con ello le decimos que siempre que se acceda a la interfaz editorialDao su clase de implementación es EditorialDaoHibernate

Añadiremos esta línea dentro del List:

org/appfuse/model/Editorial.hbm.xml


Aqí le decimos que existirá una tabla basado en la estructura encontrada en Editorial-hbm.xml.

Ahora necesitamos crear el xml Editorial-hbm.xml (paquete: org/appfuse/model). Cuyo cuerpo será:




Con la etiqueta 'table', creará una tabla con el nombre que le pongamos, en este caso 'app_editorial'. Nuestra tabla sólo tendrá dos parámetros, una id y un nombre, cuyo id será una clave.

Sólo faltaría decirle al UserController que siempre que se llame a la página Editoriales.html nos carge una lista de editoriales, y para ellos usaremos el model.



@RequestMapping("/editoriales.html")
public String executeEditorial(ModelMap
model){

model.addAttribute("listaEditoriales",userManager.getEditoriales());

return "editorialList";
}


Tan sólo faltaría modificar nuestro jsp y decirle que nos muestre la tabla que hemos denominado "listaEditoriales".

El jsp lo crearemos en myapp/src/main/webapp, y le pondremos el nombre de 'editorialList', que le hemos dicho en el UserController.




Aquí podeis ver el código.




2 comentarios:

Juan Antonio Ruz dijo...

esto si que te lo has currado!

Anónimo dijo...

muy buen ejemplo. una sugerencia el codigo que esta en el ejemplo si lo pusieras en zip o tar.gz no caeria mal ;) otra sugerencia si no es mucho pedir en los comentarios del codigo podrias poner una especie de explicacion.