Partage
  • Partager sur Facebook
  • Partager sur Twitter

FAQ Java

La réponse aux questions les plus posées

28 octobre 2010 à 19:27:15



Vous en avez marre des questions qui reviennent chaque fois :colere2: , vous n'arrivez jamais à retrouver un sujet similaire à votre problème :( , vous avez très souvent la flemme de répondre à un problème parce qu'il faut écrire tout un roman :-° , ce sujet est fait pour vous.

Il regroupe les questions que les zéros ont posées et reposées dans le forum Java. Vous pouvez dès à présent rediriger tous les zéros qui ont des problèmes dont les solutions se trouvent ici. En plus cette FAQ est organisée en catégories et facilité donc la recherche. Mais attention pour le bien de ce topic il y'a des règles à respecter (Les remarques seront postés dans le topic de remarque).

Les règles


  • On ne poste aucune question dans ce sujet, uniquement des réponses aux questions qui sont énoncées dans le Topic principal,
  • Un message posté ici doit correspondre (en théorie) à une réponse, par contre si vous êtes bloqués à cause de la limite de 1 message/jr, vous pouvez rédiger plusieurs réponses par message,
  • Je m'occupe de faire le lien entre le topic principal et vos reponses, alors faites moi un MP si j'ai oublié de lier votre réponse,
  • Si vous avez des remarques à faire par rapport à la structure du sujet, envoyez plutot un MP ou créer un sujet à part pour en faire profiter les autres.
</span>

Java to Standard Edition (J2SE)



Java to Entreprise Edition (J2EE)


  • Serveur
    • Tomcat
    • Glassfish
    • Websphere
    • Autres
  • MVC
    • Servlet
    • JSP
    • JSF
    • Struts
    • Hibernate
      • Mapping des données
        • Mapping d'une relation One to One
        • Mapping d'une relation d'Héritage
        • Mapping d'une relation Many to One
        • Mapping d'une relation One to Many
        • Les components Mapping
      • Manipulation des données
        • Chargement des données
        • Modification (insert, update, delete) des données
  • JPA
  • Spring

</liste>

Java to Mobile Edition (J2ME)


Java et Android

  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
30 octobre 2010 à 13:25:24

C++ et Java : Pointeurs et Reférences


Auteur : QuentinC 2
Sujets associés : Topic

On considère que, en java, quand on déclare une variable d'un type objet (donc non primitif), on déclare en fait automatiquement un pointeur. Comme si on avait:
typedef Classe* Classe;
Notons bien qu'en java, on ne parle jamais de pointeur, mais de référence.

Partant de cette affirmation, on retrouve de nombreux points communs faciles à expliquer :
  • Une référence java peut valoir null et c'est techniquement la même chose qu'un pointeur NULL en C/C++.
  • Déréférencer un pointeur NULL en C/C++, soit par accès à un membre soit par appel d'une méthode provoque une erreur de segmentation. En java, l'appel d'une méthode sur une référence qui vaut null provoque une NullPointerException. C'est la même chose, sauf que java est plus malin et intercepte l'erreur avant que la JVM ne crashe.
  • L'opérateur new fait la même chose des deux côtés: il retourne un pointeur respectivement une référence vers un nouvel objet alloué. (La façon d'allouer est en interne différente, mais on s'en fout ici)
  • IL n'y a pas d'équivalent à delete en java pour la simple et bonne raison que la libération de la mémoire est gérée par le garbage collector.
  • On peut considérer que toutes les méthodes java sont automatiquement virtuelles
  • Avec cette affirmation, on peut aussi facilement comprendre pourquoi les variables a et b du code ci-dessous font référence au même objet en mémoire (et qu'il n'y a donc pas deux objets distincts comme certains le croient encore) :
    MonObjet a = new MonObjet();
    MonObjet b = a;
    

    A mettre en relation avec :
    MonObjet* a = new MonObjet();
    MonObjet* b = a;
    

  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
31 octobre 2010 à 20:50:17

Comment creer un jar executable ?


Sujet associé : Topic

A partir du dossier dans lequel se trouve vos fichiers .class tapez la commande suivante :
jar cfe MonApp.jar ClassePrincipale fichier1 fichier2 fichier3 ...


MonApp.jar: Votre jar executable
ClassePrincipale: La classe dans laquelle se trouve le main
fichierX : classes du projet
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
1 novembre 2010 à 0:58:28

Comment configurer le PATH ?


Sous Windows Seven



Ouvrez le Panneau de Configuration.
Ensuite, direction Système et Sécurité > Système > Paramètres Système Avancée.

Dans la fenêtre qui vient de s'ouvrir, cliquez sur le bouton "Variable d'Environnement".

Vous devriez avoir quelque chose comme ceci :

Image utilisateur


Recherchez (comme sur le screen), la ligne "Path" puis cliquez sur "Editer", vous y voilà !

Sous UNIX (Debian ?)


Il n'est normalement pas nécessaire d'effectuer cette manipulation après avoir installer Java.

Selon votre shell, vous devez éditer un fichier "maître", par exemple, pour Bash, vous devez éditez ~/.bashrc

Plusieurs choix s'offrent à vous :
  • A l'aide de votre éditeur favori, rajouter la ligne suivante à la fin du fichier : "export PATH=$PATH:/path/to/java"
  • echo "export PATH=$PATH:/path/to/java" >> ~/.bashrc

Un exemple concret: Ajout des binaires du jdk au PATH


Sous Windows XP/Vista/Seven


Après avoir cliquer, ajoutez un ";" suivi du chemin vers le dossier bin de votre jdk/jre. (Exemple: C:\Program Files\Java\jdk1.6.0_21)

Vous devriez arriver à avoir quelque chose comme : "C:\Python\bin;C:\mingw\bin;C:\Program Files\Java\jdk1.6.0_21\bin"
Mais n'oubliez surtout pas le ";" avant le chemin vers le dossier voulu !

