Integrar JSP, Hibernate en una aplicación web utilizando MVC – Parte I

| 2014-04-10 | No hay comentarios »

Introducción

En éste tutorial utilizaremos el patrón MVC, donde las páginas JSP actúan como vistas, la base de datos como el modelo y los Java Servlets que manejan todos los eventos actúan como controladores. Usaremos  Hibernate como herramienta ORM para el acceso de datos. Aunque esta es una explicación muy simplificada, espero que les pueda servir para que puedan iniciarse.

Requerimientos de software 

  • Java Software Development Kit: JDK
  • IDE: NetBeans (preferentemente, con todas las características y con Tomcat Application Server)
  • Base de datos: PostgreSQL
  • JDBC Driver para PostgreSQL: JDBC
    Nota: Hibernate y PostgreSQLConnector vienen con Netbeans, es posible que no tenga que descargar nada en absoluto.

Para comenzar deben de restaurar el backup de la base de datos (agenda_clientes), descargar backup.

¿Cómo crear el Proyecto? 

  • Abrir Netbeans.
  • Archivo, Nuevo proyecto, seleccione Java Web de las categorías, luego de Aplicaciones Web en la lista de proyectos, haga clic en Siguiente.

1

Escriba un nombre de proyecto y deje la ubicación y la carpeta de proyecto como defecto y haga clic en Siguiente

2

Seleccione Apache Tomcat Server si no está seleccionado y dejar las opciones restantes como defecto y haga clic en Siguiente

3

Haga clic en la casilla de verificación Hibernar de la lista de marcos, a continuación, seleccione Nueva conexión de base de datos … en conexión con la base de la lista desplegable. Seleccione PostgreSQL del controlador de la lista desplegable.

5

– Agregue el nombre de la base: agenda_clientes (que ya ha creado), ip, nombre de usuario y contraseña. Para probar la conexión de texto Conexión clic. Si dice conexión exitosa, quiere decir que está todo bien.

-Posteriormente elegir el esquema público y hacer clic en finalizar.

Hibernate – Configuración
Una vez que el proyecto se configura el asistente incluirá automáticamente el archivo de configuración llamado hibernate.cfg.xml. Abra el archivo de configuración y añada el siguiente código con los cambios apropiados, tales como nombre de usuario y la contraseña de la base de datos.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
 <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
 <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
 <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/agenda_clientes</property>
 <property name="hibernate.connection.username">postgres</property>
 <property name="hibernate.connection.password">master</property>
 <property name="hibernate.show_sql">true</property>
 <property name="hibernate.current_session_context_class">thread</property>
 </session-factory>
</hibernate-configuration>

-Ahora tienen que agregar con el asistente el archivo «hibernate.reveng», para poder hacer eso hacer click derecho -> nuevo hibernate -> Asistente de configuración de ingeniería inversa y luego finalizar. También deben de seleccionar las dos tablas y incluir las relaciones:

6

– Hay una clase de utilidad de hibernate. Esta clase es la puerta a interactuar clases Java con Hibernate. Desde SessionFactory es un objeto muy caro, en el sentido de que, es una clase de peso pesado. Es en el mejor interés de la actuación para tener sólo una SessionFactory por aplicación o la conexión de base de datos. Así que la clase se declara como estática y se inicializa dentro del bloque estático. Así que cada vez que se llama al método openSession vuelve objeto de la sesión de la misma SessionFactory a diferentes clases.

– Antes de crear la clase de utilidad creamos un nuevo paquete que se llame model. Para crear la clase de utilidad hacer click derecho -> nuevo -> hibernate -> HibernateUtil.java. Crear dicha clase con el nombre HibernateUtil.

7

– Ahora continuamos con la creación del mapeo de las tablas. Para crear los mapas hacer click derecho -> nuevo -> hibernate -> Archivos de mapas de Hibernate y POJOs. Luego elegir la carpeta model y por último Terminar:

8 

-Una vez creado todo lo anterior necesitamos crear los manejadores o mejor dicho las clases que nos servirán para tener todas nuestras reglas de negocios. En este caso debemos de crear en la carpeta model las clases: CiudadManager.java y ClienteManager.java

CiudadManager.java


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model;

import org.hibernate.Query;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import java.util.*;

/**
 *
 * @author hugo
 */

