17
Ago
10

MyBatis en JSP II

En el documento anterior (VER) vimos una implementación de MyBatis en java pero no hubo una explicación clara de como  funcionada.

para esto necesitamos 3 archivos jar para el funcionamiento de MyBatis:

  • asm-1.5.3.jar
  • cglib-2.1_3.jar
  • mybatis-3.0.1.jar

un archivo de configuración y uno de propiedades:

  • conexion.properties
  • configuracion.xml

conexion.properties guarda los parámetros para conectarse a la base de datos

configuracion.xml es donde configura la conexión a la base de datos y se cargan los N archivos de mapeo.

N archivos de mapeo (1 por Bean para nuestro ejemplo 2)

  • MapaDepartamento.xml
  • MapaEmpleado.xml

en los archivos de mapeo es donde se escriben las consultas a la base de datos y donde se relacionan las variables del bean con los campos de la tabla en la bd.

la clase que se comunica con MyBatis es Model aquí es donde ocurre la magia.

a grandes rasgos:
los jar para que MyBatis funcione, el conexion.properties parámetros para conectarse a la base de datos, configuracion.xml configuración de conexión a la BD y carga de los Mappers, MapaDepartamento.xml y MapaEmpleado.xml relación Bean-tabla BD y consultas sonbre dichas tablas.

Bueno siguiendo con el ejemplo MVC en JSP
(PARA ENTENDER MEJOR EL EJERCICIO REVISAR MVC EN JSP)

la estructura dela aplicación sería algo muy parecido a:

el modelo bajo el cual se trabajo es este:

Base de datos

ejercicios.db

# --------------------------------------------------------
# Host:                         localhost
# Database:                     ejercicios
# Server version:               5.1.36-community-log
# Server OS:                    Win32
# HeidiSQL version:             5.0.0.3222
# Date/time:                    2010-05-24 18:09:13
# --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
# Dumping database structure for ejercicios
CREATE DATABASE IF NOT EXISTS `ejercicios` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `ejercicios`;

# Dumping structure for table ejercicios.departamento
CREATE TABLE IF NOT EXISTS `departamento` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(50) NOT NULL DEFAULT '',
  `descripcion` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=latin1;

# Dumping data for table ejercicios.departamento: 8 rows
/*!40000 ALTER TABLE `departamento` DISABLE KEYS */;
INSERT INTO `departamento` (`id`, `nombre`, `descripcion`) VALUES (1, 'SISTEMAS', 'ENCARGADO DE MANTENER LAS REDES Y DE DESARROLLAR APLICACIONES PARA LA ORGANIZACION'), (2, 'CONTABILIDAD', 'ENCARGADO DE GESTIONAR TODA LA PARTE CONTABLE DE LA ORGANIZACION, LAS ENTRADAS Y SALIDAS DE DINERO Y MUEBLES SE REGISTRAN AQUI'), (3, 'SERVICIOS GENERALES', 'ESTE DEPARTAMENTO ES EL ENCARGADO DE LA ADECUACION Y MANTENIMIENTO DE LA PLANTA FISICA DE LA ORGANIZACION'), (4, 'ADMINISTRACION', 'ESTE DEPARTAMENTO SE ENCARGA DE LA GERENCIA Y TOMA DE DECICIONES DE LA ORGANIZACION'), (5, 'VENTAS', 'ESTE DEPARTAMENTO SE ENCARGA DEL ASESORAMIENTO COMPLETO A CLIENTES, POTENCIALES CLIENTES Y PERSONAS QUE MUESTREN CUALQUIER TIPO DE INTERES O NECESIDAD, SOBRE CUALQUIERA DE LOS SERVICIOS O PRODUCTOS OFRECIDOS POR LA ORGANIZACION'), (6, 'RECURSOS HUMANOS', 'ESTE DEPARTAMENTO SE ENCARGA DE SELECCIONAR Y EVALUAR EL PERSONAL PARA CUMPLIR A CABALIDAD EL OBJETIVO DE NUESTRA ORGANIZACION'), (13, 'ghgh', 'ghghghgh'), (12, 'Pruebe', 'Pruebe');
/*!40000 ALTER TABLE `departamento` ENABLE KEYS */;

# Dumping structure for table ejercicios.empleado
CREATE TABLE IF NOT EXISTS `empleado` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(100) NOT NULL DEFAULT '',
  `apellido` varchar(100) NOT NULL DEFAULT '',
  `identificacion` int(20) NOT NULL DEFAULT '0',
  `departamento` varchar(100) NOT NULL DEFAULT '',
  `sueldo` double NOT NULL DEFAULT '0',
  `transporte` double NOT NULL DEFAULT '0',
  `fdn` date NOT NULL DEFAULT '2010-01-01',
  `foto` varchar(100) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;

# Dumping data for table ejercicios.empleado: 8 rows
/*!40000 ALTER TABLE `empleado` DISABLE KEYS */;
INSERT INTO `empleado` (`id`, `nombre`, `apellido`, `identificacion`, `departamento`, `sueldo`, `transporte`, `fdn`, `foto`) VALUES (1, 'Mauro Cesar', 'Gomez Mejia', 1047381742, '1', 850000, 50000, '1986-07-12', '1273120244484avartaryahoo.bmp'), (2, 'Sandra Patricia', 'Pinedo Florez', 1562153142, '2', 850000, 50000, '1983-03-02', '1273120579281Dibujo.bmp'), (3, 'Cesar Augusto', 'Anaya Boorguez', 1225456345, '4', 850000, 50000, '1975-08-21', '1273121305343images.jpg'), (4, 'Javier Andres', 'Ibarra Lopez', 1045124563, '1', 950000, 50000, '1979-09-17', '1273206286625F200811201452292577871692.jpg'), (5, 'Esther Patricia', 'Molina Ordoñez', 1234542154, '3', 650000, 50000, '1978-11-30', '1273247967593conserje-scrubs.png'), (6, 'David Eduardo', 'Palomino Castro', 1201212542, '5', 650000, 50000, '1986-06-06', '127334048328125299_381812654054_667059054_3891187_3653774_n.jpg'), (7, '111', '111', 111, '5', 500000, 45000, '2011-11-11', '1274713509828n703517459_2360.jpg'), (8, '222', '222', 222, '1', 222222, 22222, '2002-02-02', '1274714006687n1098644586_9567.jpg');
/*!40000 ALTER TABLE `empleado` ENABLE KEYS */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;