Appliquez, - redémarrez - (relancer l'application suffit généralement.) et voilà votre PATH modifié en règle !

Sous UNIX (Debian ?


Même chose que pour Windows à l'exception que le séparateur n'est plus un point-virgule (;) mais un double-point (:). Ainsi, pour la même configuration, on obtiendrait : "/usr/bin:~/bin:/path/to/java"
  • Partager sur Facebook
  • Partager sur Twitter
1 novembre 2010 à 6:56:49

Comment découper une chaîne de caractère avec split() ?


La méthode split() permet de découper une chaine de caractère en renseignant le(s) séparateurs désirés.
La méhode prend en paramètre une chaine de caractère qui désigne une expression régulière.

Exemple 1


public class Main {
  public static void main(String args[]) throws Exception{
    String str = "Jean Robert Marc Luc Pierre"; // chaine initiale
    String[] strout=str.split(" "); // le séparateur étant le caractère espace.

    System.out.println(java.util.Arrays.toString(strout)); // Affichage du tableau
    }
}

En sortie, on obtiendrait [Jean, Robert, Marc, Luc, Pierre]

Exemple 2


public class Main {
  public static void main(String args[]) throws Exception{
    String str = "Jean;Robert-Marc;Luc-Pierre"; // chaine initiale
    String[] strout=str.split(";|-"); // le séparateur étant les caractères - et ;.

    System.out.println(java.util.Arrays.toString(strout)); // Affichage du tableau
    }
}

En sortie, on obtiendrait [Jean, Robert, Marc, Luc, Pierre]
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
3 novembre 2010 à 19:00:13

Qu'est ce qu'une List ?



Une List en Java peut-être interprétée comme un tableau dynamique, c'est a dire, un ensemble ordonné d'éléments du même type, dont le nombre d'éléments peut varier.

En java on distingue 2 types de List, il s'agit des ArrayList et des LinkedList. Elles implémentent toutes deux l'interface List.

Les ArrayList est basée sur un tableau en interne, alors qu'une LinkedList est basée sur une liste chainée. Ce qui implique donc que les ArrayList sont plus efficaces pour l'accès aux données que les LinkedList, mais les LinkedList sont optimisées pour les opérations d'ajout et suppression sur la liste.
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
Anonyme
3 novembre 2010 à 19:29:20

Java et JavaScript : c'est pareil ?


Ces deux langages sont radicalement différents ! N'allez pas confondre Java et Javascript car ce sont deux langages qui n'ont clairement pas le même fonctionnement.

  • Le Java est un langage de programmation dit intermédiaire créé par le groupe Sun Microsystems au début des années 90 (aujourd'hui racheté par Oracle). Un de ses plus gros point fort réside dans la portabilité de ses applications (c'est-à-dire que tous programmes Java qui se respectent fonctionnera automatiquement sous Windows, Mac, Linux, etc.). C'est aussi un langage très complet. En effet, le champ d'application de Java est aujourd'hui assez vaste : il est possible de créer des logiciels de bureau conventionnels (swing, SWT, etc.), des programmes pour téléphone portable (JME), des services web (servlets, jsp, jsf, etc.), des animations pour page web (applets), ou encore des applicatifs de systèmes embarqués.

    Un exemple simple de code Java :

    public static void main(String[] args){
          System.out.println("Salut les zéros, ça va bien !?"); 
     }
    }
    

  • Quant à lui, le JavaScript (ou JS) est un langage de script orienté objet majoritairement utilisé sur Internet, il permet entre autres de dynamiser les pages Web, en étant un langage dit client-side. Il peut également être utilisé pour de petits jeux ou de petites animations très simples.

    Même s'il existe quelques applications sortant du contexte purement web (XUL, WSH, , JScript côté serveur), elles ne sont ni très puissantes ni très populaires par rapport à Java. L'utilisation principale de JavaScript restera toujours essentiellement dans les pages HTML. Pour plus d'informations, veuillez consulter le tutoriel officiel.

Nous constatons donc que ce sont bien deux langages différents. Cependant, étant tous les deux des langages dérivés du C, leur syntaxe est relativement proche. Mais la source de l'erreur réside dans le nom trompeur, et certains utilisateurs ont tendance à abréger le JavaScript, Java. Une erreur à ne plus faire donc ! De plus, le langage Java est un langage de programmation qui se montre beaucoup plus complexe que le JavaScript (notions d'objet, de classes, de threads, d'héritage, etc.).

Note : certains passages proviennent d'une réponse écrite par QuentinC 2, merci à lui !
  • Partager sur Facebook
  • Partager sur Twitter
3 novembre 2010 à 20:00:05

Comment charger une List ?



En considérant notre classe personne dont voici le code
public class Personne()
{
    String nom;
    String prenom;

    public Personne(String nom, String prenom)
    {
         this.nom=nom;
         this.prenom=prenom;
    }
}

Charger une Arraylist


ArrayList<String> listeTabZero=new ArrayList()<String>; // on notre objet ArrayList de String

// on cree nos objets
Personne p1,p2;
p1=new Personne("Dupont","pierre");
p2=new Personne("Dupont","charlotte");

// on ajoute les personnes dans la liste
listeTabZero.add(p1);
listeTabZero.add(p2);


Charger une linkedList


LinkedList<String> listeChZero=new LinkedList()<String>; // on notre objet ArrayList de String

// on cree nos objets
Personne p1,p2;
p1=new Personne("Dupont","pierre");
p2=new Personne("Dupont","charlotte");

// on ajoute les personnes dans la liste
listeChZero.add(p1);
listeChZero.add(p2);
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
4 novembre 2010 à 18:52:05

Qu'est-ce qu'une Map ?


Une Map en Java est l'équivalent des tableaux dynamiques fonctionnant sur le principe de clé-valeur. Ainsi, à une clé unique de la Map, on associe une valeur.

Java implémente plusieurs types de Map :
  • HashMap : Tableau dynamique clé-valeur standard.
  • TreeMap : HashMap doté de fonctions de tri.
  • LinkedHashMap : HashMap qui conserve l'ordre d'ajout des clés.

En fonction de vos besoins, vous devrez donc vous orienter vers telle ou telle type de Map. La documentation répondra à vos questions.

Comment charger une HashMap ?


En considérant la classe Acheteur:
public class Acheteur() {
    private String nom;
    private String prenom;
    private int revenu;

    public Acheteur(String nom, String prenom, int revenu) {
         this.nom = nom;
         this.prenom = prenom;
         this.revenu = revenu;
    }

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

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

    public String obtenirRevenu() {
        return this.revenu;
    }
}


Nous allons, par exemple, créer un tableau associant un id (de maison, ou autres: peut importe.) à un acheteur :
/* 
 * On crée notre HashMap possédant des clés de type Integer
 * et des valeurs de type Acheteur.
 */
HashMap<Integer, Acheteur> listeXY = new HashMap<Integer, Acheteur>();

/* 
 * On crée nos Acheteurs.
 */
Acheteur a1, a2;
a1 = new Acheteur("Bond", "James", 777);
a2 = new Acheteur("Dupond", "Jacques", 200);

/* 
 * On ajoute à notre HashMap nos informations:
 * A l'ID 5, on aura l'Acheteur James Bond.
 * A l'ID 77, on aura l'Acheteur Jacques Dupond.
 */
listeXY.put(5, a1);
listeXY.put(77, a2);


Comment utiliser un objet de type Map ?



Pour une utilisation minimal d'un Objet de type Map, trois fonctions sont à connaitre :
  • Map.put(); : Ajoute un couple clé-valeur.
  • Map.remove(); : Supprime le couple associée à cette clé.
  • Map.get(); : Récupère la valeur associée à la clé donnée.

L'ajout d'Objet


/* 
 * On crée une HashMap contenant des clés de type String
 * et des valeurs de type Integer
 */
Map<String, Integer> map = new HashMap<String, Integer>();

// On suit les types indiqués : String pour la clé, Integer pour la valeur
map.put("Argument de type STRING", 1); 

/* On crée une HashMap contenant des clés 
 * et des valeurs sans type pré-défini
 */


Attention à bien respecter les types indiqués ou vous aurez des erreurs à la compilation !
Ainsi, ne faites surtout pas des codes tel que :
/* 
 * On crée une HashMap contenant des clés de type String
 * et des valeurs de type Integer
 */
Map<String, Integer> map = new HashMap<String, Integer>();

// Un float à la place d'un String pour la clé
// Un String à la place d'un Integer
map.put(1.0f, "String"); // Uncompilable code

La Suppression d'un Objet


Map<String, Integer> map = new HashMap<String, Integer>();
map.put("String", 1);

// On supprime l'entrée correspondant à clé égale à "String"
map.remove("String");


Cependant, pour éviter certaines exceptions, il est préférable de vérifier que le clé existe avant de supprimer une entrée :
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("String", 1);

// Si une clé égale à "String" existe ...
if ( map.containsKey("String") )
    map.remove("String"); // ... Alors on la supprime.

La récupération d'une valeur


Map<String, Acheteur> map = new HashMap<String, Acheteur>();

Acheteur a1 = new Acheteur("Bond", "James", 777);
map.put("String", a1);

// On souhaite récupérer l'Integer lié à la clé souhaitée
Acheteur a2 = (Acheteur)map.get("String");
System.out.println( a2.obtenirRevenu() ); // Retourne 777

Si on observe la ligne 5, on voit un cast vers un Integer. En effet, Map.get(); retourne un Object, il est donc préférable de le cast explicitement pour pouvoir utiliser les fonctions associées: essayer sans, votre IDE ne sera pas trop content. ;)

