Blog personal de Luis Córdoba Fallas.

lunes, 17 de marzo de 2014 0 comentarios

Pasos para crear una aplicación JAVA MVC – IBM Rational Application Developer, Hibernate y Spring. (Versión extendida)

Pasos para crear una aplicación  JAVA MVC – IBM Rational Application Developer, Hibernate y Spring.

Versión Extendida

Antes de empezar debemos tener claro los paquetes en cada una de las capas que vamos a utilizar, las cuales se muestran en la imagen siguiente.

Imagen 1: Estructura de paquetes


Paso 1:
Primero se debe crear la clase en el paquete “domain” para este caso utilizaremos la clase llamada “Ejemplo.java” ver imagen 2.
Una vez creada la clase incluimos los atributos, para cada uno de los atributos se deben crear los Getter y Setter, adicionalmente se debe serializar la clase para generar la persistencia de la misma para serializarla únicamente implementamos la interfaz Serializable “implements Serializable” más información en: http://goo.gl/GECuoB
Seguidamente  se generan el Hascode() y el Equals(), esto nos va a permitir comparar dos objetos del mismo tipo para saber si son el mismo, para obtener más información sobre el mismo pueden ver: http://goo.gl/RZFUdh
El código debe de quedar de la siguiente manera:

package cr.go.ice.dmc.peva.domain;

import java.io.Serializable;

/**
 * <p>TODO <<Interface|Clase>> cr.go.ice.dmc.peva.domain.Ejemplo.java</p>
 * <p>Modulo (subsistema): TODO <<Sistema>></p>
 * <p>TODO Descripcion de <code>Ejemplo.java</code>.</p>
 * <p>Fecha creación: 28/02/2014</p>
 * <p>Ultima actualización: 28/02/2014</p>
 * @author ICE (Luis Córdoba Fallas)
 * @version 1.0
 */
public class Ejemplo implements Serializable{

      /** Atributo <code>serialVersionUID</code> */
      private static final long serialVersionUID = 6309069611092610954L;
      private Integer id;
      private String nombre;
      private String detalle1;
      private String detalle2;
     
      /**
       * Metodo accesor de id.
       * @return Retorna el id.
       */
      public Integer getId() {
            return id;
      }
      /**
       * Metodo modificador de id.
       * @param id El id a modificar.
       */
      public void setId(Integer id) {
            this.id = id;
      }
      /**
       * Metodo accesor de nombre.
       * @return Retorna el nombre.
       */
      public String getNombre() {
            return nombre;
      }
      /**
       * Metodo modificador de nombre.
       * @param nombre El nombre a modificar.
       */
      public void setNombre(String nombre) {
            this.nombre = nombre;
      }
      /**
       * Metodo accesor de detalle1.
       * @return Retorna el detalle1.
       */
      public String getDetalle1() {
            return detalle1;
      }
      /**
       * Metodo modificador de detalle1.
       * @param detalle1 El detalle1 a modificar.
       */
      public void setDetalle1(String detalle1) {
            this.detalle1 = detalle1;
      }
     
      /**
       * Metodo accesor de detalle2.
       * @return Retorna el detalle2.
       */
      public String getDetalle2() {
            return detalle2;
      }
      /**
       * Metodo modificador de detalle2.
       * @param detalle2 El detalle2 a modificar.
       */
      public void setDetalle2(String detalle2) {
            this.detalle2 = detalle2;
      }
      /**
       * @see java.lang.Object#hashCode()
       */
      @Override
      public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            return result;
      }
      /**
       * @see java.lang.Object#equals(java.lang.Object)
       */
      @Override
      public boolean equals(Object obj) {
            if (this == obj)
                  return true;
            if (obj == null)
                  return false;
            if (getClass() != obj.getClass())
                  return false;
            Ejemplo other = (Ejemplo) obj;
            if (id == null) {
                  if (other.id != null)
                        return false;
            } else if (!id.equals(other.id))
                  return false;
            return true;
      }
     
     
     
}


Paso 2:
                Dentro del mismo paquete creamos el mapeo de Hibernate contra la clase, llamaremos a este archivo como Ejemplo.hbm.xml, el formato de este archivo debe ser xml ver imagen 2