LAS JAVA

Beans

Departamento.java

package org;
import java.io.Serializable;
import java.lang.Comparable;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Departamento implements Serializable,Comparable{

	private Integer id = 0;
	private String nombre = "";
	private String descripcion = "";

	public Departamento(){
		 super();
	}

	public Departamento(Integer id, String nombre,String descripcion){
		this.id = id;
		this.nombre = nombre;
		this.descripcion = descripcion;
	}

	public Departamento(Departamento d){
		this.id = d.getId();
		this.nombre = d.getNombre();
		this.descripcion = d.getDescripcion();
	}

	public Integer getId(){
		return id;
	}
	public String getNombre(){
		return nombre;
	}
	public String getDescripcion(){
		return descripcion;
	}

	public void setId(Integer id ){
		 this.id=id;
	}
	public void setNombre(String nombre ){
		 this.nombre=nombre;
	}
	public void setDescripcion(String descripcion ){
		 this.descripcion=descripcion;
	}

	public String toString(){
		return(
		"DATOS:::DEPARTAMENTO:::...\n"+
		"ID             : "+id+"\n"+
		"NOMBRE         : "+nombre+"\n"+
		"DESCRIPCION    : "+descripcion+"\n"+
		"");
	}

	public static Departamento load(ResultSet rs) throws SQLException {
		Departamento departamento = new Departamento();
		departamento.setId(rs.getInt("ID"));
		departamento.setNombre(rs.getString("NOMBRE"));
		departamento.setDescripcion(rs.getString("DESCRIPCION"));
		return departamento;
	}

	public int compareTo(Object departamento){
		return (this.nombre).compareTo(((Departamento)departamento).getNombre());
	}
}

Empleado.java

package org;
import java.io.Serializable;
import java.lang.Comparable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Date;

public class Empleado implements Serializable,Comparable{

	private Integer id = 0;
	private String nombre = "";
	private String  apellido = "";
	private Integer identificacion = 0;
	private Departamento departamento = null;
	private Double sueldo = 0.0;
	private Double transporte = 0.0;
	private Date fdn = new Date(new java.util.Date().getDate());
	private String foto="sinfoto.jpg";

	public Empleado(){
		 super();
	}

	public Empleado(Integer id, String nombre, String  apellido, Integer identificacion, Departamento departamento, Double sueldo, Double transporte, Date fdn,String foto){
		this.id = id;
		this.nombre = nombre;
		this.apellido = apellido;
		this.identificacion = identificacion;
		this.departamento = departamento;
		this.sueldo = sueldo;
		this.transporte = transporte;
		this.fdn = fdn;
		this.foto = foto;
	}

	public Empleado(Integer id, String nombre, String  apellido, Integer identificacion, Departamento departamento, Double sueldo, Double transporte, java.util.Date fdn,String foto){
		this.id = id;
		this.nombre = nombre;
		this.apellido = apellido;
		this.identificacion = identificacion;
		this.departamento = departamento;
		this.sueldo = sueldo;
		this.transporte = transporte;
		this.fdn = new Date(fdn.getTime());
		this.foto = foto;
	}

	public Empleado(Empleado e){
		this.id = e.getId();
		this.nombre = e.getNombre();
		this.apellido = e.getApellido();
		this.identificacion = e.getIdentificacion();
		this.departamento = e.getDepartamento();
		this.sueldo = e.getSueldo();
		this.transporte = e.getTransporte();
		this.fdn = e.getFdn();
		this.foto = e.getFoto();
	}

	public Integer getId(){
		return id;
	}
	public String getNombre(){
		return nombre;
	}
	public String  getApellido(){
		return apellido;
	}
	public Integer getIdentificacion(){
		return identificacion;
	}
	public Departamento getDepartamento(){
		return departamento;
	}
	public Double getSueldo(){
		return sueldo;
	}
	public Double getTransporte(){
		return transporte;
	}
	public Date getFdn(){
		return fdn;
	}
	public String getFoto(){
		return foto;
	}

	public void setId(Integer id ){
		 this.id=id;
	}
	public void setNombre(String nombre ){
		 this.nombre=nombre;
	}
	public void setApellido(String  apellido ){
		 this.apellido=apellido;
	}
	public void setIdentificacion(Integer identificacion ){
		 this.identificacion=identificacion;
	}
	public void setDepartamento(Departamento departamento ){
		 this.departamento=departamento;
	}
	public void setDepartamento(String id_departamento ){
		departamento= new Departamento();
		departamento.setId(Integer.parseInt(id_departamento) );
	}
	public void setSueldo(Double sueldo ){
		 this.sueldo=sueldo;
	}
	public void setTransporte(Double transporte ){
		 this.transporte=transporte;
	}
	public void setFdn(Date fdn ){
		 this.fdn=fdn;
	}
	public void setFdn(java.util.Date fdn ){
		 this.fdn=new Date(fdn.getTime());
	}
	public void setFoto(String foto ){
		 this.foto=foto;
	}

	public String toString(){
		return(
		"DATOS:::EMPLEADO:::...\n"+
		"ID             : "+id+"\n"+
		"NOMBRE         : "+nombre+"\n"+
		"APELLIDO       : "+apellido+"\n"+
		"IDENTIFICACION : "+identificacion+"\n"+
		"DEPARTAMENTO   : "+departamento+"\n"+
		"SUELDO         : "+sueldo+"\n"+
		"TRANSPORTE     : "+transporte+"\n"+
		"FDN            : "+fdn+"\n"+
		"FOTO           : "+foto+"\n"+
		"");
	}

