[Java] Etude du pattern DAO (Français).

Introduction


Dao veux dire Data access object.

Il s’agit d’un pattern qui sépare la logique d’accès et d’exploitation de la base de données, d’un POJO JAVA (L’habituelle classe Java contenant les getter et les setters).

L’atout est que l’on comprends mieux le code, et que l’on peut même créer plusieurs DAO en fonction de la BDD ou des fichers de données à exploiter (Comme du XML, par exemple.)

Idées provisoires, à vérifier


je suis particulièrement intéressé par JSF 2.0 et Primefaces(Qui semble bien plus simple dans sa syntaxe), cependant, les DAO, sauf erreurs, sont plutôt accès sur les JSP, il est bon d’apprendre les technologies plus anciennes, étant donné qu’il faut pouvoir intervenir sur les technologies les plus utilisées/anciennes, même si elles sont peu aisées à appréhender.

Je vais faire des exercices sur

  • un pattern DAO en adéquation avec une JSP et Mysql.
  • un pattern DAO en adéquation avec JPA et Hibernate et Mysql.

Un exemple pattern DAO en adéquation avec une JSP et Mysql


 

Sommaire :

Généralités 

  1. Les packages
  2. Les librairies
  3. Les pages web jsp
  4. Le fichier Web.Xml

Code 

 

  1. Les packages

Un package permet de classer les classes Java par type, dans une application Javaee.

Généralement, on précède son nom du préfixe com lorsqu’on le crée dans Eclipse en faisant un clic droit ‘Create package ‘ sous Java Ressource/src dans l’arborescence Eclipse.

Notre exemple contient 4 Packages :

  • Le Package com.app.controleur : On y place la classe Java qui va intéragir avec les pages Web JSP, lors de l’action d’un utilisateur
  • Le Package com.app.dao  :On y place les 2 classes Java qui vont intéragir avec la Base de données . 1 classe répertorie les commandes CRUD  disponibles (Lire/Enregistrer/Mettre à jour/Supprimer), l’autre classe actionne des requêtes SQL.
  • Le Package com.app.modele : On y place la classe Java (aussi appelée Pojo) qui contient les variables définissant notre modèle de donnée (exemple : Nom, Prénom), et les méthodes getter et setters
  • Le Package com.dbutil : On y place la classe Java qui permet la connexion à la base de données et ses paramêtres.

Voici le look d’une arborescence une fois nos packages créés (En Anglais), on peut considérer que c’est le moteur de l’application Web à venir. :

eclipse1

 

2. Les librairies :

On les télécharge et on les fait glisser déposer à partir du bureau windows dans le répertoire WebContent/WEB-INF/lib:

eclipse2

 

Ici, j’ai la lib JSTL, la lib MysqlConnector, et la lib servlet-api. elles sont toutes trois nécessaire au fonctionnement de notre système.

3. Les pages web JSP :

On les crée en faisant un clic droit sur WebContent puis ‘nouvelle JSP’, C’est l’Ihm, qui permet l’intéraction avec les utilisateurs, autrement dit, tout simplement, ce que l’on voit dans le navigateur.

4. le fichier Web.xml

Il permet de faire le mapping entre les URL et les Servlets

On le créée lorsque l’on crée un new dynamic web project, en cochant generate web descripment :

eclipse4

Si le projet est déjà créé, on clique sur le projet dans l’arbo, puis « Javaee tools/generate Deployement descriptor stub »

 
A SUIVRE AVEC UN CODE EN FRANCAIS BIENTOT
 

 

[Java] Un Crud super basique JSP-JSTL avec Mysql

Java_logoJSP_LOGO_RGBlogo-mysql-170x170_400x400

Introduction


Faire un CRUD avec JSP, et utiliser JSTL pour simplifier les accès SQL dans les pages.

Aucune Classe Java ici, tout est fait directement dans les JSP.

Photo :


tab1.jpg

Prérequis :


  1. Créer une table SQL comme indiqué ici(Je sais c’est en anglais mais la flemme de traduire, ma base de données s’appelle test) :