Imagen 2: estructura de paquete domain.

El mapeo XML de Hibernate contiene la confrontación de características entre la clase creada en el punto anterior contra la tabla respectiva en la base de datos, cada uno lleva la especificación del tipo de datos y el tamaño, asi como la dirección del paquete en donde se encuentre la clase, la estructura XML para este ejemplo debería de quedar como la siguiente.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
         
<hibernate-mapping package="cr.go.ice.dmc.peva.domain">
    <class name="Ejemplo" table="Prueba">
         <id name="id" column="ID" type="java.lang.Integer" />
       <property name="nombre"     column="NOMBRE"             type="java.lang.String"       length="20"  />
       <property name="detalle1"   column="DETALLE1"             type="java.lang.String"       length="20"  />
       <property name="detalle2"   column="DETALLE2"             type="java.lang.String"       length="20"  />
    </class>     
</hibernate-mapping>

Paso 3:
                En el paquete que finaliza con “.dao” creamos la interfaz de nombre “EjemploDao.java”, en esta vamos a declarar los métodos que luego utilizaremos para el acceso a datos. (Ver imagen 3), entendemos esta capa DAO como “Data Access Objects”.
La estructura de la interfaz debe quedar similar a la siguiente:

public interface EjemploDao {

      public void agregar(Ejemplo ejemplo);

      public void modificar(Ejemplo ejemplo);

      public void eliminar(Ejemplo ejemplo);

      public boolean existe(Ejemplo ejemplo);

      public Ejemplo getEjemplo(Ejemplo ejemplo);

      public List<Ejemplo> getEjemplo();

      public List<Ejemplo> getEjemploBuscar(Ejemplo ejemplo);

}

Paso 4:
                En el paquete indicado como “dao.impl” vamos a crear la clase que implementa la interfaz que creamos en el paso 3, a esta la llamaremos “EjemploDaoImpl.java” (Ver imagen 3), aquí realizamos la implementación de todo el código Java que vamos a utilizar para acceder nuestros datos a través de Hibernate, es importante que al crear la clase debemos indicar que se implemente la interfaz que creamos en el paso 3.



Imagen 3: estructura de paquete dao y dao.impl.
Aquí vamos a Extender las funcionalidades de la clase HibernateDaoSupport agregando la etiqueta “extends HibernateDaoSupport” a la clase respectiva, luego desarrollamos el código para cada uno de los métodos, utilizando para ello los metodos que se extiende de la clase “HibernateDaoSupport”, de igual manera si necesitamos algún estatuto SQL especial aquí debemos realizarlo mediante HQL, se puede obtener más información en la siguiente dirección: http://goo.gl/NTSRXd

La implementación de la clase debería quedar similar a la siguiente.

package cr.go.ice.dmc.peva.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import cr.go.ice.dmc.peva.dao.EjemploDao;
import cr.go.ice.dmc.peva.domain.Ejemplo;

/**
 * <p>TODO <<Interface|Clase>> cr.go.ice.dmc.peva.dao.impl.EjemploDaoImpl.java</p>
 * <p>Modulo (subsistema): TODO <<Sistema>></p>
 * <p>TODO Descripcion de <code>EjemploDaoImpl.java</code>.</p>
 * <p>Fecha creación: 28/02/2014</p>
 * <p>Ultima actualización: 28/02/2014</p>
 * @author ICE (Luis Córdoba Fallas)
 * @version 1.0
 */
public class EjemploDaoImpl extends HibernateDaoSupport implements EjemploDao {