	public static Empleado load(ResultSet rs) throws SQLException {
		Empleado empleado = new Empleado();
		empleado.setId(rs.getInt("ID"));
		empleado.setNombre(rs.getString("NOMBRE"));
		empleado.setApellido(rs.getString("APELLIDO"));
		empleado.setIdentificacion(rs.getInt("IDENTIFICACION"));
		empleado.setDepartamento(rs.getString("DEPARTAMENTO"));
		empleado.setSueldo(rs.getDouble("SUELDO"));
		empleado.setTransporte(rs.getDouble("TRANSPORTE"));
		empleado.setFdn(rs.getDate("FDN"));
		empleado.setFoto(rs.getString("FOTO"));
		return empleado;
	}

	public int compareTo(Object empleado){
		return (this.apellido).compareTo(((Empleado)empleado).getApellido());
	}
}

Models

Model.java

package org;
import java.util.List;
import java.sql.SQLException;

/*clases necesarias para conectar con ibatis*/
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSession;

public class Model{
	/*variable donde tenemos la direccion del archivo de configuracion de ibatis*/
	private String resources="";
	/* variable de sesion sql de ibatis*/
	/*SqlSession tiene varios metodos donde accedemos a las consultas sql declaradas en el mapper*/
	private transient SqlSession session=null;

	public Model(){
		try {
			conectar();
		} catch (Exception ex){}
	}

	public void setResources(String a) {
		resources = a;
	}

	public String getResources(){
		return resources;
	}

	public void conectar() throws SQLException {
		try {
			/*Reader variable que se utiliza para acceder al archivo de configuracion de ibatis */
			Reader reader=Resources.getResourceAsReader(resources);
			/*SqlSessionFactory es el constructor de la session sql esta la utilizamos para abrir una session */
			SqlSessionFactory sqlSessionFactory= (new SqlSessionFactoryBuilder()).build(reader,"ejercicios");
			/*pedimos una sesion sql y la almacenamos en session */
			session=sqlSessionFactory.openSession();
		} catch (Exception ignorar) {
			throw  new SQLException("Model.conectar()  "+ignorar );
		}

	}

	public void desconectar() {
		try {
			if (session.getConnection()  != null) {
				session.getConnection().close();
			}
		} catch (Exception ignorar) {}
	}

	public boolean estaConectado() {
			return (session.getConnection() != null);
	}

	public void agregarDepartamento(Departamento departamento) throws SQLException{
		/*insert para decir que es un tipo de consulta insert*/
		/*agregarDepartamento nombre de la consulta*/
		/*departamento es el parametro requerido*/
		session.insert("agregarDepartamento",departamento);
	}

	public Departamento buscarDepartamento(Integer id) throws SQLException {
		return ((Departamento)session.selectOne("buscarDepartamento",id));
	}

	public boolean eliminarDepartamento( Integer id)throws SQLException{
		if (this.buscarDepartamento(id)==null){
			throw new SQLException("Registro de Departamento identificado con: "+id+", no encontrado");
		}
		int r=session.delete("eliminarDepartamento",id);
		return r!=0;
	}

	public boolean existeDepartamento(Integer id)throws SQLException{
		return (buscarDepartamento(id)!=null);
	}

	public List listaDepartamento() throws SQLException {
		return session.selectList("listaDepartamento");
	}

	public void agregarEmpleado(Empleado empleado) throws SQLException {
		session.insert("agregarEmpleado",empleado);
	}

	public Empleado buscarEmpleado(Integer id) throws SQLException {
		return ((Empleado)session.selectOne("buscarEmpleado",id));
	}

	public boolean eliminarEmpleado( Integer id)throws SQLException{
		if (this.buscarEmpleado(id)==null){
			throw new SQLException("Registro de Empleado identificado con: "+id+", no encontrado");
		}
		int r=session.delete("eliminarEmpleado",id);
		return r!=0;
	}

	public boolean existeEmpleado(Integer id)throws SQLException{
		return (buscarEmpleado(id)!=null);
	}

	public List listaEmpleado() throws SQLException {
		return session.selectList("listaEmpleado");
	}

}

WebModel.java

package org;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import java.sql.SQLException;

public class WebModel extends Model implements HttpSessionBindingListener {

	//al iniciar esta pagina que pasa
	public void init(ServletContext context)throws ServletException{
		//traemos los parametors del XML
		String resources=context.getInitParameter("resources");

        //los seteamos
		setResources(resources);
		//nos conectamos
		try {
			conectar();
		}catch(SQLException ex) {
			throw new ServletException(ex.getMessage());
		}
	}

    public void valueBound(HttpSessionBindingEvent event) {}

    //si algo ocurre nos desconectamos
    public void valueUnbound(HttpSessionBindingEvent event) {
        desconectar();
    }

}

Actions

Action

package org;

import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public abstract class Action {
	protected HttpServletRequest request;
	protected HttpServletResponse response;
	protected ServletContext application;
	protected Model model;

	/*Este metodo todas las acciones que hereden deberan adaptarlo*/
	/*a la necesidad, (sobre-escribirlo)*/
	public abstract void run()throws ServletException, IOException;

	public void setRequest(HttpServletRequest request){
		this.request=request;
	}

	public void setResponse(HttpServletResponse response){
		this.response=response;
	}

	public void setApplication(ServletContext application){
		this.application=application;
	}

	public void setModel(Model model){
		this.model=model;
	}
}

AgregarDepartamento.java

package org;

//clases para que sea servlet
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;