public class CiudadManager {
 Session session = null;
 public String mess = "";
 int maxResults = 100;

public CiudadManager()
 {
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();
 }

public Ciudad getCiudad(Long id)
 {
 Ciudad Ciudad = null;

if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();
 org.hibernate.Transaction tx = session.beginTransaction();
 try
 {
 Query q = session.createQuery("from Ciudad as ciudad where ciudad.id=" + id);
 Ciudad = (Ciudad) q.uniqueResult();
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 }

return Ciudad;
 }

public List getCiudades(int pageSize, int page)
 {
 List<Ciudad> ciudadList = null;

if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();
 org.hibernate.Transaction tx = session.beginTransaction();
 try {
 Query q = session.createQuery ("from Ciudad ciudad order by ciudad.id");
 ciudadList = (List<Ciudad>) q.list().subList(page * pageSize, (page+1)*pageSize);
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 }
 return ciudadList;
 }

public List getCiudades()
 {
 List<Ciudad> ciudadList = null;

if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();
 org.hibernate.Transaction tx = session.beginTransaction();
 try {
 Query q = session.createQuery ("from Ciudad ciudad order by ciudad.id");
 ciudadList = (List<Ciudad>) q.list();
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 }
 return ciudadList;
 }
 public List searchCiudades(Ciudad ciudadSample)
 {
 if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();

List<Ciudad> ciudadList = null;
 Example example = Example.create(ciudadSample).ignoreCase().excludeZeroes().enableLike(MatchMode.START);

org.hibernate.Transaction tx = session.beginTransaction();
 try {
 ciudadList = (List<Ciudad>) session.createCriteria(Ciudad.class).
 add(example).addOrder(Order.asc("id")).list();
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 }
 return ciudadList;
 }

public boolean saveCiudad(Ciudad ciudad)
 {
 if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();

org.hibernate.Transaction tx = session.beginTransaction();
 try
 {
 session.saveOrUpdate(ciudad);
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 return false;
 }
 return true;
 }

public boolean deleteCiudad(Ciudad ciudad)
 {
 if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();

org.hibernate.Transaction tx = session.beginTransaction();
 try
 {
 session.delete(ciudad);
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 return false;
 }
 return true;
 }
}

ClienteManager.java 


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model;

import org.hibernate.Query;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import java.util.*;

/**
 *
 * @author hugo
 */

public class ClienteManager {
 Session session = null;
 public String mess = "";
 int maxResults = 100;

public ClienteManager()
 {
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();
 }

public Cliente getCliente(Long id)
 {
 Cliente Cliente = null;

if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();
 org.hibernate.Transaction tx = session.beginTransaction();
 try
 {
 Query q = session.createQuery("from Cliente as cliente where cliente.id=" + id);
 Cliente = (Cliente) q.uniqueResult();
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 }

return Cliente;
 }

public List getClientees(int pageSize, int page)
 {
 List<Cliente> clienteList = null;

if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();
 org.hibernate.Transaction tx = session.beginTransaction();
 try {
 Query q = session.createQuery ("from Cliente cliente order by cliente.id");
 clienteList = (List<Cliente>) q.list().subList(page * pageSize, (page+1)*pageSize);
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 }
 return clienteList;
 }

public List getClientes()
 {
 List<Cliente> clienteList = null;

if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();
 org.hibernate.Transaction tx = session.beginTransaction();
 try {
 Query q = session.createQuery ("from Cliente cliente order by cliente.id");
 clienteList = (List<Cliente>) q.list();
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 }
 return clienteList;
 }
 public List searchClientes(Cliente clienteSample)
 {

List<Cliente> clienteList = null;

if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();

org.hibernate.Transaction tx = session.beginTransaction();
 Criteria crit = session.createCriteria(Cliente.class);

Cliente cliente = new Cliente();
 cliente.setNombre(clienteSample.getNombre());
 cliente.setTelefono(clienteSample.getTelefono());
 cliente.setDireccion(clienteSample.getDireccion());
 cliente.setDocumento(clienteSample.getTelefono());
 cliente.setEmail(clienteSample.getEmail());

Example example = Example.create(cliente).ignoreCase().excludeZeroes().enableLike(MatchMode.ANYWHERE);
 crit.add(example);
 if(clienteSample.getCiudad()!=null)
 crit.add(Restrictions.eq("ciudad", clienteSample.getCiudad()));
 crit.addOrder(Order.asc("id"));

try {
 clienteList = (List<Cliente>) crit.list();
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 }
 return clienteList;
 }

public boolean saveCliente(Cliente cliente)
 {
 if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();

org.hibernate.Transaction tx = session.beginTransaction();
 try
 {
 session.saveOrUpdate(cliente);
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 return false;
 }
 return true;
 }

public boolean deleteCliente(Cliente cliente)
 {
 if(!session.isOpen())
 this.session = HibernateUtil.getSessionFactory().getCurrentSession();

org.hibernate.Transaction tx = session.beginTransaction();
 try
 {
 session.delete(cliente);
 tx.commit();
 }
 catch (HibernateException ex) {
 mess = ex.getMessage();
 tx.rollback();
 ex.printStackTrace();
 return false;
 }
 return true;
 }
}

Screen de cómo debería de quedar el proyecto hasta ésta parte del tutorial:

parte1-completo

Para no hacer tan largo éste artículo lo dividí en dos partes, éste artículo es la parte 1. En la parte 2 vamos a continuar con los controladores y las vistas.

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Qué es y cómo empezar con Ionic Framework
  • Integrar JSP, Hibernate en una aplicación web utilizando MVC y MAVEN
  • Integrar JSP, Hibernate en una aplicación web utilizando MVC – Parte II
  • Utilizar PostgreSQL en Android con JDBC



SEGUÍNOS EN FACEBOOK


GITHUB