      /**
       * @see cr.go.ice.dmc.peva.dao.EjemploDao#agregar(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public void agregar(Ejemplo ejemplo) {
            HibernateTemplate ht = this.getHibernateTemplate();
            ht.flush();
            ht.clear();
            ht.save(ejemplo);
      }

      /**
       * @see cr.go.ice.dmc.peva.dao.EjemploDao#modificar(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public void modificar(Ejemplo ejemplo) {
            HibernateTemplate ht = this.getHibernateTemplate();
            ht.merge(ejemplo);
      }

      /**
       * @see cr.go.ice.dmc.peva.dao.EjemploDao#eliminar(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public void eliminar(Ejemplo ejemplo) {
            HibernateTemplate ht = this.getHibernateTemplate();
            ht.delete(ejemplo);
      }

      /**
       * @see cr.go.ice.dmc.peva.dao.EjemploDao#existe(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public boolean existe(Ejemplo ejemplo) {
            HibernateTemplate ht = this.getHibernateTemplate();
            Ejemplo e = (Ejemplo) ht.get(Ejemplo.class, ejemplo.getId());
            if (e==null){
                  return false;
            }else{
                  return true;
            }
      }

      /**
       * @see cr.go.ice.dmc.peva.dao.EjemploDao#getEjemplo(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public Ejemplo getEjemplo(Ejemplo ejemplo) {
            HibernateTemplate ht = this.getHibernateTemplate();
            Ejemplo e = (Ejemplo) ht.get(Ejemplo.class, ejemplo.getId());
            return e;
      }

      /**
       * @see cr.go.ice.dmc.peva.dao.EjemploDao#getEjemplo()
       */
      @SuppressWarnings("unchecked")
      @Override
      public List<Ejemplo> getEjemplo() {
            HibernateTemplate ht = this.getHibernateTemplate();
            String hql = "FROM Ejemplo e order by e.id ";
            return  ht.find(hql);  
           
      }

      /**
       * @see cr.go.ice.dmc.peva.dao.EjemploDao#getEjemploBuscar()
       */
      @SuppressWarnings("unchecked")
      @Override
      public List<Ejemplo> getEjemploBuscar(Ejemplo ejemplo) {
            HibernateTemplate ht = this.getHibernateTemplate();
            String hql = "FROM Ejemplo e WHERE (e.id is not null)";
           
            List<Object> filtros = new ArrayList<Object>();
           
            if(!(ejemplo.getId()==null || ejemplo.getId()==0)){
                  hql +="AND (e.id = ?) ";
                  filtros.add(ejemplo.getId());
            }
           
                                  
            if(!(ejemplo.getNombre()==null || ejemplo.getNombre().toString().length()==0)){
                  hql +="AND (UPPER(e.nombre) LIKE ?) ";
                  filtros.add("%" + ejemplo.getNombre()+ "%");
            }
           
            if(!(ejemplo.getDetalle1() == null || ejemplo.getDetalle1().toString().length()==0)){
                  hql +="AND (UPPER(e.detalle1) LIKE ?) ";
                  filtros.add("%" + ejemplo.getDetalle1()+ "%");
            }
           
            hql+="ORDER BY e.id";
           
            Object[] values = new Object[filtros.size()];
        for(int i = 0; i < filtros.size(); i++){
            values[i] = filtros.get(i);
        }
             List<Ejemplo> res= ht.find(hql,values);
        return res;
      }

}


Paso 5:
                Una vez creada interfaz y clase del acceso a datos, procedemos a crear lo mismo pero esta vez para el acceso a la lógica de negocio o bo (Business Objects), primero creamos la interfaz correspondiente en el paquete “.bo” y le damos el nombre de “EjemploBo.java”. (Ver imagen 4)
Esta interface debe quedar similar (Si asi se quiere) a la que implementamos en el paquete “.dao”

public interface EjemploBo {

      public void agregar(Ejemplo ejemplo);

      public void modificar(Ejemplo ejemplo);

      public void eliminar(Ejemplo ejemplo);

      public boolean existe(Ejemplo ejemplo);

      public Ejemplo getEjemplo(Ejemplo ejemplo);

      public List<Ejemplo> getEjemplo();

      public List<Ejemplo> getEjemploBuscar(Ejemplo ejemplo);

}

Paso 6:
                Cuando tenemos la interfaz lista con todos los métodos que vamos a utilizar para acceder la capa de datos, creamos la clase, está la vamos a crear en el paquete “bo.impl” con el nombre “EjemploBoImpl.java” (ver imagen 4)



Imagen 4: estructura de paquete bo y bo.impl.

La clase implementaría la interfaz creada en el paso 5, aquí vamos a declarar una variable de tipo “EjemploDao” con la finalidad de acceder mediante esta la capa de datos, y con ella llamar o utilizar a los métodos implementados, la clase debe quedar de la siguiente manera.