CREATE TABLE `product` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `pname` varchar(45) NOT NULL,
  `quantity` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
);

INSERT INTO `product` (`id`,`pname`,`quantity`) VALUES
 (1,'Mouse',50),
 (2,'Keyboard',5),
 (3,'Monitor',34);
  1. Créer un dynamic web project dans Eclipse appelé jstlFolies
  2. Glisser-déposer toutes les librairies en .jar dans le répertoire WebContent/WEB-INF/lib:

Lire la suite

[Java] Utiliser hibernate sans Jsp, Partie 1 : Multi-insertion (Français).

Java_logo

Introduction


Toujours à la recherche des solutions les plus rapides pour mes futures Apps, je suis maintenant avec le back-end Hibernate.

Hibernate permet de créer automatiquement les tables SQL, à partir du code JAVA.

C’est bien plus rapide. il fait le mapping Objet(Java)/Relationnel automatiquement.

Outre le fait d’être incroyablement rapide, il est également plus aisé de collaborer sur des projets de ce type.

Par comparaison, j’ai tapé le back end PHP de mon exo 60 à la main. , même si c’est rapide, cela ne l’est pas autant que Hibernate.

Mon code est copié de http://www.simplecodestuffs.com/auto-generate-primary-key-in-hibernate/ de   (Excellent!)

Par contre, c’est plus difficile à utiliser avec les JSP, et je voudrais aussi pouvoir l’utiliser avec AngularJs(Donc faudra utiliser la lib Gson en plus… c’est un peu lourd).

Egalement, attention, parce que dès que l’on aborde les jointures entre tables,cela devient plus compliqué !

Lire la suite

[Java] Utiliser Jquery pour peupler un menu en AJAX, avec un Back End Servlet Java/Mysql.

IntroductionJava_logo


Une méthode basique pour acquérir des données Mysql dans un servlet Java, sous condition de choix dans la vue avec Jquery.

Dans un second temps, la servlet retourne les données provenant de la base de données MYSQL au front-end, après les avoir converties au format JSON, à l’aide de la librairie GSON pour java.

Code inspiré de
http://www.simplecodestuffs.com/ajax-implementation-in-jsp-and-servlet-using-jquery/
Mais j’ai ajouté une connexion Mysql…

Photo de l’exo :
svlt1

 

Prérequis


  • Eclipse
  • Tomcat
  • Mysql
  • Créer un ‘new Dynamic Project’ appelé jsf17
  • Glisser déposer la librairies Jquery.js dans le répertoire ‘WebContent/Js’ si il n’existe pas, il faut le créer.
  • Glisser déposer les librairies gson-2-.2.2.jar et mysql-connector.jar dans le répertoire ‘webContent/WEB-INF/lib’
  • Créer une base de données nommée test sur Mysql, puis une table nommée volley avec les colonnes idvolley(int),nom(varchar),prenom (varchar)
  • Peupler la base de données avec des données exemples avec le logiciel MysqlWorkbench(C’est pratique)

Comment faire ?


Ne pas tester l’application dans Eclipse, mais toujours dans un navigateur séparé comme opéra par exemple(Le navigateur de Eclipe ne se remets pas à jour correctement).

Accéder à l’app sur cet url http://localhost:8080/jsf17/index.jsp

Créer une JSP appelée index.jsp qui sera la vue principale dans le répertoire WebContent :


<head>

	<script src='js/jquery.min.js'></script>
	<script>
// TESTE QUE LA LIB JQUERY SOIT BIEN CHARGEEE
	window.onload = function() {
	    if (window.jQuery) {  
	        // jQuery is loaded  
	        alert("Yeah!");
	    } else {
	        // jQuery is not loaded
	        alert("Doesn't Work");
	    }
	}
	
	
	
