Précédent   Forum des professionnels en informatique > Java > Général Java > APIs
APIs Forum sur les API standard et API complémentaires. Avant de poster -> FAQ Java, Les meilleures API Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 20/06/2006, 13h50   #1 (permalink)
Membre du Club
 
Avatar de dedeloux
 
Date d'inscription: juillet 2005
Localisation: Paris
Messages: 106
Envoyer un message via MSN à dedeloux
Par défaut Connexion Java / LDAP

Bonjour,

J'ai réalisé une application en java / J2EE. Je souhaiterais maintenant connecter cette application à un annuaire LDAP (Novell) en utilisant la librairie JNDI. J'aurais aimé avoir des explications concernant le fonctionnement de cette librairie.
Est ce que j'ai besoin de configurer quelque chose pour m'en servir (je sais qu'elle est fournie avec le SDK à partir de la version 1.3 mais y a t-il autre chose que je dois savoir comme des variables à déclarer ou autre) ?
Est ce que quelqu'un aurait un exemple simple sur lequel je pourrais m'appuyer ? Je souhaite juste me connecter et consulter des données (pas d'ajout ou de modification)
Ensuite, je ne sais du tout dans quelle partie de mon application je dois faire ma connexion (dans la partie métier, data, domain ???)
Enfin voilà, je ne sais pas par ou commencer. J'ai lu pas mal de documentation sur le net et sur developpez mais je n'ai pas trouver quelque chose qui m'éclaire suffissament (ou du moins je crois que je n'ai pas trop compris).
Si quelqu'un peut me guider pas à pas dans cette démarche, ça serait très gentil.

Toute aide sera la bienvenue !!! Merci.
dedeloux est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/06/2006, 11h42   #2 (permalink)
Membre du Club
 
Avatar de delas
 
Date d'inscription: avril 2004
Localisation: Nice
Messages: 100
Par défaut

Salut, tu utilises quel serveur d'application?

ta connexion au ldap se fait sur ton serveur.

sinon j'ai fait ca, si ca peut t'inspirer.... :
Code :
 
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
 
import javax.naming.ldap.Control;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
 
 
	public LDAPConnexion() throws Exception{
		//FileInputStream in = (FileInputStream) getClass().getResourceAsStream("/LDAP.properties"); 
		in = getClass().getResourceAsStream("LDAP.properties");
		init();
	}
 
 
 
	public LDAPConnexion(FileInputStream in) throws Exception{
		this.in = in; 
		init();
	}
	
	private void init() throws Exception{
		Properties env = new Properties();
		env.load(in);
		in.close();
		filtreUsr = env.getProperty("filtreUsr");
		filtreGroups = env.getProperty("filtreGroups");
		groupeGestion = env.getProperty("groupeGestion");
		ctx = new InitialDirContext(env);
		ctls = new SearchControls();
		ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
	}
 
	public static void main(String[] args) {
 
		LDAPConnexion application = null;
		try{
			application = new LDAPConnexion();
		}catch (Exception e) {
				e.printStackTrace();
		}
		Attributes a = application.getAttributes("monuser");
		application.printAll(a);
}
 
	private Attributes getAttributes(String login){
		NamingEnumeration namingEnumeration = getNamingEnumeration("SAMAccountName="+login,"ou="+filtreUsr);
	//	NamingEnumeration namingEnumeration = getNamingEnumeration("SAMAccountName="+login,"ou=Banking_Users");
		if (namingEnumeration == null){
			return null;
		}else{
			try{
				if (! namingEnumeration.hasMore()){
	//				System.out.println("! namingEnumeration.hasMoreElements()");
				}
			}catch(Exception e){
				e.printStackTrace();
				return null;
			}
		}
		SearchResult searchResult = (SearchResult) namingEnumeration.nextElement();
		if (searchResult == null){
			return null;
		}
		return searchResult.getAttributes();//+filtreUsr
	}
 
}
	private void printAll(Attributes usr){
		Enumeration e = usr.getAll();
		while (e.hasMoreElements()) {
			String element = e.nextElement().toString();
		}
	}
}
 
 
voilou... n'hesite pas a me demander si t'as des soucis...
delas est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/06/2006, 13h26   #3 (permalink)
Membre du Club
 
Avatar de dedeloux
 
Date d'inscription: juillet 2005
Localisation: Paris
Messages: 106
Envoyer un message via MSN à dedeloux
Par défaut

Bonjour,
merci de ta réponse !!!