public class AgregarDepartamento extends Action {
	//funcionalidad de este servlet
	public void run()throws ServletException, IOException{
		try {
			Departamento departamento=new Departamento();

			departamento.setNombre(request.getParameter("nombre"));
			departamento.setDescripcion(request.getParameter("descripcion"));

			model.agregarDepartamento(departamento);
		}catch (Exception ex) {
			throw new ServletException(ex.getMessage());
		}
		RequestDispatcher rd=application.getRequestDispatcher("/index.jsp?pagina=gd");
		if(rd==null){
			throw new ServletException("pagina no encontrada");
		}
		rd.forward(request,response);
	}

}

AgregarEmpleado.java

package org;

//calses para que sea servlet
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;

//clases para el tratamiento de archivos
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import java.io.File;

//clases para el tratamiento de los datos
import java.util.List;
import java.util.HashMap;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class AgregarEmpleado extends Action {

	public void run()throws ServletException, IOException{
		try {
			String IMGSFOLDER=(String)application.getAttribute("IMGSFOLDER");
    		FileItemFactory file_factory = new DiskFileItemFactory();
    		ServletFileUpload servlet_up = new ServletFileUpload(file_factory);
			List items = servlet_up.parseRequest(request);
			HashMap<String,String> parametros=new HashMap<String,String>();

    		for(int i=0;i<items.size();i++){
				FileItem item = (FileItem) items.get(i);
				String valor="";
        		if (item.isFormField()){
					valor=item.getString();
        		}else{
					valor=(new Date().getTime())+item.getName();
					File archivo_server = new File(IMGSFOLDER+valor);
					item.write(archivo_server);
				}
				parametros.put(item.getFieldName().toLowerCase(),valor);
			}
			DateFormat formato_fecha = new SimpleDateFormat("dd/MM/yyyy");

			Empleado empleado=new Empleado();

			empleado.setNombre(parametros.get("nombre"));
			empleado.setApellido(parametros.get("apellido"));
			empleado.setIdentificacion(Integer.parseInt(parametros.get("identificacion")));
			empleado.setDepartamento(parametros.get("departamento"));
			empleado.setSueldo(Double.parseDouble(parametros.get("sueldo")) );
			empleado.setTransporte(Double.parseDouble(parametros.get("transporte")));
			empleado.setFdn(formato_fecha.parse(parametros.get("fdn")));
			empleado.setFoto(parametros.get("foto"));
			model.agregarEmpleado(empleado);
		}catch (Exception ex) {
			throw new ServletException(ex.getMessage());
		}
		RequestDispatcher rd=application.getRequestDispatcher("/index.jsp?pagina=ge");
		if(rd==null){
			throw new ServletException("pagina no encontrada");
		}
		rd.forward(request,response);
	}

}

Controlador

Controller.java

package org;