// TOUT LE CODE JQUERY
$(document).ready(function() {
	$('#sports').change(function(event) {
		var sports = $("select#sports").val();
		$.get('JsonServlet', {
		sportsName : sports
		}, function(response) {
			var select = $('#player');
			select.find('option').remove();
			$.each(response, function(index, value) {
				$('
<option>').val(value).text(value).appendTo(select);
			});
		});
	});
		
	$('#clic').click(function(event) {
		alert($("select#player").val());
	});
});
	
	</script>
</head>

<body>
<h3>AJAX avec Servlet utilisant JQuery et JSON</h3>
Selectionne ton sport favori:

	<select id="sports">
<option>Select Sports</option>
<option value="Football">Football</option>
<option value="Volley">Volley</option>
</select>

	Selectionne ton joueur favori:
	<select id="player">
<option>Selectionner le joueur</option>
</select>

	<button id="clic">Votre choix </button>
</body>

Tout le code contenu entre les balises est du jquery/JS. A l’avenir, j’utiliserais également AngularJs avec un Back end Java de cette manière.

 

 

Etape 2 : Créer une servlet appelée JsonServlet.java puis coller ce code à l’intérieur :

package jsf17;

import java.io.IOException;
import java.sql.*;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.google.gson.Gson;

public class JsonServlet extends HttpServlet {

        private static final long serialVersionUID = 1L;

        protected void doGet(HttpServletRequest request,
                HttpServletResponse response) throws ServletException, IOException {

                String sportsName = request.getParameter("sportsName");
                List<String> list = new ArrayList<String>();
                String json = null;

                if (sportsName.equals("Football")) {
                        list.add("Lionel Messi");
                        list.add("Cristiano Ronaldo");
                        list.add("David Beckham");
                        list.add("Diego Maradona");
                } else if (sportsName.equals("Volley")) {
                       /* list.add("Sourav Ganguly");
                        list.add("Sachin Tendulkar");
                        list.add("Lance Klusener");
                        list.add("Michael Bevan");*/

                        int i=0;
                        try
                        {
                                String qry;
                                Class.forName("com.mysql.jdbc.Driver");
                                Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
                                Statement s = con.createStatement();
                                qry="Select nom from volley";
                                ResultSet r=s.executeQuery(qry);
                                while(r.next())
                                {

                                    list.add(i,r.getString(1));

                                    i++;
                                }

                        }  catch(Exception ex)
                        {

                            System.out.println("Your query is not working");
                        }

                } else if (sportsName.equals("Select Sports")) {
                        list.add("Select Player");
                }

                json = new Gson().toJson(list);
                response.setContentType("application/json");
                response.getWriter().write(json);
        }
}

Explication du code :

Lorsque l’on choisit un sport dans le premier menu déroulant dans index.jsp, Jquery lance un appel Ajax à la servlet JsonServlet.java;

là, si le sport choisit est « Football », la servlet retourne un objet JAVA converti en JSON avec la lib GSON. Ce objet contient tous les noms des footballers
Par contre, si l’on choisit le sport « Volley », Jquery lance un appel Ajax à la servlet, puis la servlet fait une requête sur Mysql, récupère les données, puis retourne le résultat, également converti en JSON à la vue index.jsp ! La requête sql est très simple… Pour l’instant … (Select nom from volley)..

svlt2.jpg

Conclusion


Depuis le temps que je cherchais un moyen de faire de l’ajax avec Java, je suis heureux de savoir faire cela pour les petits projets, par contre pour les gros projets, il faut utiliser Hibernate qui fait du mapping o/r automatique.

 

A comparer avec un Back-End en Php pour angularJs que j’aime vraiment bien ici :

https://nicolashcodes.wordpress.com/2016/04/04/exercice-53-application-de-commande-de-films-avec-angularjsphpsql-et-le-template-sb-admin-2/

[Java] Faire du Crud avec Java sur Mysql. Utiliser le Crud dans une Jsp.

Introduction


Faire du créer/Lire/Mettre à jour/Supprimer sur une base Mysql avec Java.

Utiliser le Crud dans une JSP.

Source :


Pure Jsp James Goodwill Sams année 2000

Format de la table SQL :


tble

Prérequis


  • Serveur Web Tomcat 8.0
  • Eclipse
  • Un serveur Mysql avec une base de données nommée « feedback » dessus et un utilisateur root avec le mot de passe root. Le serveur doit être accessible sur le port 3306.
  • Dans Eclipse, créer un Nouveau Dynamic Web Project ( file/new/) dans Eclipse appelé projetWeb4
  • Toujours dans Eclipse, faire un glissé déposé du fichier JAR mysql connector dans le répertoire WEB-INF/lib du projetWeb4 ( Le mysql Connector est a récupérer sur le site Java ou mysql)

Sommaire :


  1. Lire une table Mysql
  2. Ecrire un enregistrement dans une table Mysql
  3. updater un enregistrement dans une table Mysql
  4. Supprimer un enregistrement dans Mysql
  5. Utiliser le Crud dans une JSP.

Lire la suite

[Java] Créer une table sur un serveur Mysql

Java_logo

Introduction


Aujourd’hui, je vais créer une classe Java qui permet la création d’une table sql appelée ‘Titles’, avec des noms en anglais, sur mon serveur de base de données relationnelle MYSQL.

Le code est testé et fonctionnel, malhereusement, je n’ai pas le temps de le traduire.

Prérequis


  • Serveur Web Tomcat 8.0
  • Eclipse
  • Un serveur Mysql avec une base de données nommée « feedback » dessus et un utilisateur root avec le mot de passe root. Le serveur doit être accessible sur le port 3306.
  • Dans Eclipse, créer un Nouveau Dynamic Web Project ( file/new/) dans Eclipse appelé projetWeb4
  • Toujours dans Eclipse, faire un glissé déposé du fichier JAR mysql connector dans le répertoire WEB-INF/lib du projetWeb4 ( Le mysql Connector est a récupérer sur le site Java ou mysql)
  • Créer une classe nommée CreateTablesApp

 

Le code :



package projetWeb4;
import java.sql.*;

public class CreateTablesApp {

	public void createTables(){
		Connection con = null;

		try{
//			Charge le driver class file
			 Class.forName("com.mysql.jdbc.Driver");
             con = DriverManager.getConnection("jdbc:mysql://localhost:3306/feedback","root","root");

//             Créer le statement
             Statement s = con.createStatement();

//             Créer une table
             s.executeUpdate("CREATE TABLE Titles " + "(title_id INTEGER,title_name VARCHAR(50), " + "rating VARCHAR(5),price FLOAT,quantity INTEGER," +  "type_id INTEGER, category_id INTEGER)");

		}

         catch(SQLException sqle){
        	 System.err.println(sqle.getMessage());
         }

		catch(ClassNotFoundException cnfe){

			System.err.println(cnfe.getMessage());
		}
		finally{
			try{
				if(con!= null){
					con.close();
				}

			}
			catch(SQLException sqle){
				 System.err.println(sqle.getMessage());
			}

		}

}

	public static void main(String[] args){
		CreateTablesApp createTablesApp = new CreateTablesApp();
		createTablesApp.createTables();

	}

}

Pour l’exécuter, cliquer droit sur la classe CreateTablesApp.java puis sur « RUN AS JAVA APPLICATION »

java1

Ensuite, je vais contrôler dans MysqlWorkbench, et je vois que la table a bien été créée :

jv2

[Java] Créer un couple JSP/BEAN puis créer un couple JSP/BEAN pour quérir Mysql

Java_logo

Introduction


Toujours dans le trip Java, avec Eclipse dernière version, Tomcat 8.0 comme serveur Web, Mysql comme base  de données et surtout : MYSqL WORKBENCH, un super logiciel qui permet de gérer ses bases MYSQL super facilement, on peut créer des n-uplets(enregistrements), sur le vif pour les démos c’est super:

Sans titre 2.jpg

Aujourd’hui,voici le sommaire:

  1. je crée une page web .JSP avec une classe Java(appellée BEAN) qui fournit les données à la page Web.
  2. Puis, je crée une page Web .JSP avec une classe JAVA(appellée BEAN) qui fournit les données à partir de la base de données MYSQL, dont le serveur est installé en dur sur mon ordinateur, accessible à partir du port 3306.

Mon but,  serait également de trouver le moyen de faire un BackEnd JAVA qui créérait de l’objet JSON pour AngularJs… Comme j’ai fais dans mon application trouve ton Film avec PHP…

1. Créer une JSP avec un BEAN associé, qui fournit les données, dans ECLIPSE:


Tout d’abord, dans Eclipse JAVAEE, faire FILE/NEW/ DYNAMIC WEB PROJECT et créer le projet ‘projetWeb’

Ensuite, dans l’arborescence créée, cliquer droit sur le répertoire WebContent, puis clic droit/créer une JSP. La nommer « JspEtBeanQuiMarche ».

Supprimer le code généré dans l’onglet de la jsp qui s’affiche et insérer celui ci à la place :

<html>
<HEAD>
	<TITLE>Essai d'instanciation d'un bean dans une JSP</TITLE>
</HEAD>

<body>
	<p>Test d'utilisation d'un Bean dans une JSP </p>
	<jsp:useBean id="personne" scope="request" class="projetWeb.Personne" ></jsp:useBean>
	<p>nom initial = <%=personne.getNom() %></p>
	<%personne.setNom("mon nom");%>
	<p>nom mis à jour = <%= personne.getNom() %></p>
</body>

</html>

Enregistrer la JSP.

Ensuite, en phase deux, on va créer la classe JAVA de type BEAN qui va apporter à la JSP toutes les données dont elle a besoin :

Faire un clic droit sur le répertoire « Java ressources » et créer une classe, la nommer Personne.java :

Ensuite, lorsque l’onglet de la classe java de type bean s’ouvre, supprimer le code généré puis copier ce code à l’intérieur:

package projetWeb;

public class Personne {
	  private String nom;
	  private String prenom;

	  public Personne() {
	    this.nom = "nom par defaut";
	    this.prenom = "prenom par defaut";
	  }

	  public void setNom (String nom) {
	    this.nom = nom;
	  }

	  public String getNom() {
	    return (this.nom);
	  }

	  public void setPrenom (String prenom) {
	    this.prenom = prenom;
	  }

	  public String getPrenom () {
	    return (this.prenom);
	  }
	}

On peut remarquer que le package est le nom que l’on a donné à notre projet Web dans eclipse.

Enregistrer la classe, puis relancer le serveur en cliquant sur l’onglet servers puis sur stop (rouge) et sur play(vert)

Enfin, pour tester le tout, cliquer droit sur la jsp que l’on a créé, et faire « Run as »/ »Run on server »

Le texte suivant s’affiche alors dans le site web :


Test d’utilisation d’un Bean dans une JSP

nom initial = nom par defaut

nom mis à jour = mon nom

Ce qui prouve que cela fonctionne.

 

2.Créer une page Web .JSP avec une classe JAVA(appellée BEAN) qui fournit les données à partir de la base de données MYSQL.

 

Tout d’abord, il faut télécharger le fichier.jar mysql-connector-java-5.1.38-bin.jar qui est la librairie qui permet d’accéder à Mysql.

Ensuite, il faut glissé déposé le fichier mysql-connector-java-5.1.38-bin.jar dans le répertoire « lib » du répertoire WEB-INF de l’application projetWeb que l’on a créé à l étape un.

Ensuite, on crée une base de données appelée « feedback » sur le serveur MYSQL que l’on a installé sur notre ordinateur .

Puis on crée la table tbl_user_primary avec les champs suivants

  • id, fname,lname,email,password,gender

Oui je sais c’est en anglais pas le temps de traduire .

Ensuite, on peuple la table comme cela :

  • insert into tbl_user_primary values (‘1′,’Pierre’,’bertrand’,’p.b@gmail.com’,’gch’,’m’);

Bref, ce sera notre table de démo …

On redémarre le serveur tomcat, puis on crée une nouvelle JSP que l’on nomme « JspMysqlQuiMarche » sous WEBCONTENT/WEB-INF, en faisant un clic droit, comme d’hab.

Le code de cette jsp est le suivant  :

<%@ page import="java.util.*" %>
<jsp:useBean id="showDataBean" class="projetWeb.ShowDataBean" scope="request" ></jsp:useBean>
 
<table width="900" cellspacing="0" cellpadding="0">
    <tr>
   
        <td>
        Name
        </td>
        <td>
        Email
        </td>
        <td>
        PassWord
        </td>
        <td>
        Gender
        </td>
        
    </tr>
    <%
        List<Object> list=new ArrayList<Object>();
        list=showDataBean.getDb_Data();
        for(int i=0;i<list.size();i++)
        {
            showDataBean.setObj(list.get(i));
        %>
         
    <tr>
        <td>
        <%
            out.print(showDataBean.getFname() +" "+ showDataBean.getLname());
         
        %>
        </td>
        <td>
        <%
            out.print(showDataBean.getEmail());
        %>
        </td>
        <td>
        <%
            out.print(showDataBean.getPassword());
        %>
        </td>
        <td>
       <%
            out.print(showDataBean.getGender());
        %>
        </td>
         
    </tr>
    <% }%>
</table>

on peut remarquer qu’il y a une boucle for qui tourne pour créer un tableau HTML… Avec AngularJS 1.5 et Firebase, on fait cela en 2 lignes, là il en faut 200 ! Mais c’est pas mal quand même !!

Ensuite, on créé comme dans la partie un, une classe BEAN nommée ShowDataBean , on supprime le code autogénéré, pusi on colle ce code à la place:

package projetWeb;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class ShowDataBean
{

    String error;
    List<Object> allData=new ArrayList<Object>();

    public String fname,lname,email,password,gender;
    Object obj=new Object();

    public void setObj(Object obj) {
        this.obj = obj;
    }
    public String getError() {
        return error;
    }
    public List getDb_Data()
    {
        int i=0;
        try
        {
                String qry;
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/feedback","root","root");
                Statement s = con.createStatement();
                qry="Select fname,lname,email,password,gender from feedback.tbl_user_primary";
                ResultSet r=s.executeQuery(qry);
                while(r.next())
                {
                    DataFields d=new DataFields(r.getString(1), r.getString(2), r.getString(3),r.getString(4), r.getString(5));
                    allData.add(i,d);
                    i++;
                }

        }
        catch(Exception ex)
        {
                error="<b>Contact Administrator :</b>
" + ex;
                System.out.println("Your query is not working" + ex);
        }
       return allData;
    }
    public String getFname()
    {
        this.fname=((DataFields)obj).fname;
        return this.fname;
    }
    public String getEmail() {
        this.email=((DataFields)obj).email;
        return this.email;
    }

    public String getGender() {
        this.gender=((DataFields)obj).gender;
        return this.gender;
    }
    public String getLname() {
        this.lname=((DataFields)obj).lname;
        return this.lname;
    }
    public String getPassword() {
        this.password=((DataFields)obj).password;
        return this.password;
    }

    public class DataFields
    {
        public String fname,lname,email,password,gender;

        public DataFields(String  fname,String  lname,String  email,String  password,String  gender)
        {
            this.fname=fname;
            this.lname=lname;
            this.email=email;
            this.password=password;
            this.gender=gender;
        }
    }

}

Hé oui j’ai pas encore eu le temps de traduire, mais l’important est que si l’on clique droit sur exécuter sur le serveur sur la JSP que l’on a créé, la connexion fonctionne bien et nos utilisateur s’affichent bien dans le serveur WEB, il s’agit de l’un des rares exemples fonctionnels trouvés sur le web, je le traduirais bientôt ! :

 

java1.jpg