En ce qui concerne le serveur d'application j'utilise Tomcat.
Je ne souhaite faire ma connexion sur mon serveur mais plutot l'initialiser dans mon appli un peu comme une connexion à Oracle. Est ce que c'est possible de faire ça ?
Code :
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="${jndi.jdbc.egesco}" />
	</bean>
Bien sur je précise aussi l'url, le user et le mot de passe. Qu'est ce que tu en penses ?

Admettons que je fais comme ça pour ma connexion et que ça marche . Qu'est ce que je dois faire ensuite ? Est ce que je peux ajouter une requete dans une classe déjà existante en important les classes jndi ?
Pour l'instant j'ai cette classe là :
Code :
 
public class JdbcLdapUserDao extends JdbcDaoSupport implements LdapUserDao {
 
 private static final String BASE_SQL_LIST_LDAPUSERS_QUERY = "SELECT cn, lastname, firstname FROM t_adm_ldap WHERE cn NOT IN (SELECT cn FROM t_adm_utilisateur)ORDER BY cn";
private static class LdapUserRowMapper implements RowMapper{
public Object mapRow(ResultSet pResultSet, int pRowNum) throws SQLException {
			
			LdapUser ldapUser = new LdapUser();
			ldapUser.setCommonName(pResultSet.getString("cn"));
			ldapUser.setLastName(pResultSet.getString("lastname"));
			ldapUser.setFirstName(pResultSet.getString("firstname"));
			
			return ldapUser;
		}
public JdbcLdapUserDao() {
        super();
    }
public List listLdapUser() {
		List ldapUsers = null;
		ldapUsers = JdbcDaoUtils.listObjects(getJdbcTemplate(),BASE_SQL_LIST_LDAPUSERS_QUERY, null,new LdapUserRowMapper());
		return ldapUsers;
	}
}
 
Bon pour l'instant je vais chercher mes user dans une base oracle mais je veux maintenant aller les chercher dans mon annuaire .
Est ce que tu pourrais me dire ce que je dois modifier ou comment je dois m'y prendre .

Merci pour ta patience !!!
dedeloux est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/06/2006, 14h29   #4 (permalink)
Membre du Club
 
Avatar de delas
 
Date d'inscription: avril 2004
Localisation: Nice
Messages: 100
Par défaut

tu peux faire une connexion a ton ldap pour recuperer des données sur une personne.

c'est ce que je fais dans mon init :
Code :
	private void init() throws Exception{
		Properties env = new Properties();
		env.load(in);
		in.close();
		filtreUsr = env.getProperty("filtreUsr");
		filtreGroups = env.getProperty("filtreGroups");
		groupeGestion = env.getProperty("groupeGestion");
		ctx = new InitialDirContext(env);		ctls = new SearchControls();
		ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
	}
mais je ne penses pas que tu puisse recuperer le user et pwd pour connecter un gars...
delas est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/06/2006, 14h34   #5 (permalink)
Futur Membre du Club
 
Date d'inscription: janvier 2005
Localisation: France - Paris
Âge: 28
Messages: 38
Envoyer un message via MSN à BriceTheNice
Par défaut

Moi j'ai un peu exemple de gestion en java du LDAP active directory si ca peut aider:

Code :
 
// ADConnection - A Java class that encapsulates a JNDI connection to 
// an Active Directory
//
// Written by Jeremy E. Mortis  mortis@ucalgary.ca  2002-07-03 
//
// Note that password changes require an SSL connection to the Active Directory,
// but other types of calls do not.
//
// To set up the SSL connection, check out:
//    http://java.sun.com/j2se/1.3/docs/tooldocs/win32/keytool.html
//    http://www.microsoft.com/windows2000/techinfo/planning/security/casetupsteps.asp
 
package it.service;
 
import javax.swing.*;
import java.awt.*;
import javax.naming.*;
import javax.naming.directory.*;
import javax.naming.ldap.*;
import java.util.*;
import java.security.*;
 
public class ADConnection {
 
  DirContext ldapContext;
  String baseName = ",cn=users,DC=activedirectory,DC=myorg,DC=ca";
  String serverIP = "activedirectory.myorg.ca";
  String modelUsername = "template";
 
  public ADConnection() {
    try {
      Hashtable ldapEnv = new Hashtable(11);
      ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
      ldapEnv.put(Context.PROVIDER_URL,  "ldap://" + serverIP + ":636");
      ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
      ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=ldapadmin" + baseName);
      ldapEnv.put(Context.SECURITY_CREDENTIALS, "xxxx");
      ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
      ldapContext = new InitialDirContext(ldapEnv);
      }
      catch (Exception e) {
        System.out.println(" bind error: " + e);
        e.printStackTrace();
        System.exit(-1);
     }
  }
 