import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
import java.util.StringTokenizer;
import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Controller extends HttpServlet{

	public void doGet(HttpServletRequest rq, HttpServletResponse rp)throws IOException, ServletException{
		ejecutar(rq, rp);
	}

	public void doPost(HttpServletRequest rq, HttpServletResponse rp)throws IOException, ServletException{
		ejecutar(rq, rp);
	}

	private void ejecutar(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException{
		//*llamamos a la session*/
		HttpSession session=request.getSession();
		//*sacamos el mapa de acciones de la session*/
        Map mapaAcciones = (Map) session.getAttribute("mapaAcciones");
        //*si aun no exite*/
        if(mapaAcciones==null){
        	//*lo inicializamos*/
            mapaAcciones=new HashMap();
        }
        //*ServletContext contexto de la aplicacion*/
        ServletContext context=getServletContext();
        try {
        	//*ruta (Accion) a ejecutar*/
            String infoRuta = request.getPathInfo();
            //*si la ruta es null*/
            if(infoRuta==null){
            	//*lanzamos una exception*/
            	throw new ServletException("RUTA DESCONOCIDA");
            }
            //*declaramos una accion, y la cargamos de mapa de acciones*/
            Action accion= (Action) mapaAcciones.get(infoRuta);
            //*si la accion no se encuentra en el mapa*/
            if(accion==null){
            	//* la ruta viene en el formato "Accion/Bean" */
            	//* la ruta viene en el formato "Palabra1/Palabra2" */
            	//*dividimos la ruta en 2 justo por el caracter '/' */
            	StringTokenizer st = new StringTokenizer(infoRuta,"/");
            	//*si el numero de partes es diferente de 2 hubo algun error */
                if(st.countTokens()!=2){
                	//*lanzamos una excepcion*/
                	throw new ServletException("estado interno invalido- no hay informacion de ruta["+infoRuta+"]");
                }
                //*Parte uno de la Accion */
                String evento = st.nextToken();
                //*Parte dos de la Accion */
                String bean = st.nextToken();
                //*nombre de la clase de la Accion*/
                String servlet="org."+ evento + bean;
                try {
                	//*Cargamos la clase*/
                    Class claseAccion = Class.forName(servlet);
                    //*la instanciamos */
                    accion = (Action) claseAccion.newInstance();
                    //*la guardamos en el mapa de acciones*/
                    mapaAcciones.put(infoRuta,accion);
                    //*guardamos el mapa de acciones en la session*/
                    session.setAttribute("mapaAcciones",mapaAcciones);
                }catch (ClassNotFoundException ex){
                	//*no se encontro la clase*/
                    throw new ServletException("No se pudo cargar la clase "+servlet+": "+ex.getMessage());
                }catch (InstantiationException ex){
                	//*no se pudo instansiar la clase*/
                    throw new ServletException("No se pudo instanciar un objeto de la clase "+servlet+": "+ex.getMessage());
                }catch (IllegalAccessException ex){
                	//*acceso no autorizado*/
                    throw new ServletException(servlet+": "+ex.getMessage());
                }
            }
            //*sacamos el model de la session*/
            Model model=(Model)session.getAttribute("model");
            //*si el model == null*/
			if(model==null){
				//*lanza una excepcion*/
				throw new ServletException("MODELO DE CONEXION A BD NULO, IMPOSIBLE CONTINUAR CON LA OPERACION");
			}
			//*seteamos los parametros de la accion*/
            accion.setRequest(request);
            accion.setModel(model);
            accion.setResponse(response);
            accion.setApplication(context);
            //*y la ejecutamos*/
            accion.run();

            //*atrapamos cualquier excepcion */
        } catch (Exception e) {
        	//*Pasamos el mensaje a una ServletException*/
            throw new ServletException("Error... \n"+e);
        }
	}

    public String getServletInfo() {
        return "CONTROLADOR DE ACCIONES Y REDIRECCIONAMIENTO (SIN MI NO HAY COMUNICACION ENTRE LO QUE VES Y LO QUE NO VES);";
    }
}

LAS JSP

index.jsp

<%@ include file="WEB-INF/InitModel.jsp"%>
<html>
	<head>

		<title>MVC</title>
		<style type="text/css"><%@ include file="estilo.css"%></style>
		<!--En este ejercicio repasaremos por todas las funciones vistas anteriormente -->
	</head>

	<body>
		<table width="100%" border="0" cellspacing="0" cellpadding="5">
			<tr>
    			<td colspan="2" valign="top" align="right">
				  <div id="titulo" align="right">
				  	<img src="<%=application.getAttribute("ABSOLUTEURL")%>logo.png" width="282" height="95">
				</div>
			    </td>
		  	</tr>
  			<tr>
    			<td valign="top">
				<ul>
				<li><a href="<%=application.getAttribute("ABSOLUTEURL")%>index.jsp">MENU</a></li>
    			  <li><a href="<%=application.getAttribute("ABSOLUTEURL")%>index.jsp?pagina=gd">Departamentos</a></li>
  			      <li><a href="<%=application.getAttribute("ABSOLUTEURL")%>index.jsp?pagina=ge">Empleados</a></li>
    			</ul>
				</td>
    			<td>
					<%String pagina=request.getParameter("pagina");%>
					<%if(pagina==null){
						pagina="";
					}%>
					<%if(pagina.matches("gd")){%>
						<%@ include file="gestion_departamento.jsp"%>
					<%}%>
					<%if(pagina.matches("ge")){%>
						<%@ include file="gestion_empleado.jsp"%>
					<%}%>
				</td>
		  </tr>
		</table>
	</body>
</html>

gestion_departamento.jsp

<table width="100%" border="0" cellspacing="0" cellpadding="5">
  	<tr>
    	<td valign="top">
			<jsp:include page="registro_departamento.jsp"/>
		</td>
    	<td>
			<div style="height:650px; overflow:scroll;">
				<jsp:include page="listar_departamento.jsp"/>
			</div>
		</td>
  	</tr>
</table>

registro_departamento.jsp

<form action="<%=application.getAttribute("CONTROLLER").toString()%>/Agregar/Departamento" method="post" enctype="application/x-www-form-urlencoded">
	<table id="registro" width="110" border="0" cellspacing="0" cellpadding="5">
		<tr align="center">
			<td colspan="2" align="center">DATOS DEPARTAMENTO</td>
		</tr>
		<tr>
			<td>NOMBRE</td>
			<td><input name="nombre" type="text"> </td>
		</tr>
		<tr>
			<td>DESCRIPCION</td>
			<td><textarea name="descripcion" cols="20" rows="5"></textarea></td>
		</tr>
  		<tr align="center">
    		<td colspan="2" align="center"><input type="submit" value="Guargar"></td>
  		</tr>
	</table>
</form>

listar_departamento.jsp

<%@ page import="java.util.List"%>
<%@ page import="org.Departamento"%>
<%@ page import="org.Model"%>
	<%
		Model model=(Model)session.getAttribute("model");
		List lista_departamento=model.listaDepartamento();
	 %>
		<table border="1" cellspacing="0" cellpadding="5">
			<tr><td colspan="3" align="center" >LISTA DE DEPARTAMENTOS </td></tr>
			<tr><td calign="center" >ID</td><td calign="center" >NOMBRE</td><td calign="center" >DESCRIPCION</td></tr>
  				<%for(int i=0;i<lista_departamento.size();i++){
					Departamento departamento=(Departamento)lista_departamento.get(i);
					out.print("<tr>");
					out.print("<td>"+departamento.getId()+"</td>");
					out.print("<td>"+departamento.getNombre()+"</td>");
					out.print("<td>"+departamento.getDescripcion()+"</td>");
					out.print("</tr>");
				}%>
		</table>
	</body>
</html>

gestion_empleado.jsp

<table width="100%" border="0" cellspacing="0" cellpadding="5">
  	<tr>
    	<td valign="top">
			<jsp:include page="registro_empleado.jsp"/>
		</td>
    	<td>
			<div style="height:650px; overflow:scroll;">
				<jsp:include page="listar_empleado.jsp"/>
			</div>
		</td>
  	</tr>
</table>

registro_empleado.jsp

<%@ page import="java.util.List"%>
<%@ page import="org.Departamento"%>
<%@ page import="org.Model"%>
<form action="<%=application.getAttribute("CONTROLLER").toString()%>/Agregar/Empleado" method="post" enctype="multipart/mixed">
	<table id="registro" width="110" border="0" cellspacing="0" cellpadding="5">
		<tr align="center">
			<td colspan="2" align="center">DATOS EMPLEADO</td>
		</tr>
		<tr>
			<td>Nombre</td>
			<td><input name="nombre" type="text"> </td>
		</tr>
		<tr>
			<td>Apellido</td>
			<td><input name="apellido" type="text"></td>
		</tr>
		<tr>
			<td>Identificacion</td>
			<td><input name="identificacion" type="text"></td>
		</tr>
		<tr>
			<td>Fecha de nacimiento</td>
    		<td><input name="fdn" type="text" value="dd/MM/yyyy"></td>
  		</tr>
  		<tr>
    		<td valign="top">Departamento</td>
    		<td>
				<select name="departamento">
				<%
				Model model=(Model)session.getAttribute("model");
				List lista_departamento=model.listaDepartamento();
				for(int i=0;i<lista_departamento.size();i++){
					Departamento departamento=(Departamento)lista_departamento.get(i);
					out.print("<option value='"+departamento.getId()+"'>"+departamento.getNombre()+"</option>");
				}%>
				</select>
	    	</td>
  		</tr>
  		<tr>
    		<td>Sueldo</td>
    		<td><input name="sueldo" type="text"></td>
  		</tr>
  		<tr>
    		<td>Auxilio de transporte</td>
    		<td><input name="transporte" type="text"></td>
  		</tr>
  		<tr>
    		<td>Foto</td>
    		<td><input name="foto" type="file"></td>
  		</tr>
  		<tr align="center">
    		<td colspan="2" align="center"><input type="submit" value="Guargar"></td>
  		</tr>
	</table>
</form>

listar_empleado.jsp

<%@ page import="java.util.List"%>

<%@ page import="org.Empleado"%>
<%@ page import="org.Model"%>
	<%
		Model model=(Model)session.getAttribute("model");
		List lista_empleado=model.listaEmpleado();
		Double total_sueldo=0.0;
		Double total_auxili=0.0;
	 %>
		<table border="1" cellspacing="0" cellpadding="5">
			<tr><td colspan="2" align="center" >DATOS NOMINA </td></tr>
  				<%for(int i=0;i<lista_empleado.size();i++){
					Empleado empleado=(Empleado)lista_empleado.get(i);

					total_sueldo=total_sueldo+empleado.getSueldo();
					total_auxili=total_auxili+empleado.getTransporte();
					session.setAttribute("empleado",empleado);
			%>
			<tr>
				<jsp:include page="ver_empleado.jsp"/>
			</tr>
		<%}%>
			<tr><td>TOTAL SUELDO</td> <td><%=total_sueldo%></td> </tr>
			<tr><td>TOTAL AUXILIO</td> <td><%=total_auxili%></td> </tr>
			<tr><td>TOTAL NOMINA</td> <td><%=total_sueldo+total_auxili%></td> </tr>
		</table>
	</body>
</html>

ver_empleado.jsp

<%@ page import="org.Empleado"%>
<%@ page import="org.Departamento"%>
<%@ page import="org.Model"%>
<%@ page import="java.util.Date"%>

<%
Empleado empleado=(Empleado)session.getAttribute("empleado");
Date hoy=new Date();
int edad= (hoy.getYear()*365+hoy.getMonth()*30+hoy.getDate());
edad=edad-(empleado.getFdn().getYear()*365+empleado.getFdn().getMonth()*30+empleado.getFdn().getDate());
edad=edad/365;

%>
<td>
	<img  width="150" height="200" src="<%=application.getAttribute("ABSOLUTEURL")%>subidos/<%=empleado.getFoto()%>"/> <br/>
	<%=edad%>&nbsp;A&ntilde;os
</td>
<td>
	<table width="100%" border="0" cellspacing="0" cellpadding="1">
		<tr><td>ID</td><td><%=empleado.getId()%></td></tr>
		<tr>
  			<td>NOMBRE</td><td><%=empleado.getNombre()+" "+empleado.getApellido()%></td>
		</tr>
		<tr>
  			<td>IDENTIFICACION</td><td><%=empleado.getIdentificacion()%></td>
		</tr>
		<tr>
   			<td>DEPARTAMENTO</td><td><%=empleado.getDepartamento().getNombre()%></td>
		</tr>
		<tr>
    		<td>SUELDO</td><td><%=empleado.getSueldo()%></td>
  		</tr>
		<tr>
    		<td>AUXILIO</td><td><%=empleado.getTransporte()%></td>
  		</tr>
		<tr>
    		<td>TOTAL DEVENGADO</td><td><%=empleado.getTransporte()+empleado.getSueldo()%></td>
  		</tr>
	</table>
</td>

CONFIGURACIÓN

InitModel.jsp

<jsp:useBean id="model" scope="session" class="org.WebModel">
	<%model.init(application);%>
</jsp:useBean>

<%
String BASEURL=request.getContextPath();
String CONTROLLER=BASEURL+"/servlet";
String ABSOLUTEURL=application.getInitParameter("ABSOLUTEURL");
String IMGSFOLDER=application.getInitParameter("IMGSFOLDER");

application.setAttribute("CONTROLLER",CONTROLLER);
application.setAttribute("BASEURL",BASEURL);
application.setAttribute("ABSOLUTEURL",ABSOLUTEURL);
application.setAttribute("IMGSFOLDER",IMGSFOLDER);
%>

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

	<display-name>EJERCICIO 16 MYBATIS EN JSP II</display-name>
  	<description> XML de configuracion para aplicar el patron MVC en jsp</description>

	<context-param>
        <param-name>resources</param-name>
        <param-value>org/xml/configuracion.xml</param-value>
    </context-param>

	<context-param>
        <param-name>ABSOLUTEURL</param-name>
        <param-value>http://localhost:8181/ejercicio16/</param-value>
    </context-param>

    <context-param>
        <param-name>IMGSFOLDER</param-name>
        <param-value>c:/Archivos de programa/Apache Software Foundation/Apache Tomcat 6.0.24(stand)/webapps/ejercicio16/subidos/</param-value>
    </context-param>

    <servlet>
        <servlet-name>controlador</servlet-name>
        <servlet-class>org.Controller</servlet-class>
	</servlet>

    <servlet-mapping>
        <servlet-name>controlador</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>

</web-app>

configuracion.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>

	<!-- properties se definen los datos para la conexion -->
	<!-- como las tenemos en un archivo de propiedades -->
	<!-- utilizamos el atributo resource para referenciarlo -->
	<properties resource="org/xml/conexion.properties"/>

	<!-- settings configuracion-->
	<!-- setting parametro de configuracion es una etiqueta llave valor -->
	<!-- name=llave; value=valor -->

	<settings>
		<setting name="cacheEnabled" value="true"/>
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="multipleResultSetsEnabled" value="true"/>
		<setting name="useColumnLabel" value="true"/>
		<setting name="useGeneratedKeys" value="false"/>
		<setting name="defaultExecutorType" value="SIMPLE"/>
		<setting name="defaultStatementTimeout" value="25000"/>
	</settings>

	<!-- typeAliases aqui se relacionan los alias de los Mapper con el Bean-->
	<!-- typeAlias alias es el resultMap.type del mapper -->
	<!-- typeAlias type es el Bean -->
	<typeAliases>
		<typeAlias alias="aDepartamento" type="org.Departamento"/>
		<typeAlias alias="aEmpleado" type="org.Empleado"/>
	</typeAliases>

	<!-- environments default configuracion por defecto-->
	<!-- aqui se configuran las conexiones a la base de datos -->
	<!-- environment una configuracion especifica -->

	<environments default="ejercicios">
		<environment id="ejercicios">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="${driver}"/>
				<property name="url" value="${url}"/>
				<property name="username" value="${username}"/>
				<property name="password" value="${password}"/>
			</dataSource>
		</environment>
	</environments>

	<!-- mappers-->
	<!-- se cargan todos los mapper (uno por cada Bean) -->
	<mappers>
		<mapper resource="org/xml/MapaDepartamento.xml"/>
		<mapper resource="org/xml/MapaEmpleado.xml"/>
	</mappers>

</configuration>

MapaDepartamento.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<!-- namespace es obligatorio aunque su uso es un misterio a estos dias -->
<mapper namespace="DepartamentoMapper">
<!-- resultMap describimos la relacion entre el Bean y la base de datos -->
<!-- id hace referencia al nombre del "mapa"que estamos declarando -->
<!-- type el tipo del mapa que estamos declarando -->
<!-- property variable en el bean  column columna de la base de datos -->
	<resultMap id="resMapDepartamento"	type="aDepartamento">
		<result property="id" 			column="ID"/>
		<result property="nombre" 		column="NOMBRE"/>
		<result property="descripcion" 	column="DESCRIPCION"/>
	</resultMap>

<!-- existen 5 etiquetas basicas  cada una por un tipo de sentencia -->
<!-- insert -->
<!-- update -->
<!-- select -->
<!-- delete -->
<!-- sql excepto esta es para ser referenciada desde cualquiera de las otras 4 -->

<!-- parametros mas importantes de dichas etiquetas -->
<!-- id nombre con el cual haremos referencia a esta sentencia -->
<!-- parameterType parametro que recibe -->
<!-- resultMap mapa que retorna  -->
<!-- resultType tipo que retorna -->
<!-- resultType y resultMap son bastante parecidos pero es mejor usar resultMap -->

	<insert id="agregarDepartamento" parameterType="aDepartamento">
	   insert into
	   		departamento
	   		(NOMBRE,DESCRIPCION)
	   values
	   		(#{nombre,jdbcType=VARCHAR},#{descripcion,jdbcType=VARCHAR})
	</insert>

	<update id="actualizarDepartamento" parameterType="aDepartamento">
	   update
	   		departamento
	   set
	   		NOMBRE=#{nombre,jdbcType=VARCHAR},
	   		DESCRIPCION=#{descripcion,jdbcType=VARCHAR}
	   	where
			ID=#{id,jdbcType=NUMERIC}
	</update>

	<select id="buscarDepartamento" parameterType="java.lang.Integer" resultMap="resMapDepartamento">
		select
			ID,
			NOMBRE,
			DESCRIPCION
		from
			departamento
		where
			ID=#{id,jdbcType=NUMERIC}
	</select>

	<delete id="eliminarDepartamento" parameterType="java.lang.Integer">
      	delete
      	from
      		Departamento
      	where
      		ID=#{id,jdbcType=NUMERIC}
    </delete>

	<select id="listaDepartamento" resultMap="resMapDepartamento">
		select
			ID,
			NOMBRE,
			DESCRIPCION
		from
			departamento
	</select>

	<select id="countEmpleadosAsociados" parameterType="java.lang.Integer" resultType="java.lang.Integer">
		select count
			ID
		from
			empleado
		where
      		DEPARTAMENTO=#{id,jdbcType=NUMERIC}
	</select>

</mapper>

MapaEmpleado.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">

<!-- namespace es obligatorio aunque su uso es un misterio a estos dias -->
<mapper namespace="EmpleadoMapper">
<!-- resultMap describimos la relacion entre el Bean y la base de datos -->
<!-- id hace referencia al nombre del "mapa"que estamos declarando -->
<!-- type el tipo del mapa que estamos declarando -->
<!-- property variable en el bean  column columna de la base de datos -->
<!-- se puede leer o modificar el valor de un objeto que este dentro del objeto -->
<!-- que estamos referenciando por ejempo -->
<!-- property="departamento.id", hace referencia a la variable id del objeto departamento que esta en el empleado -->
	<resultMap id="resMapEmpleado"	type="aEmpleado">
		<result property="id"						column="ID" />
		<result property="nombre"					column="NOMBRE" />
		<result property="apellido"					column="APELLIDO" />
		<result property="identificacion"			column="IDENTIFICACION" />
		<result property="departamento.id"			column="ID_DEPARTAMENTO" />
		<result property="departamento.nombre"		column="NOMBRE_DEPARTAMENTO" />
		<result property="departamento.descripcion"	column="DESCRIPCION_DEPARTAMENTO" />
		<result property="sueldo"					column="SUELDO" />
		<result property="transporte"				column="TRANSPORTE" />
		<result property="fdn"						column="FDN" />
		<result property="foto"						column="FOTO" />
	</resultMap>

<!-- existen 5 etiquetas basicas  cada una por un tipo de sentencia -->
<!-- insert -->
<!-- update -->
<!-- select -->
<!-- delete -->
<!-- sql excepto esta es para ser referenciada desde cualquiera de las otras 4 -->

<!-- parametros mas importantes de dichas etiquetas -->
<!-- id nombre con el cual haremos referencia a esta sentencia -->
<!-- parameterType parametro que recibe -->
<!-- resultMap mapa que retorna  -->
<!-- resultType tipo que retorna -->
<!-- resultType y resultMap son bastante parecidos pero es mejor usar resultMap -->

	<insert id="agregarEmpleado" parameterType="aEmpleado">
		insert into
			Empleado
				(NOMBRE,APELLIDO,IDENTIFICACION,DEPARTAMENTO,SUELDO,TRANSPORTE,FDN,FOTO)
			values
	   	   		(
	   	   			#{nombre,jdbcType=VARCHAR},
	   	   			#{apellido,jdbcType=VARCHAR},
	   	   			#{identificacion,jdbcType=INTEGER},
	   	   			#{departamento.id,jdbcType=VARCHAR},
	   	   			#{sueldo,jdbcType=DOUBLE},
	   	   			#{transporte,jdbcType=DOUBLE},
	   	   			#{fdn,jdbcType=DATE},
	   	   			#{foto,jdbcType=VARCHAR}
	   	   		)
	</insert>

	<update id="actualizarEmpleado" parameterType="aEmpleado">
	   update
	   		Empleado
	   set
	   		NOMBRE=#{nombre,jdbcType=VARCHAR},
	   	   	APELLIDO=#{apellido,jdbcType=VARCHAR},
	   	   	IDENTIFICACION=#{identificacion,jdbcType=INTEGER},
	   	   	DEPARTAMENTO=#{departamento.id,jdbcType=VARCHAR},
	   	   	SUELDO=#{sueldo,jdbcType=DOUBLE},
	   	   	TRANSPORTE=#{transporte,jdbcType=DOUBLE},
	   	   	FDN=#{fdn,jdbcType=DATE},
	   	   	FOTO=#{foto,jdbcType=VARCHAR}
		where
			ID=#{id,jdbcType=NUMERIC}
	</update>

	<select id="buscarEmpleado" parameterType="java.lang.Integer" resultMap="resMapEmpleado">
		select
			e.ID AS ID,
			e.NOMBRE AS NOMBRE,
			e.APELLIDO AS APELLIDO,
			e.IDENTIFICACION AS IDENTIFICACION,
			e.DEPARTAMENTO AS ID_DEPARTAMENTO,
			d.NOMBRE AS NOMBRE_DEPARTAMENTO,
			d.DESCRIPCION AS DESCRIPCION_DEPARTAMENTO,
			e.SUELDO AS SUELDO,
			e.TRANSPORTE AS TRANSPORTE,
			e.FDN AS FDN,
			e.FOTO AS FOTO
		from
			Empleado e,
			Departamento d
		where
			ID=#{id,jdbcType=NUMERIC}
			and
      		e.DEPARTAMENTO=d.ID
	</select>

	<delete id="eliminarEmpleado" parameterType="java.lang.Integer">
      	delete
      	from
      		Empleado
      	where
      		ID=#{id,jdbcType=NUMERIC}
    </delete>

	<select id="listaEmpleado" resultMap="resMapEmpleado">
		select
			e.ID AS ID,
			e.NOMBRE AS NOMBRE,
			e.APELLIDO AS APELLIDO,
			e.IDENTIFICACION AS IDENTIFICACION,
			e.DEPARTAMENTO AS ID_DEPARTAMENTO,
			d.NOMBRE AS NOMBRE_DEPARTAMENTO,
			d.DESCRIPCION AS DESCRIPCION_DEPARTAMENTO,
			e.SUELDO AS SUELDO,
			e.TRANSPORTE AS TRANSPORTE,
			e.FDN AS FDN,
			e.FOTO AS FOTO
		from
			Empleado e,
			Departamento d
		where
      		e.DEPARTAMENTO=d.ID
	</select>

	<select id="listaEmpleadoDepartamento" resultMap="resMapEmpleado" parameterType="java.lang.String">
		select
			e.ID AS ID,
			e.NOMBRE AS NOMBRE,
			e.APELLIDO AS APELLIDO,
			e.IDENTIFICACION AS IDENTIFICACION,
			e.DEPARTAMENTO AS ID_DEPARTAMENTO,
			d.NOMBRE AS NOMBRE_DEPARTAMENTO,
			d.DESCRIPCION AS DESCRIPCION_DEPARTAMENTO,
			e.SUELDO AS SUELDO,
			e.TRANSPORTE AS TRANSPORTE,
			e.FDN AS FDN,
			e.FOTO AS FOTO
		from
			Empleado e,
			Departamento d
		where
      		e.DEPARTAMENTO=d.ID
      		and
      		e.DEPARTAMENTO=#{departamento,jdbcType=VARCHAR}
	</select>

</mapper>

conexion.properties

####################################
# Database Connectivity Properties
# parametros para conexion a la BD
####################################

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ejercicios
username=root
password=admin
maxActive=5
initialSize=1

estilo.css

*{color:#CC0000;}
body{background-color: #F0F0F0;}
table#registro{font-weight:bold;}
div#titulo{
	background-color: #B00000;
	color: #B00000;
	background:#B00000;

}
recursos usados

commons.fileupload
commons.io
conector sql
MyBatis


0 Responses to “MyBatis en JSP II”



  1. Dejar un comentario

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


I+Ds

Dudas consultas
Facebook
Twiter
Google +

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevas publicaciones por correo.

Únete a otros 348 seguidores

Ingenio DS en Facebook

Redes Sociales y Archivos

Entradas

agosto 2010
L M X J V S D
« Jul   Oct »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

IngenioDS en twiter


A %d blogueros les gusta esto: