NetBeans, Une application Web : Hibernate et Servlet (partie III)

Après le premier épisode, la création de notre projet Web, le deuxième avec la configuration d'Hibernate et la déclaration de notre objet "Utilisateur", nous allons maintenant passer aux choses sérieuses et créer une servlet pour se connecter à notre BDD avec Hibernate.

La première chose à savoir c'est que l'unité de travail dans Hibernate, ce qui nous sert à accéder à la base de données, c'est la « Session ». Une Session dans Hibernate et le « Persistence Manager », nous l'utilisons pour mettre et récupérer des données depuis la base. Pour récupérer une Session, nous le faisons grâce à la SessionFactory comme cela :

SessionFactory sessionFactory =
            new Configuration().configure().buildSessionFactory();

Une SessionFactory ne devrait être généralement construite qu'une seule fois, par exemple avec une servlet chargée au démarrage, grâce à un « load-on-startup » dans le Web.xml, et elle doit aussi être un genre de « singleton ». Nous allons créer une classe utilitaire qui va résoudre les deux problèmes, elle vient directement de la documentation de Hibernate.

Faites un clic-droit sur votre projet, puis « new » et « java class.. » et recopiez le code ci dessous :

package com.bourzeix.hibernate;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {
    
    private static Log log = LogFactory.getLog(HibernateUtil.class);
    private static final SessionFactory sessionFactory;
    
    static {
        try {
            // Create the SessionFactory
            sessionFactory = 
			new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            log.error("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }
    
    public static final ThreadLocal session = new ThreadLocal();
    
    public static Session currentSession() {
        Session s = (Session) session.get();
        // Open a new Session, if this Thread has none yet
        if (s == null) {
            s = sessionFactory.openSession();
            session.set(s);
        }
        return s;
    }
    
    public static void closeSession() {
        Session s = (Session) session.get();
        if (s != null)
            s.close();
        session.set(null);
    }
}

Voilà, maintenant nous allons pouvoir utiliser Hibernate dans une servlet, afin de manipuler directement des objets contenant les données de notre base.

Faites « New -> Servlet ... » dans Netbeans, et créez une servlet « TestServlet » avec un mapping dans la configuration (le Web.xml) tel que « /testservlet ». Vérifiez qu'elle fonctionne et qu'elle affiche quelque chose (dé-commentez le passage « TODO output your page here » créé par défaut).

Importez en suite les packages suivants, nous en aurons besoin :

import com.bourzeix.hibernate.HibernateUtil;
import com.bourzeix.hibernate.User;
import java.io.*;
import java.util.Iterator;
import javax.servlet.*;
import javax.servlet.http.*;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

Ensuite déclarez votre Session et votre Transaction Hibernate, ce sont les objets dont nous allons nous servir pour accéder à nos données :

Session session;
Transaction tx;

La première étape maintenant va donc être d'ajouter quelque chose dans notre base afin de pouvoir le lire par le suite, nous allons donc créer un utilisateur avec l'ajout du code suivant à notre servlet :

      //Creation de notre objet Session grace à notre HibernateUtil  
	session = HibernateUtil.currentSession();

	//Ouverture de notre transaction avec Hibernate grace
	// a la session 
      tx = session.beginTransaction();
      
	// Ajout d'un utilisateur en utilisant notre bean User 
	// préalablement configuré dans Hibernate 
      User toto = new User();
      toto.setNom("lateteatoto");
      toto.setPrenom("toto");
      
	// On sauve, on renvoi, notre bean à la session Hibernate   
      session.save(toto);
      
	// Nous commitons la transaction vers la base
      tx.commit();

	//Enfin on ferme la session 
      HibernateUtil.closeSession();

Appelez ensuite plusieurs fois votre servlet dans votre navigateur préféré, Firefox au hasard, et si tout se passe bien ouvrez votre BDD pour voir si vos utilisateur sont bien là.

Normalement vous devriez en avoir autant que de « refresh » tous avec le même nom et le même prénom, mais l'identifiant lui est bien différent et a bien été géré automatiquement par Hibernate grâce à la configuration de notre objet « User », souvenez vous, c'est là, dans le fichier « user.hbm.xml » :

        <id name="id" type="int" column="id" unsaved-value="0">
            <generator class="identity"/>
        </id>

Voilà, maintenant que nous avons des utilisateurs dans notre base nous allons pouvoir les sélectionner et les afficher grâce à notre servlet. Commencez par commenter le code précédent, celui qui a servi à la création des utilisateurs puis copiez le code ci dessous :

        session = HibernateUtil.currentSession();
        tx = session.beginTransaction();
        Query query = session.createQuery("from User u");
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet TestServlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet TestServlet at " 
		+ request.getContextPath() + "</h1>");
        
        for (Iterator it = query.iterate(); it.hasNext();) {
            User user = (User) it.next();
            out.println("<p>");
            out.println("Id : " + user.getId() );
            out.println("Nom : " + user.getNom() );
            out.println("Prénom : " + user.getPrenom() );
            out.println("</p>");
        }
        
        out.println("</body>");
        out.println("</html>");
        
        tx.commit();
        HibernateUtil.closeSession();
        out.close();

Ici, comme dans l'exemple précédent nous récupérons notre « session » puis nous commençons notre « transaction ». Ensuite nous créons un objet « Query » grâce auquel nous faisons notre requête, notez d'ailleurs qu'Hibernate supporte des requêtes simplifiées à l'extrême, nous aurions pu écrire « select * from User u » c'est pareil. Pour plus d'informations voyez le chapitre « Querying » de la documentation Hibernate.

Ensuite nous utilisons une itération pour boucler sur les résultats de notre requête, nous créons un objet User à chaque passage et nous utilisons simplement ses « getters » pour lire et afficher les valeurs. Nous fermons ensuite notre page HTML ainsi que toutes les connections et objets ouverts. Si tout c'est passé selon le plan vous devriez avoir, en fonction des données entrées dans la base quelque chose comme cela :

Servlet TestServlet at /test
Id : 1 Nom : lateteatoto Prénom : toto 
Id : 2 Nom : lateteatoto Prénom : toto 
Id : 3 Nom : lateteatoto Prénom : toto 
Id : 4 Nom : lateteatoto Prénom : toto 
Id : 5 Nom : lateteatoto Prénom : toto 
Id : 6 Nom : lateteatoto Prénom : toto

Et voilà vous devriez maintenant en savoir assez sur Hibernate pour pouvoir continuer à explorer, la prochaine fois nous ajouterons la dernière brique à l'édifice : Struts !

A suivre ...

Haut de page