package cr.go.ice.dmc.peva.bo.impl;

import java.util.List;

import cr.go.ice.dmc.peva.bo.EjemploBo;
import cr.go.ice.dmc.peva.dao.EjemploDao;
import cr.go.ice.dmc.peva.domain.Ejemplo;

/**
 * <p>TODO <<Interface|Clase>> cr.go.ice.dmc.peva.bo.impl.EjemploBoImpl.java</p>
 * <p>Modulo (subsistema): TODO <<Sistema>></p>
 * <p>TODO Descripcion de <code>EjemploBoImpl.java</code>.</p>
 * <p>Fecha creación: 28/02/2014</p>
 * <p>Ultima actualización: 28/02/2014</p>
 * @author ICE (Luis Córdoba Fallas)
 * @version 1.0
 */
public class EjemploBoImpl implements EjemploBo {

      private EjemploDao ejemploDao;
     
     
      /**
       * Metodo modificador de ejemploDao.
       * @param ejemploDao El ejemploDao a modificar.
       */
      public void setEjemploDao(EjemploDao ejemploDao) {
            this.ejemploDao = ejemploDao;
      }

      /**
       * @see cr.go.ice.dmc.peva.bo.EjemploBo#agregar(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public void agregar(Ejemplo ejemplo) {
            this.ejemploDao.agregar(ejemplo);
      }

      /**
       * @see cr.go.ice.dmc.peva.bo.EjemploBo#modificar(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public void modificar(Ejemplo ejemplo) {
            this.ejemploDao.modificar(ejemplo);
      }

      /**
       * @see cr.go.ice.dmc.peva.bo.EjemploBo#eliminar(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public void eliminar(Ejemplo ejemplo) {
            this.ejemploDao.eliminar(ejemplo);
      }

      /**
       * @see cr.go.ice.dmc.peva.bo.EjemploBo#existe(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public boolean existe(Ejemplo ejemplo) {
            return this.ejemploDao.existe(ejemplo);
      }

      /**
       * @see cr.go.ice.dmc.peva.bo.EjemploBo#getEjemplo(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public Ejemplo getEjemplo(Ejemplo ejemplo) {
            return this.ejemploDao.getEjemplo(ejemplo);
      }

      /**
       * @see cr.go.ice.dmc.peva.bo.EjemploBo#getEjemplo()
       */
      @Override
      public List<Ejemplo> getEjemplo() {
            return this.ejemploDao.getEjemplo();
      }

      /**
       * @see cr.go.ice.dmc.peva.bo.EjemploBo#getEjemploBuscar(cr.go.ice.dmc.peva.domain.Ejemplo)
       */
      @Override
      public List<Ejemplo> getEjemploBuscar(Ejemplo ejemplo) {
            return this.getEjemploBuscar(ejemplo);
      }

}


Paso 7:
                En la carpeta WEB-INF vamos a encontrar los archivos de configuración, ahí vamos a registrar el Bean que vamos a utilizar en el controlador de eventos o “Controller”, esto lo vamos a hacer de la siguiente manera:
     
      <bean id="ejemploBo" parent="pevaTP">
            <property name="target">
                  <bean class="cr.go.ice.dmc.peva.bo.impl.EjemploBoImpl">
                        <property name="ejemploDao" ref="ejemploDao" />
                  </bean>
            </property>
      </bean>
Paso 8:
                Dentro del archivo “dataAccessContext.xml” buscamos la sección donde se encuentra al sesión Factory, ahí vamos a incluir dentro de “mappingResources” la ubicación de la dirección del archivo “Ejemplo.hbm.xml” que creamos anteriormente en el paquete domain. (ver imagen 5)
                Adicionalmente se debe agregar la dirección de la implementación del acceso a datos tal y como se muestra en la imagen 5.


Imagen 4: estructura de paquete bo y bo.impl.


Una vez realizados estos pasos podemos intentar validar nuestro proyecto o bien intentar publicarlo para verificar que los pasos anteriormente descritos estén bien.


Ing. Luis Córdoba Fallas
 
;