lunes, 1 de marzo de 2010

Integrando Struts + Spring + Ibatis

Para empezar haré una breve definición de c/u de los frameworks:


  • Struts (1.3): Struts es una herramienta de soporte para el desarrollo de aplicaciones Web bajo el patrón MVC, usada en la programación de aplicaciones web JEE. Otros similares: Spring MVC, JSF entre los más populares.

  • Spring(2.5 - 3):es un poderoso MetaFramework para Java donde su principal objetivo es la inyección de dependencias. Desde nuestros programas - en vez de hacer new() y con cientos de inicializaciones de valores - simplemente obtenemos el objeto ya preparado desde Spring.

  • iBatis: Framework de Persistencia de Datos (se sitúa entre la lógica de Negocio y la capa de la Base de Datos). Se asocia a la fuente de datos mediante sentencias sql o procedimientos almacenados descritos en ficheros XML. Otros similares: Hibernate.
Empezaremos definiendo el archivo de web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 <display-name>demoprp</display-name>

 
<context-param>
  <param-name>log4jConfigLocation</param-name>
  <param-value>/WEB-INF/log4j.properties</param-value>
 </context-param>

<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
 
<listener>
 <listener-class>
  org.springframework.web.util.Log4jConfigListener
 </listener-class>
</listener>

<listener>
 <listener-class>
  org.springframework.web.context.ContextLoaderListener
 </listener-class>
</listener>
 
 
 

<servlet>
 <servlet-name>action</servlet-name>
 <servlet-class>
  org.apache.struts.action.ActionServlet
 </servlet-class>

 <init-param>
  <param-name>config</param-name>
  <param-value>/WEB-INF/struts-config.xml</param-value>
 </init-param>
 <load-on-startup>2</load-on-startup>
</servlet>


Ahora definiremos el archivo de configuración de Spring el applicationContext.xml....
Por ahora definiré el bean dataSource con los datos del conexión en duro.. luego hablaremos la forma en como jalar los datos de conexión desde un *.properties para mayor facilidad de futuros cambios en en la etapa de producción. Usaremos Mysql 5.0 para esta demo.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 

<property name="driverClassName">    
    <value>com.mysql.jdbc.Driver</value>
</property>
<property name="url"> 
    <value>jdbc:mysql://localhost:3306/bdTest
</property>
<property name="username"><value>root</value></property>
<property name="password"><value>mysql</value></property>

</bean>


     
   
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

<property name="configLocation">
    <value> classpath:/pedro/rios/demo/persistency/ibatis/sql-map-config-cx.xml </value>
</property>
<property name="dataSource"><ref local="dataSource"/></property>     
</bean>

 
<bean id="empleadoCtx" class="pedro.rios.demo.daoIbatisImpl.EmpleadoDAOIbatisImpl">
   <property name="sqlMapClient">
      <ref bean="sqlMapClientMysql"/>
   </property>
</bean> 

<bean id="empleadoServiceId"  class="pedro.rios.demo.serviceImpl.EmpleadoServiceImpl">
    <property name="empleadoDAO" ref="empleadoCtx"> </property>
</bean>
  
</beans>

Como podemos apreciar el archivo de mapeo de xml pertenecientes a iBatis se encuentra dentro del src: en el paquete pedro.rios.demo.persistency.ibatis.sql-map-config.xml

Ahora veremos el archivo donde se encuentran mapeados todos los archivos pertenecientes a ibatis sql-map-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
    <sqlMap resource="pedro/rios/demo/ibatis/xml/Empleado.xml"/> 
    ...
</sqlMapConfig>


A continuación veremos la definición del archivo Empleado.xml que contiene todos los querys de la entidad Empleado.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="Empleado" >
    <typeAlias alias="beanEmpleado" type="pedro.rios.bean.EmpleadoBean"/>

    <insert id="insertEmpleado" parameterClass="beanEmpleado">
  INSERT INTO tbempleado (nombre,apepat,apemat,email) 
  VALUES (#nombre#,#apepat#,#apemat#,#email#)
    </insert>

</sqlMap> 


En seguida veremos como está estructurado la capa DAO...

package pedro.rios.demo.dao;

import pedro.rios.demo.bean.EmpleadoBean;

public interface EmpleadoDAO { 
  public void insertEmpleado(EmpleadoBean beanEmpleado);  
}

//Otro archivo:

package pedro.rios.demo.daoIbatisImpl;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
import pedro.rios.demo.bean.EmpleadoBean;
import pedro.rios.demo.dao.EmpleadoDAO;

public class EmpleadoDAOIbatisImpl extends SqlMapClientDaoSupport implements EmpleadoDAO {
 
    public void insertEmpleado(EmpleadoBean beanEmpleado){
 getSqlMapClientTemplate().insert("insertEmpleado", beanEmpleado); 
    }
 
}

Ahora definiremos los Service de acceso a los daos...

package pedro.rios.demo.service;

import java.util.List;
import pedro.rios.demo.bean.EmpleadoBean;

public interface EmpleadoService {
  
  public void insertEmpleado(EmpleadoBean beanEmpleado); 
}

//otro archivo 

package pedro.rios.demo.serviceImpl;

import java.util.List;

import pedro.rios.demo.bean.EmpleadoBean;
import pedro.rios.demo.dao.EmpleadoDAO;
import pedro.rios.demo.service.EmpleadoService;


public class EmpleadoServiceImpl implements EmpleadoService{
 
 private EmpleadoDAO empleadoDAO;

  /**
  * @return the empleadoDAO
  */
 public EmpleadoDAO getEmpleadoDAO() {
  return empleadoDAO;
 }

 /**
  * @param empleadoDAO the empleadoDAO to set
  */
 public void setEmpleadoDAO(EmpleadoDAO empleadoDAO) {
  this.empleadoDAO = empleadoDAO;
 }

  
  public void insertEmpleado(EmpleadoBean beanEmpleado){
  getEmpleadoDAO().insertEmpleado(beanEmpleado);
  }
}




Como vemos toda la lógica de negocio está lista para ser usada por nuestra capa de vista.. En el próximo posteo veremos como terminar de implementar Struts y la forma como invocar el método insertEmpleado desde un jsp. Por ahora solo hemos definido el archivo de configuración de Struts en el web.xml... Hasta la próxima publicación.. Espero que les sirva esta demo... Espero sus comentarios.. xD

7 comentarios:

Unknown dijo...

Ta buena la información ahora lo voy a poner en práctica .. Noemí

Victor Luis dijo...

muy buena tu explicacion, pero me gustaria si puedes compartir un proyecto pequeño para poder entender mucho mejor, si fuese mucho la amabilidad me puedes enviar a mi mail : vmaitas@gmail.com

Gracias.

JAVAMAN dijo...

Interesante tu integracion y tu Blog Pedro, pero sería bueno que al final de cada post compartas las fuentes vía RapidShare por ejemplo.

Aquí comparto mis Blogs:

http://frameworksjava2008.blogspot.com
http://viviendoconjavaynomoririntentandolo.blogspot.com

Saludos.

Pedro Edison Rios dijo...

Ok compañero lo tendre muy en cuenta.. Estan muy buenos tus blog ... Saludos

Anónimo dijo...

hola pedrome gustaria saber como lo integras con el struts y si pudieras colocar un video estaria xvr!!! un buen aporte gracias!!

Anónimo dijo...

Tengo una duda hay un
este a donde hace referencia porque no se muestra

Saludos!!!!!!!!!!

Pedro Edison Rios dijo...

No entiendo tu pregunta amigo.. Saludos

Publicar un comentario