  public void createNew(String username, String surname, String givenName) {
    try {
      String distinguishedName = "cn=" + username + baseName;
      Attributes newAttributes = new BasicAttributes(true);
      Attribute oc = new BasicAttribute("objectclass");
      oc.add("top");
      oc.add("person");
      oc.add("organizationalperson");
      oc.add("user");
      newAttributes.put(oc);
      newAttributes.put(new BasicAttribute("sAMAccountName", username));
      newAttributes.put(new BasicAttribute("userPrincipalName", username + "@" + serverIP));
      newAttributes.put(new BasicAttribute("cn", username));
      newAttributes.put(new BasicAttribute("sn", surname));
      newAttributes.put(new BasicAttribute("givenName", givenName));
      newAttributes.put(new BasicAttribute("displayName", givenName + " " + surname));
      System.out.println("Name: " + name + " Attributes: " + a);
      ldapContext.createSubcontext(distinguishedName, newAttributes);
    }
    catch (Exception e) {
      System.out.println("create error: " + e);
      e.printStackTrace();
      System.exit(-1);
    }
  }
 
  public void createClone(String username, String surname, String givenName) {
    try {
      Attributes modelAttributes = fetch(modelUsername);
      String distinguishedName = "cn=" + username + baseName;
      Attributes newAttributes = new BasicAttributes(true);
      newAttributes.put(modelAttributes.get("objectclass"));
      newAttributes.put(modelAttributes.get("userAccountControl"));
      newAttributes.put(new BasicAttribute("sAMAccountName", username));
      newAttributes.put(new BasicAttribute("userPrincipalName", username + "@" + serverIP));
      newAttributes.put(new BasicAttribute("cn", username));
      newAttributes.put(new BasicAttribute("sn", surname));
      newAttributes.put(new BasicAttribute("givenName", givenName));
      newAttributes.put(new BasicAttribute("displayName", givenName + " " + surname));
      System.out.println("distinguishedName: " + distinguishedName + " Attributes: " + newAttributes);
      ldapContext.createSubcontext(distinguishedName, newAttributes);
    }
    catch (Exception e) {
      System.out.println("create clone error: " + e);
      e.printStackTrace();
      System.exit(-1);
    }
  }
 