Pour plus d'explications:
En réalité, lors de l'instanciation d'un objet implémentant Map, List ou autres, il n'est pas obligé de déclarer les types contenant dans le tableau.
Map map = new HashMap();
map.put("String", 1.0f);
map.put(4, new Acheteur("Bond", "James", 777);

// Jusqu'ici tout va bien ...

System.out.println( (float)map.get("String") ); // Retourne un float
System.out.println( (Acheteur)map.get(4) ); // Retourne un Acheteur


On observe que selon la clé, on obtient un type quelconque. Ce comportement est donc à risque, vous aurez d'ailleurs des warnings à la compilation. En effet, dès lors que votre programme va devoir gérer un tel système dynamiquement (On fournit une clé, on attend une valeur), un type non-prévu peut arriver et compromettre la stabilité de votre programme.


Comment parcourir une Map ?


Contrairement aux List, il n'est pas directement possible de parcourir une Map avec une boucle étendue for.
Nous avons alors deux méthodes: (En supposant que nous avons un clé de type String, une valeur de type Integer)
  • Créer un itérateur :
    Map map<String, Integer> = new HashMap<String, Integer>();
    Set keyset = map.keySet();
    
    Iterator iterator = keyset.iterator();
    while ( iterator.hasNext() ) {
        String key = iterator.next(); // Clé de type String
        Integer value = (Integer)map.get( key );
    }
    
Utiliser Map.Entry :
Map map<String, Integer> = new HashMap<String, Integer>();

for ( Map.Entry<String, Integer> m : map.entrySet() ) {
    String key = m.getKey();
    Integer value = m.getValue();
}
  • Partager sur Facebook
  • Partager sur Twitter
6 novembre 2010 à 23:01:24

Comment lire un fichier texte ?


En java on peut lire un fichier texte de deux façon :

BufferedReader


String chemin = "c:\\monfichier.txt";

try{
  BufferedReader buf = new BufferedReader(new FileReader(chemin));

  try {
  String line;
  // on lit toutes les lignes du fichier
  while ((line = buff.readLine()) != null) {
    System.out.println(line);
  }
} finally {
    // on ferme notre fichier
    buf.close();
  }
} catch (IOException ioe) {
  System.out.println(ioe.toString());
}


Scanner

  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
6 novembre 2010 à 23:09:47

En cours de rédaction

Qu'est-ce qu'un Thread ?


Définition


En informatique, un thread peut correspondre à un sous-processus. En effet, un processus possède son propre environnement, une seule ligne de conduite : un thread. Du à cet unique thread, vous avez du remarqué que votre programme n’exécute les commandes qu'une à une.

Cet unique thread diffère du processus lui-même, contrairement à celui-ci, le thread peut partager les données avec tous les autres threads: ce que les processus ne font pas entre eux. Lorsque le processus possède plusieurs threads, il pourra alors exécuter les commandes par intermittence. Il exécute A, puis B, puis relègue A, puis de nouveau B, etc. Chacun des threads possède un statut qui lui est propre.

L'avantage du thread, dit "processus léger" est qu'il d'intégrer la notion de parallélisme. Mais l'inconvénient est qu'il amène l'accès concurrent aux données partagées: point sensible à ne pas négliger, source de beaucoup d'erreur.

Pour vulgariser, on peut le considérer comme un processus dans le processus: vous pouvez lancer plusieurs programmes, mais si un des programmes utilise un fichier, vous ne pourrez pas le supprimer par exemple.

Création d'un Thread


En java, il y a deux manières de créer un Thread :
  • Créer une classe héritant de java.lang.Thread puis de redéfinir la méthode Thread.run();
  • Implémenter l'interface java.lang.Runnable puis instancier java.lang.Thread en lui passant cette classe en paramètre.

Comment gérer un Thread ?


Comment démarrer un Thread ?


Une fois qu'un Thread est crée, il suffit de le lancer avec Thread.start();

Comment arrêter un Thread ?


Pour arrêter un Thread, il ne faut pas utiliser la fonction Thread.stop(); ! En effet, celle-ci étant dépréciée, elle est donc instable et provoque un comportement inattendue.

Pour se faire, il faudra alors le thread dans une boucle qui permettra, ou non, de le faire continuer.

private boolean isFinish = false; // Variable à modifier pour arrêter, ou non, notre Thread.

public void run() {
    boolean end = false;
        
    while( !end ) {
        try {
            // Votre Thread
                   
            // On fait une pause pour mettre à jour notre variable et voir si on stop ici.     
            synchronized(this) {
                Thread.yield();
                                
                fin = this.isFinish;
            } 
        } catch( InterruptedException e ) {}
    } 
} 

public synchronized void exit() {
     this.isFinish = true;
}
  • Partager sur Facebook
  • Partager sur Twitter
6 novembre 2010 à 23:53:51

Comment écrire dans un fichier texte ?


Pour ecrire dans un fichier texte, on peut passer par un Printwriter, comme le montre le code ci-dessous:

PrintWriter pw;
String fichier ="C:\\monfichier.txt"

    pw =  new PrintWriter(new BufferedWriter(new FileWriter(fichier)));
   
    pw.println("Ligne 1");
    pw.println("Ligne 2");
    pw.println("Avant dernière ligne");
    pw.println("Dernière ligne");
    
   // on ferme le fichier
    pw.close();
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
7 novembre 2010 à 8:49:20

Comment sérialiser un objet ?



Sérialiser un objet permet de sauvegarder cet objet (on parle de persistance) et non simplement des valeurs.

On crée un objet Etudiant qui implémente l'interface Sérializable. En implémentant cette dernière, on spécifie que l'objet en question peut être sérialisé.
import java.io.*;

public class  Etudiant implements Serializable {
	private String nom,prenom;

	public Etudiant(String nom, String prenom){
		this.nom=nom;
		this.prenom=prenom;
	}

	public String getNom() { return nom; }

	public String getPrenom() { return prenom; }
}


On crée un main de test. Celui-ci écrit deux étudiants, puis les lit et appelle les accesseurs des étudiants lus dans le fichier.

import java.io.*;

public class Test {
	public static void main(String [] args){
		/*Création d'un tableau d'étudiants
		 * Le premier sert à stocker les étudiants à écrire
		 * Le second sert à récupérer les étudiants durant la lecture
		 */
		Etudiant[] writeEtudiant = new Etudiant[2];
		Etudiant[] readEtudiant = new Etudiant[2];	
		
		// Stockage des étudiants
		
		writeEtudiant[0] = new Etudiant("Bill","Sparrow");
		writeEtudiant[1] = new Etudiant("Jack", "Gates");
		try{
			/* Création du flux de sortie
			 * On précise le chemin du fichier, ici la racine du projet
			 * On écrit chaque Etudiant dans le fichier
			 * Le booléen signifie que les données seront ajoutées 
                         * au contenu du fichier
			 */
			ObjectOutputStream ecriture = new ObjectOutputStream(
                                    new FileOutputStream("Etudiant.dat",true));
			/* Ecriture des deux étudiants */
			ecriture.writeObject(writeEtudiant[0]);
			ecriture.writeObject(writeEtudiant[1]);
			/* Fermeture du fichier */
			ecriture.close();

			/* Création du flux d'entrée
			 * On précise le chemin du fichier, ici la racine du projet
			 * On lit chaque objet sérialisé par le biais de la méthode 
                         * readObject() qui est casté en Etudiant
			 */
			ObjectInputStream lecture = new ObjectInputStream(
                                   new FileInputStream("Etudiant.dat"));
			/* Lecture des deux étudiants */
			readEtudiant[0] = (Etudiant) lecture.readObject();
			readEtudiant[1] = (Etudiant) lecture.readObject();
			/* Fermeture du fichier */
			lecture.close();
			
			System.out.println(readEtudiant[0].getNom() + " " 
                        + readEtudiant[0].getPrenom());
			System.out.println(readEtudiant[1].getNom() + " "
                        + readEtudiant[1].getPrenom());
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}


  • Partager sur Facebook
  • Partager sur Twitter
8 novembre 2010 à 18:10:25

Faire une capture d'écran en Java


Une capture d'écran en Java est réalisée grâce à la classe Robot. Cette classe permet de prendre des capture d'écran sous 3 formes:

Capture de l'écran entier


Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle(java.awt.Toolkit.getDefaultToolkit().getScreenSize()) );
// on enregistre dans un fichier png
            File f =new File("C:\\exemple.png");
            try {
                if (f != null) {
                    ImageIO.write(img, "png", new FileImageOutputStream(f));
                }
            } catch (Exception e) {
            }


Capture de la fenêtre


Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture( new Rectangle( frame.getX(), frame.getY(), frame.getWidth(), frame.getHeight() ));
// on enregistre dans un fichier png
            File f =new File("C:\\exemple.png");
            try {
                if (f != null) {
                    ImageIO.write(img, "png", new FileImageOutputStream(f));
                }
            } catch (Exception e) {
            }


Capture d'une zone sélectionnée


Robot robot = new Robot();
BufferedImage img = robot.createScreenCapture(new Rectangle( 30, 100, 800, 600));
// on enregistre dans un fichier png
            File f =new File("C:\\exemple.png");
            try {
                if (f != null) {
                    ImageIO.write(img, "png", new FileImageOutputStream(f));
                }
            } catch (Exception e) {
            }
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
13 novembre 2010 à 18:23:13

Création d'un serveur d'écho


Il s'agit d'un serveur qui se charge de renvoyer à un client le message que ce dernier a transmis au serveur. C'est la raison pour laquelle on parle d'écho.
Notons ici que le serveur ne peux pas communiquer avec plus d'un client simultanément. Pour réaliser celà il faut rajouter la notion de multithread.

import java.net.Socket;
import java.net.ServerSocket;

public class ServerEcho {

    public static void main(String[] args) throws Exception {

        // création de la socket
        int port = 1989;
        ServerSocket serverSocket = new ServerSocket(port);
        System.err.println("Serveur lancé sur le port : " + port);

        // repeatedly wait for connections, and process
        while (true) {

            // on reste bloqué sur l'attente d'une demande client
            Socket clientSocket = serverSocket.accept();
            System.err.println("Nouveau client connecté");

            // on ouvre un flux de converation
            In  in  = new In (clientSocket);
            Out out = new Out(clientSocket);

            // chaque fois qu'une donnée est lue sur le réseau on la renvoi sur le flux d'écriture.
            // la donnée lue est donc retournée exactement au même client.
            String s;
            while ((s = in.readLine()) != null) {
                out.println(s);
            }

            // on ferme les flux.
            System.err.println("Connexion avec le client terminée");
            out.close();
            in.close();
            clientSocket.close();
        }
    }
}
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
Anonyme
14 novembre 2010 à 19:13:44

Comment parcourir une List ?



Afin de parcourir une List nous avons trois solutions.

La première solution consiste à utiliser la méthode size et get:
public class Main {
	
	private static List<String> strings ;

	public static void main(String[] args) {
		strings = new ArrayList<String>();
		
		strings.add("Bonjour ");
		strings.add("tu ");
		strings.add("vas ");
		strings.add("bien ");
		strings.add("?");
		
		for(int i=0;i<strings.size();i++){
			System.out.print(strings.get(i));
		}
	}
	
}


La deuxième solution consiste à utiliser un objet Iterator:
public class Main {
	
	private static List<String> strings ;

	public static void main(String[] args) {
		strings = new ArrayList<String>();
		
		strings.add("Bonjour ");
		strings.add("tu ");
		strings.add("vas ");
		strings.add("bien ");
		strings.add("?");
		
		Iterator<String> chaine = strings.iterator();
		while(chaine.hasNext()){
			System.out.print(chaine.next());
		}
	}
	
}


La dernière solution consiste à utiliser une boucle foreach:
public class Main {
	
	private static List<String> strings ;

	public static void main(String[] args) {
		strings = new ArrayList<String>();
		
		strings.add("Bonjour ");
		strings.add("tu ");
		strings.add("vas ");
		strings.add("bien ");
		strings.add("?");
		
		for(String s : strings){
			System.out.print(s);
		}
	}
	
}

  • Partager sur Facebook
  • Partager sur Twitter
15 novembre 2010 à 19:44:22

Création d'un client d'écho


Un client d'écho permet de se connecter a un serveur d'écho tel que décrit dans cette section.
import java.net.*;
import java.io.*;

public class EchoClient {
  public static void main(String[] args) {
    String hostname = "localhost";
    if (args.length > 0) {
      hostname = args[0];
    }
    // on crée les flux d'entrées sorties
    PrintWriter out = null;
    BufferedReader networkIn = null;
    try {
      Socket theSocket = new Socket(hostname); // on crée la socket
      networkIn = new BufferedReader(new InputStreamReader(theSocket.getInputStream())); //on initialise le flux de lecture sur le réseau.
      BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in)); // on se prépare à lire les entrées sur le clavier
      out = new PrintWriter(theSocket.getOutputStream());
      System.out.println("Connecté au serveur");

      // on boucle sur la lecture du reseau
      while (true) {
        String line = userIn.readLine();
        if (line.equals(".")) break; // on sort de la boucle si l'on rencontre un point.
        out.println(line);
        out.flush();
        System.out.println(networkIn.readLine());
      }
    }
    catch (IOException e) {
      System.err.println(e);
    }
    finally {
      try {
        if (networkIn != null) networkIn.close();
        if (out != null) out.close();
        System.out.println("Connexion terminée");
      }
      catch (IOException e) {}
    }
  }
}