  public void update(String username) {
    try {
      System.out.println("updating...\n");
      ModificationItem[] mods = new ModificationItem[1];
      mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
        new BasicAttribute("description", "java y"));
      ldapContext.modifyAttributes("cn=" + username + baseName, mods);
     }
      catch (Exception e) {
        System.out.println(" update error: " + e);
        System.exit(-1);
      }
  }
 
 
  public void updatePassword(String username, String password) {
    try {
      System.out.println("updating password...\n");
      String quotedPassword = "\"" + password + "\"";
      char unicodePwd[] = quotedPassword.toCharArray();
      byte pwdArray[] = new byte[unicodePwd.length * 2];
      for (int i=0; i<unicodePwd.length; i++) {
        pwdArray[i*2 + 1] = (byte) (unicodePwd[i] >>> 8);
        pwdArray[i*2 + 0] = (byte) (unicodePwd[i] & 0xff);
      }
      System.out.print("encoded password: ");
      for (int i=0; i<pwdArray.length; i++) {
        System.out.print(pwdArray[i] + " ");
      }
      System.out.println();
      ModificationItem[] mods = new ModificationItem[1];
      mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
        new BasicAttribute("UnicodePwd", pwdArray));
      ldapContext.modifyAttributes("cn=" + username + baseName, mods);
     }
      catch (Exception e) {
        System.out.println("update password error: " + e);
        System.exit(-1);
      }
  }
 
  public Attributes fetch(String username) {
    Attributes attributes = null;
    try {
      System.out.println("fetching: " + username);
      DirContext o = (DirContext)ldapContext.lookup("cn=" + username + baseName);
      System.out.println("search done\n");
      attributes = o.getAttributes("");
      for (NamingEnumeration ae = attributes.getAll(); ae.hasMoreElements();) {
        Attribute attr = (Attribute)ae.next();
        String attrId = attr.getID();
        for (NamingEnumeration vals = attr.getAll(); vals.hasMore();) {
          String thing = vals.next().toString();
          System.out.println(attrId + ": " + thing);
        }
      }
    }
    catch (Exception e) {
      System.out.println(" fetch error: " + e);
      System.exit(-1);
    }
    return attributes;
  }
 
  public static void main(String[] args) {
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    // the keystore that holds trusted root certificates
    System.setProperty("javax.net.ssl.trustStore", "e:\\ldap\\keystore");
    System.setProperty("javax.net.debug", "all");
    ADConnection adc = new ADConnection();
    adc.createClone("clone1", "Clone", "Clarissa");
    adc.updatePassword("clone1", "xxxx");
    adc.createNew("user1, "User", "Joe");
    Attributes a = adc.fetch("clone1");
  }
BriceTheNice est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/06/2006, 13h44   #6 (permalink)
Futur Membre du Club
 
Date d'inscription: janvier 2005
Localisation: France - Paris
Âge: 28
Messages: 38
Envoyer un message via MSN à BriceTheNice
Par défaut

Le mieux qu'en tu utilise OpenLDAP ou novell c'est d'utilisé la libraire jldap de novel, elle marche trés bien avec OpenLDAP

tu trouvera la librairie ici: http://developer.novell.com/wiki/index.php/Jldap

et des exemple d'utilisation ici: http://www.openldap.org/jldap/overview.html
BriceTheNice est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/06/2006, 15h23   #7 (permalink)
Membre du Club
 
Avatar de dedeloux
 
Date d'inscription: juillet 2005
Localisation: Paris
Messages: 106
Envoyer un message via MSN à dedeloux
Par défaut

OK !!
Merci pour vos réponses, je vais me renseigner sur jldap et je vous tiens au courant.
dedeloux est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/01/2008, 15h11   #8 (permalink)
Membre régulier
 
Avatar de silverfab34
 
Date d'inscription: mars 2006
Âge: 29
Messages: 128
Par défaut

Citation:
Envoyé par BriceTheNice Voir le message
Moi j'ai un peu exemple de gestion en java du LDAP active directory si ca peut aider:

Code :
 
// ADConnection - A Java class that encapsulates a JNDI connection to 
// an Active Directory
//
// Written by Jeremy E. Mortis  mortis@ucalgary.ca  2002-07-03 
//
// Note that password changes require an SSL connection to the Active Directory,
// but other types of calls do not.
//
// To set up the SSL connection, check out:
//    http://java.sun.com/j2se/1.3/docs/tooldocs/win32/keytool.html
//    http://www.microsoft.com/windows2000/techinfo/planning/security/casetupsteps.asp
 
package it.service;
 
import javax.swing.*;
import java.awt.*;
import javax.naming.*;
import javax.naming.directory.*;
import javax.naming.ldap.*;
import java.util.*;
import java.security.*;
 
public class ADConnection {
 
  DirContext ldapContext;
  String baseName = ",cn=users,DC=activedirectory,DC=myorg,DC=ca";
  String serverIP = "activedirectory.myorg.ca";
  String modelUsername = "template";
 
  public ADConnection() {
    try {
      Hashtable ldapEnv = new Hashtable(11);
      ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
      ldapEnv.put(Context.PROVIDER_URL,  "ldap://" + serverIP + ":636");
      ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
      ldapEnv.put(Context.SECURITY_PRINCIPAL, "cn=ldapadmin" + baseName);
      ldapEnv.put(Context.SECURITY_CREDENTIALS, "xxxx");
      ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl");
      ldapContext = new InitialDirContext(ldapEnv);
      }
      catch (Exception e) {
        System.out.println(" bind error: " + e);
        e.printStackTrace();
        System.exit(-1);
     }
  }
 
  public void createNew(String username, String surname, String givenName) {
    try {
      String distinguishedName = "cn=" + username + baseName;
      Attributes newAttributes = new BasicAttributes(true);
      Attribute oc = new BasicAttribute("objectclass");
      oc.add("top");
      oc.add("person");
      oc.add("organizationalperson");
      oc.add("user");
      newAttributes.put(oc);
      newAttributes.put(new BasicAttribute("sAMAccountName", username));
      newAttributes.put(new BasicAttribute("userPrincipalName", username + "@" + serverIP));
      newAttributes.put(new BasicAttribute("cn", username));
      newAttributes.put(new BasicAttribute("sn", surname));
      newAttributes.put(new BasicAttribute("givenName", givenName));
      newAttributes.put(new BasicAttribute("displayName", givenName + " " + surname));
      System.out.println("Name: " + name + " Attributes: " + a);
      ldapContext.createSubcontext(distinguishedName, newAttributes);
    }
    catch (Exception e) {
      System.out.println("create error: " + e);
      e.printStackTrace();
      System.exit(-1);
    }
  }
 
  public void createClone(String username, String surname, String givenName) {
    try {
      Attributes modelAttributes = fetch(modelUsername);
      String distinguishedName = "cn=" + username + baseName;
      Attributes newAttributes = new BasicAttributes(true);
      newAttributes.put(modelAttributes.get("objectclass"));
      newAttributes.put(modelAttributes.get("userAccountControl"));
      newAttributes.put(new BasicAttribute("sAMAccountName", username));
      newAttributes.put(new BasicAttribute("userPrincipalName", username + "@" + serverIP));
      newAttributes.put(new BasicAttribute("cn", username));
      newAttributes.put(new BasicAttribute("sn", surname));
      newAttributes.put(new BasicAttribute("givenName", givenName));
      newAttributes.put(new BasicAttribute("displayName", givenName + " " + surname));
      System.out.println("distinguishedName: " + distinguishedName + " Attributes: " + newAttributes);
      ldapContext.createSubcontext(distinguishedName, newAttributes);
    }
    catch (Exception e) {
      System.out.println("create clone error: " + e);
      e.printStackTrace();
      System.exit(-1);
    }
  }
 
  public void update(String username) {
    try {
      System.out.println("updating...\n");
      ModificationItem[] mods = new ModificationItem[1];
      mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
        new BasicAttribute("description", "java y"));
      ldapContext.modifyAttributes("cn=" + username + baseName, mods);
     }
      catch (Exception e) {
        System.out.println(" update error: " + e);
        System.exit(-1);
      }
  }
 
 
  public void updatePassword(String username, String password) {
    try {
      System.out.println("updating password...\n");
      String quotedPassword = "\"" + password + "\"";
      char unicodePwd[] = quotedPassword.toCharArray();
      byte pwdArray[] = new byte[unicodePwd.length * 2];
      for (int i=0; i<unicodePwd.length; i++) {
        pwdArray[i*2 + 1] = (byte) (unicodePwd[i] >>> 8);
        pwdArray[i*2 + 0] = (byte) (unicodePwd[i] & 0xff);
      }
      System.out.print("encoded password: ");
      for (int i=0; i<pwdArray.length; i++) {
        System.out.print(pwdArray[i] + " ");
      }
      System.out.println();
      ModificationItem[] mods = new ModificationItem[1];
      mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE,
        new BasicAttribute("UnicodePwd", pwdArray));
      ldapContext.modifyAttributes("cn=" + username + baseName, mods);
     }
      catch (Exception e) {
        System.out.println("update password error: " + e);
        System.exit(-1);
      }
  }
 
  public Attributes fetch(String username) {
    Attributes attributes = null;
    try {
      System.out.println("fetching: " + username);
      DirContext o = (DirContext)ldapContext.lookup("cn=" + username + baseName);
      System.out.println("search done\n");
      attributes = o.getAttributes("");
      for (NamingEnumeration ae = attributes.getAll(); ae.hasMoreElements();) {
        Attribute attr = (Attribute)ae.next();
        String attrId = attr.getID();
        for (NamingEnumeration vals = attr.getAll(); vals.hasMore();) {
          String thing = vals.next().toString();
          System.out.println(attrId + ": " + thing);
        }
      }
    }
    catch (Exception e) {
      System.out.println(" fetch error: " + e);
      System.exit(-1);
    }
    return attributes;
  }
 
  public static void main(String[] args) {
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    // the keystore that holds trusted root certificates
    System.setProperty("javax.net.ssl.trustStore", "e:\\ldap\\keystore");
    System.setProperty("javax.net.debug", "all");
    ADConnection adc = new ADConnection();
    adc.createClone("clone1", "Clone", "Clarissa");
    adc.updatePassword("clone1", "xxxx");
    adc.createNew("user1, "User", "Joe");
    Attributes a = adc.fetch("clone1");
  }

Bonjour,
J'ai vu cotre code et il est tres interessant !
Par contre, j'ai une question (je debute en LDAP et jndi)........si avant des creer un utilisateur, on veut verifier qu'il n'existe pas deja dans l'annuaire, comment fais ton ?
Merci pour votre aide !
silverfab34 est déconnecté   Envoyer un message privé Réponse avec citation
NEWS JAVAFAQs JAVATUTORIELS JAVAJAVASEARCHSOURCESLIVRESOUTILS, EDI & APIBLOGDISCUSSIONSTV

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Java > Général Java > APIs



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 17h07.


Vos questions techniques : forum d'entraide Java - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.