Execution :
Connecté au serveur
Bonjour
Bonjour
Je suis M. Willard
Je suis M. Willard
Aurevoir
Aurevoir
.
Connexion terminée
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
Anonyme
15 novembre 2010 à 20:45:06

Le design pattern observer ?



Le design pattern Observer permet de définir une dépendances entre un objet (L'observé) et plusieurs autres objets (Les observateurs). Quand l'observé change d'état, il va notifier les observateurs.
En Java, nous disposons de d'une classe et d'une interface permettants de mettre en place le design pattern Observer.
  • la classe java.util.Observable. L'objet que nous voulons observer doit hériter de cette classe.
  • l'interface java.util.Observer. Les observateurs doivent implémenter la méthode de cette interface.


Exemple Swing:
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Main {

	public static void main(String[] args) {
		SDZFrame frame = new SDZFrame();
		frame.setDefaultCloseOperation(SDZFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}

}

class SDZFrame extends JFrame {

	private static final long serialVersionUID = 8459041084584493795L;

	/**
	 * Constructeur.
	 */
	public SDZFrame() {
		super("desin pattern Observer");
		init();
	}

	/**
	 * La méthode suivante permet d'initialiser l'IHM de l'application.
	 */
	private void init() {
		JLabel label1 = new JLabel("Saisir une valeur: ");
		JLabel label2 = new JLabel("Saisir une valeur: ");
		JLabel label3 = new JLabel("La valeur saisie est: ");
		setLayout(new GridLayout(3, 3, 2, 2));

		StringObservable observable = new StringObservable();

		add(label1);
		SDZTextField textfield1 = new SDZTextField(observable);
		add(textfield1);

		add(label2);
		SDZTextField textfield2 = new SDZTextField(observable);
		add(textfield2);

		add(label3);
		SDZLabel label4 = new SDZLabel(observable);
		add(label4);

	}

}

class SDZLabel extends JLabel implements Observer {

	private static final long serialVersionUID = 1494388745926012891L;

	public SDZLabel(StringObservable observable) {
		observable.addObserver(this);
	}

	@Override
	// Cette méthode est appelée par l'objet observé.
	public void update(Observable o, Object arg) {
		setText(arg.toString());
	}

}

class SDZTextField extends JTextField implements Observer, KeyListener {

	private static final long serialVersionUID = -4486493690639803915L;

	private StringObservable observable;

	public SDZTextField(StringObservable observable) {
		observable.addObserver(this);
		this.observable = observable;
		/*
		 * nous ajoutons un listener sur le JTextField afin de détecter les
		 * changements.
		 */
		addKeyListener(this);
	}

	@Override
	// Cette méthode est appelée par l'objet observé.
	public void update(Observable o, Object arg) {
		setText(arg.toString());
	}

	@Override
	public void keyPressed(KeyEvent e) {
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// nous changeons la valeur de l'objet observé.
		observable.setValue(getText());
	}

	@Override
	public void keyTyped(KeyEvent e) {
	}

}

/**
 * Classe StringObservable. 

 * Cette classe sera observée par des observateur. Si le paramètre change
 * d'état, alors nous notifions les observateurs.
 * 
 * @author Damien
 * 
 */
class StringObservable extends Observable {

	/**
	 * Le paramètre que nous voulons observé
	 */
	private String value;

	public StringObservable() {
		value = "";
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
		/*
		 * value vient de changer de valeur ? Alors nous notifons les
		 * observateurs.
		 */
		setChanged();
		notifyObservers(value);
	}

}
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
16 novembre 2010 à 21:20:02

Qu'est ce qu'un Set ?



Un Set est une collection (tableau dynamique), comme la List, qui n'accepte pas les doublons. Il est donc impossible d'avoir deux fois la même instance d'une classe (o1.equals(o2) est impossible).

Vous pouvez utiliser trois types de Set en Java, HashSet, LinkedHashSet et le TreeSet.
  • HashSet: les opération add, remove, containts et size sont exécutées en temps constant.
  • LinkedHashSet: est un liste doublement chainée qui conserve l'orde des éléments.
  • TreeSet: ici, les éléments sont stockées dans leur ordre naturel / a l'aide d'un Comparator fourni au moment de la construction. Ici les opérations add, remove, contains and size sont exécutées en un temps log(n)


Ces trois collections ne sont pas synchronisées. Il est donc impossible d'itérer et modifier ces Collection en même temps. Pour remédier au problème vous pouvez appeler la méthode statique:
java.util.Collections.synchronizedSet(java.util.Set<T>)

qui permet de récupérer votre Set avec l'ensemble des méthodes synchronisées.

Pour avoir des informations complémentaire je vous invite à consulter la javadoc.

Comment charger un Set ?



Nous allons utiliser la classe suivante pour notre démonstration:
public class Personne
{
	
	private String nom = null;
	
	private String prenom = null;
	
	public Personne() {
		this("","");
	}

	public Personne(String nom, String prenom) {
		this.nom = nom;
		this.prenom = prenom;
	}

	public String getNom() {
		return nom;
	}

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

	public String getPrenom() {
		return prenom;
	}

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

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((nom == null) ? 0 : nom.hashCode());
		result = prime * result + ((prenom == null) ? 0 : prenom.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Personne other = (Personne) obj;
		if (nom == null) {
			if (other.nom != null)
				return false;
		} else if (!nom.equals(other.nom))
			return false;
		if (prenom == null) {
			if (other.prenom != null)
				return false;
		} else if (!prenom.equals(other.prenom))
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return "Personne [nom=" + nom + ", prenom=" + prenom + "]";
	}

}


Pourquoi un Set fonctionne ? Pourquoi n'avons nous jamais la même valeur dedans ?
Au moment de l'opération add, le Set va récupérer l'ensemble des objets, qu'il stocke, ayant le même hashCode. Puis, sur les objets restant, il va comparer les objets en appelant la méthode equals.
Si, pour l'un des objets restant, la méthode equals retourne vrai alors le nouvel objet ne sera pas inséré.


Pour utiliser un HashSet:
public class Main {

	public static void main(String[] args) {
		// Création du Set
		Set demoSet = new HashSet();
		
		// Création des objets Personne pour la démonstration
		Personne p1 = new Personne("Syrion75","");
		Personne p2 = new Personne("Dupont","Alain");
		
		// Alimentation du Set
		demoSet.add(p1);
		System.out.println(demoSet.size()); // affiche 1
		demoSet.add(p2);
		System.out.println(demoSet.size()); // affiche 2
		demoSet.add(p1); // p1 étant déjà présent dans le set, il ne sera pas ajouté.
		System.out.println(demoSet.size()); // affiche 2	
	}

}


Pour utiliser un LinkedHashSet:
public class Main {

	public static void main(String[] args) {
		// Création du Set
		Set demoSet = new LinkedHashSet();
		
		// Création des objets Personne pour la démonstration
		Personne p1 = new Personne("Syrion75","");
		Personne p2 = new Personne("Dupont","Alain");
		
		// Alimentation du Set
		demoSet.add(p1);
		System.out.println(demoSet.size()); // affiche 1
		demoSet.add(p2);
		System.out.println(demoSet.size()); // affiche 2
		demoSet.add(p1); // p1 étant déjà présent dans le set, il ne sera pas ajouté.
		System.out.println(demoSet.size()); // affiche 2	
	}

}


Pour finir, une petite démonstration du TreeSet avec un Comparator:
public class Main {

	public static void main(String[] args) {
		// Création du Set
		Set demoSet = new TreeSet(new PersonneComparator());
		
		// Création des objets Personne pour la démonstration
		Personne p1 = new Personne("Syrion75","");
		Personne p2 = new Personne("Dupont","Alain");
		
		// Alimentation du Set
		demoSet.add(p1);
		System.out.println(demoSet.size()); // affiche 1
		demoSet.add(p2);
		System.out.println(demoSet.size()); // affiche 2
		demoSet.add(p1); // p1 étant déjà présent dans le set, il ne sera pas ajouté.
		System.out.println(demoSet.size()); // affiche 2	
	}

}

class PersonneComparator implements Comparator
{

	@Override
	public int compare(Object o1, Object o2) {
		System.out.println("Comparaison de ["+ o1 +"] et ["+ o2 +"].");
		if( o1 == null && o2 == null ){
			return 0 ;
		} else if ( o1 == null ) {
			return -1 ;
		} else if ( o2 == null ) {
			return 1 ;
		}
		Personne p1 = (Personne)o1;
		Personne p2 = (Personne)o2;
		int result = p1.getNom().compareTo(p2.getNom());
		if(result == 0){
			result = p1.getPrenom().compareTo(p2.getPrenom());
		}
		return result;
	}
	
}
  • Partager sur Facebook
  • Partager sur Twitter
17 novembre 2010 à 10:37:40

Executer une requête d'interrogation (SELECT)



Les requêtes SQL de type "SELECT" permettent d'intorroger une base de donnée et de retourner un ensemble d'enregistrements.

Considérons la table pays suivante.
Id Nom_Pays Continent
1 France Europe
2 Italie Europe
3 Bresil Amérique


On veut trouver la liste des pays d'europe.

Méthode 1


Connection con; // la connexion doit être initialisée
public void afficheEurope()
{
    String requete = "select * from pays where Continent='Europe'";
    try {
	stmt = con.createStatement(); // on crée le statement
	ResultSet rs = stmt.executeQuery(requete); // on execute la requête
	while (rs.next()) {
		int id = rs.getInt("Id");
		String pays = rs.getString("Nom_Pays");
		System.out.println(id+" - "+pays);
	}
	stmt.close();
	con.close();
    } catch(SQLException ex) {
	System.err.println("SQLException: " + ex.getMessage());
    }
}


On obtient donc le résultat suivant :
1 - France
2 - Italie
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
Anonyme
17 novembre 2010 à 21:17:44

Comment parcourir un Set



Pour la démonstration: «comment parcourir un Set» nous allons utiliser la classe suivante:
public class Personne
{ 
	
	private String nom = null;
	
	private String prenom = null;
	
	public Personne() {
		this("","");
	}

	public Personne(String nom, String prenom) {
		this.nom = nom;
		this.prenom = prenom;
	}

	public String getNom() {
		return nom;
	}

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

	public String getPrenom() {
		return prenom;
	}

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

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((nom == null) ? 0 : nom.hashCode());
		result = prime * result + ((prenom == null) ? 0 : prenom.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Personne other = (Personne) obj;
		if (nom == null) {
			if (other.nom != null)
				return false;
		} else if (!nom.equals(other.nom))
			return false;
		if (prenom == null) {
			if (other.prenom != null)
				return false;
		} else if (!prenom.equals(other.prenom))
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return "Personne [nom=" + nom + ", prenom=" + prenom + "]";
	}

}


En Java, nous avons deux solutions. La première est basée sur l'utilisation d'un Iterator (elle est compatible avec toutes les versions du JDK):
public class Main {

		public static void main(String[] args) {
			// Création du Set
			Set demoSet = new HashSet();
			
			// Création des objets Personne pour la démonstration
			Personne p1 = new Personne("Syrion75","");
			Personne p2 = new Personne("Dupont","Alain");
			Personne p3 = new Personne("Daudet","Alphonse");
			
			// Alimentation du Set
			demoSet.add(p1);
			demoSet.add(p2);
			demoSet.add(p3);
			
			// Parcourir le Set
			Iterator its = demoSet.iterator();
			while(its.hasNext()) {
				System.out.println(its.next());
			}
			
		}
	
}


Si vous avez une version Java >= 1.5 vous pouvez utiliser une boucle foreach:
public class Main {

		public static void main(String[] args) {
			// Création du Set
			Set<Personne> demoSet = new HashSet<Personne>();
			
			// Création des objets Personne pour la démonstration
			Personne p1 = new Personne("Syrion75","");
			Personne p2 = new Personne("Dupont","Alain");
			Personne p3 = new Personne("Daudet","Alphonse");
			
			// Alimentation du Set
			demoSet.add(p1);
			demoSet.add(p2);
			demoSet.add(p3);
			
			// Parcourir le Set
			for(Personne p : demoSet){
				System.out.println(p);
			}
			
		}
	
}
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
18 novembre 2010 à 21:17:48

Singleton



Avant de parler de Singleton, un design pattern, je vous propose une petite introduction.
Un design pattern :euh: ! Pour faire quoi ?

Un design pattern, ou patron de conception, permet de résoudre des problématiques:
  1. n'avoir qu'une instance d'un objet un mémoire (Singleton)
  2. gérer les états d'un objets (State)
  3. accéder de façon séquentielle aux éléments d'une liste, d'une collection
  4. etc.


De manière globale les design patterns peuvent être classifiés en trois catégories:Création, Comportement et Struture

Pourquoi utiliser Singleton



Le pattern Singleton permet de n'avoir qu'une seul instance d'un objet en mémoire et d'avoir un point d'accès unique. Ce pattern est utilise, par exemple, pour les Factory.

Démonstration environnement mono-thread


Notre classe Singleton:
public class ServeurSingleton
{
	
	private static ServeurSingleton instance ;
	
	private ServerSocket socket ;
	
	private ServeurSingleton() {
		// du code
		try {
			socket = new ServerSocket(80);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
	
	public static ServeurSingleton getInstance(){
		if(instance==null){
			instance = new ServeurSingleton();
		}
		return instance ;
	}
	
	public int getPort(){
		return socket.getLocalPort();
	}
	
}


classe Main:
public class Main {
	
	public static void main(String[] args) {
		ServeurSingleton serveur = ServeurSingleton.getInstance();
		System.out.println("Main :" + serveur.getPort());
		methode();
	}
	
	// Une autre méthode qui manipule l'objet ServeurSingleton. 
	public static void methode(){
		ServeurSingleton serveur = ServeurSingleton.getInstance();
		System.out.println("methode :" + serveur.getPort());
	}
	
}



Démonstration environnement multi-thread


Notre classe Singleton:
public class ServeurSingleton
{
	
	private static ServeurSingleton instance ;
	
	private ServerSocket socket ;
	
	private ServeurSingleton() {
		// du code
		try {
			socket = new ServerSocket(80);
			Thread.sleep(2000); // simulation d'une construction qui prend du temps.
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	// Nous devons utiliser le mot clé synchronized pour limiter le nombre d'accès simultané à la classe.
	public synchronized static ServeurSingleton getInstance(){
		if(instance==null){
			instance = new ServeurSingleton();
		}
		return instance ;
	}
	
	public int getPort(){
		return socket.getLocalPort();
	}
	
}


classe Main:
// Nous passons par des Threads afin de simuler des accès asynchrones
public class Main extends Thread {
	
	public Main(String name) {
		super(name);
	}

	public static void main(String[] args) {
		new Main("Thread 1").start();
		new Main("Thread 2").start();
		new Main("Thread 3").start();
	}
	
	@Override
	public void run() {
		System.out.println("Début du :" + getName());
		System.out.println("Récupérer l'instance de ServeurSingleton (dans " + getName() + ")");
		ServeurSingleton serveur = ServeurSingleton.getInstance();
		System.out.println("ServeurSingleton (dans " + getName() + ")");
		System.out.println("Main :" + serveur.getPort() + " (dans " + getName() + ")");
		System.out.println("Fin du :" + getName());
	}
	
}

  • Partager sur Facebook
  • Partager sur Twitter
19 novembre 2010 à 13:34:22

Executer une requête de modification (INSERT, UPDATE, DELETE )



Les requêtes SQL de type INSERT, UPDATE ou DELETE permettent d'inserer, modifier ou supprimer des données dans une base de donnée.

Considérons la table pays suivante.
Id Nom_Pays Continent
1 France Europe
2 Italie Europe
3 Bresil Amérique


Insertion


Connection con; // la connexion doit être initialisée
public void afficheEurope()
{
    String requete = "insert into pays(Id, Nom_Pays, Continent) values(4,'Chine','Asie')";
    try {
	stmt = con.createStatement(); // on crée le statement
	int nbline = stmt.executeUpdate();; // on execute la requête
	System.out.println("Nombre de lignes modifiées : "+nbline);
	stmt.close();
	con.close();
    } catch(SQLException ex) {
	System.err.println("SQLException: " + ex.getMessage());
    }
}


On obtient donc le résultat suivant :
Nombre de lignes modifiées : 1


Et notre table finale contient :
Id Nom_Pays Continent
1 France Europe
2 Italie Europe
3 Bresil Amérique
4 Chine Asie
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
5 mars 2011 à 8:58:00

Les méthodes statiques et non statiques



De nombreuses personnes font l'erreur d'appeler une méthode non-statique... sans l'associer à une instance (objet) de la classe. Par exemple :

class MaClasse {
  public MaClasse (int nombre) {
    variable = nombre ;
  }
  
  public int aff () {
    return variable ;
  }
  
  int variable ;
}

public class Essais {
  public static void main (String [] args) {
    MaClasse instance = new MaClasse (38) ;   // OK : un nouvel objet est créé
    System.out.println( aff() ) ;             // erreur : la méthode aff() n'est pas associée à une instance
  }
}


La méthode aff() est dite non statique car, pour fonctionner, elle doit être associée à une instance de la classe lui permettant d'accéder à ses attributs. Il faut donc faire :

System.out.println( instance.aff() ) ;


Elle va donc pouvoir accéder à l'attribut de "instance" qui est ici "variable".

Il est cependant possible de déclarer des méthodes en tant que statiques (comme il est d'ailleurs fait pour "main") en ajoutant le mot-clef static. La méthode ne sera ainsi pas appliquée à une instance de la classe mais ne pourra par conséquent pas accéder à ses champs. Pour appeler la méthode, il faut alors remplacer le nom de l'objet par le nom de la classe (comme il est fait pour afficher du texte avec System.out.printSystem est en fait le nom d'une classe).

class MaClasse {
  public MaClasse (int nombre) {
    variable = nombre ;
  }
  
  public static int aff () {
    return 5 ;      // il n'est pas possible d'accéder ici à "variable"
  }
  
  private int variable ;
}

public class Essais {
  public static void main (String [] args) {
    System.out.println( Essais.aff() ) ;
  }
}


Les seules variables auxquelles les méthodes statiques d'une classe peut accéder sont les attributs déclarés en tant que statiques. Voici une déclaration d'une variable en tant que statique : private static int variable2 ;
La méthode pourra y accéder car un seul exemplaire de cette variable sera présente. Elle restera la même également lors de l'appel de méthodes non statiques. Voici un petit exemple :

class MaClasse {
  public MaClasse (int nombre) {
    variable = nombre ;
    compteur++ ;
  }
  
  private int getVariable () {
    return variable ;
  }
  
  public static int getCompteur () {
    return compteur ;
  }
  
  private int variable ;
  private static int compteur ;
}


À chaque fois que le constructeur sera appelé et donc qu'un nouvel objet sera instancié, le compteur sera incrémenté, car il est le même quelque soit l'instance et peut par conséquent n'es être associé à aucune. Petit exemple qui utilise cette classe :

public class Essais {
  public static void main (String [] args) {
    MaClasse objet = new MaClasse (78) ;
    System.out.println( MaClasse.getCompteur() ) ;
    objet = new MaClasse (45) ;
    System.out.println( MaClasse.getCompteur() ) ;
  }
}

1
2


Conclusion : il faut toujours spécifier le nom de l'instance lors de l'appel d'une méthode non statique, et quand la méthode est statique, il faut tout de même spécifier le nom de la classe qui la contient.
  • Partager sur Facebook
  • Partager sur Twitter
5 mars 2011 à 14:32:48

Les Applets


Une applet est un petit programme Java destiné à être téléchargé et exécuté par le navigateur de l’internaute. Tout programme Java destiné à être exécuté au sein d’un navigateur dérive nécessairement de la classe java.applet.

Principe


La classe Applet implémente plusieurs méthodes. Les principales sont les méthodes init() , start(), stop() et destroy().

La méthode « init() » est la première méthode appelée une fois l’applet chargée par le navigateur. C’est dans cette fonction que les opérations d’initialisation doivent être effectuées.

La méthode « start() » est exécutée à la suite de la fonction « init() » et chaque fois que l’applet apparaît à l’écran.

La méthode « stop() » est exécutée chaque fois que l’applet disparaît. C’est par exemple le cas lorsque l’utilisateur réduit la fenêtre de son navigateur.

La méthode « destroy() » est exécutée lorsque les ressources utilisées par l’applet doivent être libérées. C’est par exemple le cas lorsque l’utilisateur ferme son navigateur. Avant d’exécuter cette fonction, la méthode « stop()» est systématiquement exécutée.

Exemple


Voici un applet qui permet d'afficher "Hello world" sur un navigateur.

//importation des différentes bibliothèques
import java.applet.*;
import java.swing.*;

public class Hello extends Applet
{
   private JLabel lab;
   public void init()
   {
       //code d'initialistaion
       lab=new JLabel("Hello World");
       
   }
   
   public void start()
   {
       //code de d'éxécution
       this.add(lab);
   }
   
   public void stop()
   {
       //code de suspension de l'execution
   }
   
   public void destroy()
   {
       //code de terminaison
   }
}


Création de la page Html


L’intégration d’une applet dans une page web se fait, par la balise « Applet » grâce au code suivant :

<APPLET code="Hello.class" width="500" height="200">
Applet java qui fait Hello world
</APPLET>


Notons que la classe java et le fichier Html doivent être stockés dans le répertoire, ou sinon il faut utiliser les chemins relatifs pour retrouver la page Html
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
7 mars 2011 à 16:53:32

L'encapsulation ou comment protéger les données d'une classe



Pour montrer comment encapsuler les données d'objets d'une classe, nous allons travailler sur deux classes, dont l'une définie un point et l'autre une ligne (qui a donc besoin de la première classe). Deux solutions s'offrent alors : soit vous désirez qu'une ligne se construise à partir de deux points déjà instanciés, soit vous voulez que les coordonnées des points qui constituent la ligne ne soient modifiables qu'à travers la classe Line.

Construisons tout d'abord notre classe Point avant de s'attaquer aux deux méthodes :

class Point {
  public Point (double x, double y) {
    this.x = x ;
    this.y = y ;
  }
  
  private double x, y ;
}


Vous pouvez déjà remarquer les lignes 7 et 8 : les champs x et y sont privés, et par conséquent, l'utilisateur de la classe ne peut y accéder. Ceci est un principe de l'encapsulation, car on ne va laisser à l'utilisateur accéder à ces champs uniquement par le biais de méthodes :

class Point {
  public Point (double x, double y) {
    this.x = x ;
    this.y = y ;
  }
  
  public void setX (double x) {
    this.x = x ;
  }
  
  public void setY (double y) {
    this.y = y ;
  }
  
  public double getX () {
    return x ;
  }
  
  public double getY () {
    return y ;
  }
  
  private double x, y ;
}


Le gros avantage de cette façon de faire, c'est que l'utilisateur n'aura pas besoin de changer la façon dont il utilise notre classe si nous modifions par exemple le nom des champs, ou encore que nous voulons ajouter les coordonnées polaires qui s'obtiendront par des calculs, et de même pour les modifier. Le code se montrera ainsi très compréhensible et n'aura pas besoin d'être modifié en cas de changement de fonctionnement de la classe.

Allez, on se fait l'ajout des coordonnées polaires (pour ceux qui connaissent) :

class Point {
  // les méthodes que nous avons déjà programmées
  
  public double getR () {       // r : la distance du point à l'origine
    return Math.sqrt( x*x + y*y ) ;
  }
  
  public double getTheta () {   // theta : l'angle
    return Math.acos( x / getR() ) ;  // car x = r cos(theta) <=> theta = acos( x/r )
  }
  
  private void changerPolaires (double r, double theta) {
    // méthode pour nous, donc privée
    x = r * Math.cos(theta) ;
    y = r * Math.sin(theta) ;
  }
  
  public void setR (double r) {
    changerPolaires( r, getTheta() ) ;
  }
  
  public void setTheta (double theta) {
    changerPolaires( getR(), theta ) ;
  }
  
  private double x, y ;
}


L'utilisateur peut donc sans problème récupérer ou modifier les coordonnées cartésiennes ou polaires sans avoir à se compliquer avec les champs.
On passe à notre problème de la classe Line.



Les coordonnées sont modifiables à partir de la classe Point



Nous allons construire notre classe Line en acceptant pour arguments dans le constructeur deux variables de type Point ; elle ne dérivera en aucun cas de Point :

class Line {
  public Line (Point p1, Point p2) {
    this.p1 = p1 ;
    this.p2 = p2 ;
  }
  
  private Point p1, p2 ;
}


Ajoutons une méthode qui permette d'obtenir la longueur de la ligne :

class Line {
  public Line (Point p1, Point p2) {
    this.p1 = p1 ;
    this.p2 = p2 ;
  }
  
  public double getLength () {
    return Math.sqrt( Math.pow( p2.getX() - p1.getX(), 2 )
                       + Math.pow( p2.getY() - p1.getY(), 2 ) ) ;
  }
  
  private Point p1, p2 ;
}


Utilisons donc cette classe :

public class Essais {
  public static void main (String [] args) {
    Point point1 = new Point (20, 40) ;
    Point point2 = new Point (25, 18) ;
    Line ligne = new Line (point1, point2) ;
    System.out.println ( ligne.getLength() ) ;
    // ici, on peut modifier les coordonnées des points
    // mais pas à travers la classe Line
    // et uniquement à travers des méthodes
    point1.setX (56.4) ;
    System.out.println ( ligne.getLength() ) ;
    point2.setR (40) ;
    System.out.println ( ligne.getLength() ) ;
  }
}


Il est donc aisé se modifier les coordonnées des points sans passer par la classe Line. Ceci constitue une première méthode qui permet d'accéder facilement aux propriétés de l'objet.



Les points ne sont accessible qu'à partir de la classe Line



Cette deuxième méthode permet de donner des restrictions quand à l'usage des points. Ainsi, même si les champs de la classe Point étaient publiques, ils se montreraient inaccessibles lorsqu'ils sont utilisés par la classe Line. Il suffit pour cela de faire que ce soit la classe Line qui instancie les deux points :

class Line {
  public Line (double x1, double y1, double x2, double y2) {
    // création et instanciation des deux points
  }
  
  private Point p1, p2 ;
}


Les deux points seront donc inclus dans la classe Line à la place d'être utilisés. Il n'y a plus qu'à créer les nouveaux points et à ajouter des méthodes :

class Line {
  public Line (double x1, double y1, double x2, double y2) {
    p1 = new Point (x1, y1) ;
    p2 = new Point (x2, y2) ;
  }
  
  public void setCoords (double x1, double y1, double x2, double y2) {
    p1.setX (x1) ; p1.setY (y1) ;
    p2.setX (x2) ; p2.setY (y2) ;
  }
  
  public double getLength () {
    return Math.sqrt( Math.pow( p2.getX() - p1.getX(), 2 )
                       + Math.pow( p2.getY() - p1.getY(), 2 ) ) ;
  }
  
  private Point p1, p2 ;
}


Quel pourrait être un avantage des restrictions ainsi données ? Par exemple de donner des valeurs maximums et minimums pour les coordonnées des points. Nous allons ainsi changer quelque peu la méthode setCoords et Line afin de n'accepter que les valeurs comprises entre 0 et 5000 :

class Line {
  public Line (double x1, double y1, double x2, double y2) {
    if ( verifCoords(x1, y1, x2, y2) {
      p1 = new Point (x1, y1) ;
      p2 = new Point (x2, y2) ;
    } else {
      isOk = false ;
    }
  }
  
  private boolean isOk (double n) {
    return n>= 0 && n <= 500 ;
  }
  
  private boolean verifCoords (double x1, double y1, double x2, double y2) {
    return isOk(x1) && isOk(y1) && isOk(x2) && isOk(y2) ;
  }
  
  public boolean setCoords (double x1, double y1, double x2, double y2) {
    if ( verifCoords(x1, y1, x2, y2) {
      p1.setX (x1) ; p1.setY (y1) ;
      p2.setX (x2) ; p2.setY (y2) ;
      return isOk = true ;
    } else {
      return isOk = false ;
    }
  }
  
  private isOk = true ;
  private Point p1, p2 ;
}



Vous pouvez désormais choisir l'une ou l'autre des méthodes selon vos besoins, en sachant que la première méthode est préférable car plus souple lorsque vous n'avez pas besoin d'imposer de restrictions. Je vous conseille de toujours mettre les champs de vos classes en tant que privées pour bien encapsuler vos données, rendre le code plus clair et l'utilisation des classes plus simples.
  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2011 à 9:16:01

Exécuter une procédure stockée



Avec JDBC il existe trois manières différentes d'effectuer des actions sur une base de données.
  • - Une requête simple, Statement
  • - Une requête préparée, PreparedStatement
  • - Exécuter une procédure stockée, CallableStatement

Pour se permettre l'utilisation de CallableStatement, la connaissance du langage procédural des bases de données est obligatoire, à moins que celles-ci soient déjà en base.

Le CallableStatement va effectuer une requête SQL correspondant à l'appel d'une procédure stockée et ainsi renvoyer le résultat, ou effectuer l'opération adéquate.

Exemple :



Imaginons la table SQL suivante :

CREATE TABLE User (
   id INTEGER PRIMARY KEY,
   nom VARCHAR(15), 
   prenom VARCHAR(15)
);


Et la procédure stockée permettant de renvoyer une ligne dans la table :
CREATE PROCEDURE find (id INT)
BEGIN
  SELECT * FROM user u WHERE u.id = id;
END


La classe Connect se connecte à une base de données MySQL, exécute la procédure stockée décrite précédemment, et affiche le résultat de cette-dernière.

public class Connect {

/**
 * Constructeur
 * @throws SQLException si une exception est levée 
 * au niveau de la base de données
 * @throws ClassNotFoundException si une exception 
 * est levée lors de l'importation du driver
 */
public Connect() throws SQLException, ClassNotFoundException {
	/**
	 * Chargement du driver
	 */
	Class.forName("com.mysql.jdbc.Driver");
	/**
	 * Création de la connexion.
	 */
	Connection connection = DriverManager.getConnection
       ("jdbc:mysql://localhost:3306/MaDatabase", "root", "");
	
	/**
	 * Création du CallableStatement. Celui-ci reçoit une requête SQL 
         * en paramètre "call find(?)" qui va appeler la procédure stockée.
         * On peut passer directement les paramètres dans la requête comme 
         * cela "call find(1)" ou alors lui spécifier après.
	 */
	CallableStatement callable = connection.prepareCall("call find(?)");
	/**
	 * On remplace le 1er élément par le String "1".
	 * On va donc renvoyer la ligne dont l'identifiant est 1
	 */
	callable.setString(1, "1");
	/**
	 * On exécute la procédure. Si celle-ci renvoie true, on continue.
	 */
	if(callable.execute()){
		/**
		 * On récupère le résultat de la procédure que l'on stocke 
                 * dans un ResultSet
		 */
		ResultSet result = callable.getResultSet();
		/**
		 * On se place à la bonne ligne
		 */
		result.next();
		/**
		 * On affiche le résultat
		 */
		System.out.println(result.getInt(1) + " " + 
                result.getString(2) + " " + result.getString(3));
	}
	/**
	 * On referme la Connection et le CallableStatement
	 */
	callable.close();
	connection.close();
	}
}


Javadoc :
CallableStatement
  • Partager sur Facebook
  • Partager sur Twitter
13 mars 2011 à 19:26:31

Comment signer un Jar ?



Pour signer un jar il faut tout d'abord créer un certificat. Pour ceci, allez dans votre console préférée et tapez la ligne de commande ci-dessous.
keytool -genkey -alias signature -keystore myStore

Vous devez donc répondre à un ensemble de questions tel que le nom, prénom, etc. A la fin de cette procédure vous aurez un certificat "signature" stocké dans le dépôt "myStore".

Ensuite il ne vous reste plus qu'a signer le jar avec votre certificat. Pour cela, tapez la commande ci-dessous.

jarsigner -keystore myStore -signedjar JarSign.jar JarExe.jar signature

Cette commande vous crée un jar signé qui s'appellera JarSign.jar (avant de lancer la commande il faut s'assurer que le certificat de signature est dans le même répertoire que le jar)
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.
18 mars 2011 à 18:49:04

Fichier de configuration Hibernate



Le framework Hibernate nécessite un fichier de configuration au format XML ayant pour but la configuration de nombreux paramètres pour l'application.

Parmi ces paramètres on retrouve :
  • La configuration à la base de données
  • La liste des entités
  • La gestion des cache (de premier et second niveau)
  • ...

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
    PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
		<property name="hibernate.connection.url">
			jdbc:postgresql://localhost:5432/
		</property>
		<property name="hibernate.connection.driver_class">
			org.postgresql.Driver
		</property>
		<property name="hibernate.connection.username">
			user
		</property>
		<property name="hibernate.connection.password">
			mypasswd
		</property>
		<property name="hibernate.dialect">
			org.hibernate.dialect.PostgreSQLDialect
		</property>
        <property name="hibernate.transaction.factory_class">
        	org.hibernate.transaction.JDBCTransactionFactory
        </property>
   		<mapping resource="com/sdz/MaClass.hbm.xml" />
    </session-factory>
</hibernate-configuration>

hibernate.connection.driver_class : Classe du driver JDBC
hibernate.connection.url : URL de la database
hibernate.connection.username : login
hibernate.connection.password : password
hibernate.dialect : Dialecte de la base de données. Hibernate peut optimiser les requêtes SQL envoyées selon le type de SGBD.

La balise <mapping /> permet l'ajout d'une entité, d'une classe à "mapper".
Elle peut donc prendre une fichier de configuration XML pour une classe, ou la classe en elle-même si celle-ci est annotée.

Voici une liste d'autres propriétés courantes :
hibernate.show_sql : Affiche les requêtes SQL effectuées
hibernate.hbm2ddl.auto : Exporte le schéma DDL vers la base de données lors de l'instanciation
d'une SessionFactory. Les valeurs possibles sont : "update" - "create" - "create-drop" - "validate".
hibernate.transaction.factory_class : Spécifie le nom d'une classe pouvant créer des Transactions qui sera utilisée par l'API de transactions d'Hibernate.

Vous pourrez trouver plus de détails à cette adresse
  • Partager sur Facebook
  • Partager sur Twitter
18 mars 2011 à 19:27:39

Mapping d'une classe persistance


Les fichiers de mapping permettent de relier une classe pojo java à sa table correspondante en base de donnée. la classe que l'on souhaite persister doit respecter les règles suivante:
  • Les attributs doivent posseder des getters et des setters
  • La classe doit implémenter le constructeur par defaut
  • L'identifiant de la classe doit être de type primitif, wrapper de type primitf, String ou java.util.Date


Les fichiers de mapping ont pour extension .hbm.xml
Exemple : si on souhaite mapper la classe suivante
Personne
-id
-Nom
-Prenom


Solution : personne.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.sdz">
  <class name="Personne" table="personne">
    <id name="id" type="string" unsaved-value="null">
      <column name="id" not-null="true" sql-type="char(32)"/>
      <generator class="uuid.hex"/>
    </id>
    <property column="nom" name="nom"/>
    <property column="prenom" name="prenom"/>
  </class>
</hibernate-mapping>


Ici, l'id est une chaine de caractère qui se génère toute seule grâce à l'algorithme de random de la classe uuid. la chaine aura pour longueur 32 caractères.
Ce fichier permet de relier la table "personne" en base de donnée au pojo correspondant.
  • Partager sur Facebook
  • Partager sur Twitter
J'ai tous les badges d'OpenClassrooms.