IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Servlets/JSP Java Discussion :

Plusieurs problèmes avec base de données


Sujet :

Servlets/JSP Java

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Par défaut Plusieurs problèmes avec base de données
    Bonjour, je dois développer un projet web pour un organisme. Etant débutant, cela est d'autant plus difficile que je dois me former en même temps. J'ai donc une classe chargée de récupérer la liste des stagiaires présents actuellement dans l'organisme à partir d'une base mysql:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    package app;
    import java.sql.*;
     
    public class Stagiaire {
     
    	public Stagiaire(int pid) {
     
    		try {
    			this.database = new Database("localhost","root","","base");
    			Connection connexion = this.database.connect();
    			this.query = connexion.createStatement();
    			this.query.executeQuery("SELECT nom, prenom, datenaissance FROM stagiaire WHERE id = "+pid);
    			ResultSet datas = this.query.getResultSet();
    			if(datas == null) throw new SQLException("Pas de stagiaire correspondant");
    			else {
    				this.id = pid;
    				this.nom = datas.getString(1);
    				this.prenom = datas.getString(2);
    				this.date = datas.getString(3);
    			}
    		}
     
    		catch(ClassNotFoundException e) {
    			System.out.println(e.getMessage());
    		}
     
    		catch(SQLException e) {
    			System.out.println("Erreur: le stagiaire id "+pid+" n'existe pas");
    		}
    	}
     
    	public static Stagiaire [] getList() {
     
    		Stagiaire StagiaireList[] = {null};
    		int i = 0;
     
    		try {
    			Database db = new Database("localhost","root","","base");
    			Connection conn = db.connect();
    			Statement statement = conn.createStatement();
    			statement.executeQuery("SELECT id, nom, prenom, datenaissance FROM stagiaire ORDER BY nom");
    			ResultSet datas = statement.getResultSet();
    			while(datas.next()) {
    				StagiaireList[i++] = new Stagiaire(datas.getInt(1));
    			}
    		}
     
    		catch(ClassNotFoundException e) {
    			System.out.println(e.getMessage());
    		}
     
    		catch(SQLException e) {
    			System.out.println(e.getMessage());
    		}
     
    		return StagiaireList;
    	}
     
    	public int getID() {return this.id;}
    	public String getNom() {return this.nom;}
    	public String getPrenom() {return this.prenom;}
    	public String getDate() {return this.date;}
     
    	private int id;
    	private String nom;
    	private String prenom;
    	private String date;
    	private Database database;
    	private Statement query;
    }
    et une jsp chargée de communiquer avec cette classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@page import="app.*"%>
    <%@page import="java.sql.*"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Administration</title>
    </head>
    <body>
    	<%
            String action = request.getParameter("action");
            if(action != null && action.equals("view")) {
                    int id = Integer.parseInt(request.getParameter("id"));
     
                    Stagiaire stagiaire = new Stagiaire(id);
                    %>
    		Nom: <%= stagiaire.getNom() %>
    		<br />
    		Prénom: <%= stagiaire.getPrenom() %>
    		<%
            
            }
            
            else {
                    Stagiaire [] liste = Stagiaire.getList();
                    if(liste == null) out.println("Aucun stagiaire dans la base de données");
                    else {
                            %>
    			<table class="listeStagiaire" align="center" cellpadding="5" cellspacing="1">
    				<tr>
    					<th class="listeStagiaire" align="center">
    						NOM
    					</th>
    					<th class="listeStagiaire" align="center">
    						PRENOM
    					</th>
    					<th class="listeStagiaire" align="center">
    						DATE
    					</th>
    				</tr>
    			<%
                            
                            for(Stagiaire s : liste) {
                                    if(s != null) {
                                    %>
    				<tr>
    					<td class="listeStagiaire">
    						<%= s.getNom() %>
    					</td>
    					<td class="listeStagiaire">
    						<%= s.getPrenom() %>
    					</td>
    					<td class="listeStagiaire">
    						<%= s.getDate() %>
    					</td>
    				</tr>
    				<%
                                    }
                            }
                            
                            out.println("</table>");
                    }
            }
            
     
            %>
     
    </body>
    </html>
    A l'exécution de cette dernière, le serveur JBoss me renvoit une erreur concernant un débordement de tableau dans la classe ci-dessus à la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StagiaireList[i++] = new Stagiaire(datas.getInt(1));
    Je ne comprend pas comment il peut y avoir ce débordement. Je sais également qu'il peut y avoir pas mal d'autres erreurs dans mon code. Pouvez vous m'aider svp? Merci.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Hello !

    Très simple : tu n'as pas initialisé la taille de ton tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Stagiaire StagiaireList[] = {null};
    StagiaireList[1] = ... <= pas bon
    Le problème est que tu ne peux pas connaître le nombre de lignes retournées par un ResultSet à l'avance.

    Je te conseilles de passer plutôt par une Collection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    java.util.Collection<Stagiaire> stagiaireList = new java.util.LinkedHashSet<Stagiaire>();
     
    while(datas.next()) 
        stagiaireList.add(new Stagiaire(datas.getInt(1)));

  3. #3
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Tu devrais jeter un oeil à la FAQ pour voir comment instancier un tableau.

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Par défaut
    Merci, j'ai eu un peu de mal à comprendre le principe de fonctionnement des collections mais ça va mieux avec ça. En revanche j'ai toujours des problèmes côté SQL, je traite les exceptions mais le message renvoyé par celles ci se traduit pas "null", ça m'aide pas beaucoup...

    11:02:12,574 INFO [STDOUT] Erreur SQL: null
    11:02:12,945 INFO [STDOUT] Erreur SQL: null
    11:02:13,385 INFO [STDOUT] Erreur SQL: null
    Ma page web:



    Il ne s'agit d'un quelconque problème de mauvais identifiants ou de mauvais paramètres de base: ceci à été vérifié plusieurs fois et la requête qui provient d'un projet en php fonctionnait parfaitement avant...

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Voilà perso comment je le ferai :

    Stagiaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public class Stagiaire
    {
    	private Integer id;
    	private String nom;
    	private String prenom;
     
    	public Stagiaire() {}
     
    	public int getId() {
    		return id;
    	}
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
    	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;
    	}
    }
    StagiaireDAO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    public class StagiaireDAO
    {
    	public static Stagiaire find(int pid)
    	{	
    		Stagiaire stagiaire = null;
    		Connection conn = null;
    		PreparedStatement stmt = null;
    		ResultSet rs = null;
    		try {
    			// conn = <= obtention de la connexion
    			stmt = conn.prepareStatement("SELECT id, nom, prenom FROM stagiaire WHERE id = ?");
    			stmt.setInt(1, pid);
    			stmt.executeQuery();
    			rs = stmt.getResultSet();
    			if (rs.next()) {
    				stagiaire = new Stagiaire();
    				stagiaire.setId(rs.getInt("id"));
    				stagiaire.setNom(rs.getString("nom"));
    				stagiaire.setPrenom(rs.getString("prenom"));
    			}
    		}
    		catch(SQLException e) {
    			e.printStackTrace();
    		}
    		finally
    		{
    			if (rs != null)
    				try{rs.close();}catch (SQLException e){}
    			if (stmt != null)
    				try{stmt.close();}catch (SQLException e){}
    			if (conn != null)
    				try{conn.close();}catch (SQLException e){}
    		}
    		return stagiaire;
    	}
     
    	public static Collection<Stagiaire> find()
    	{	
    		Collection<Stagiaire> stagiaires = new LinkedHashSet<Stagiaire>();
    		Connection conn = null;
    		Statement stmt = null;
    		ResultSet rs = null;
    		try {
    			// conn = <= obtention de la connexion
    			stmt = conn.createStatement();
    			stmt.executeQuery("SELECT id, nom, prenom FROM stagiaire ORDER BY nom");
    			rs = stmt.getResultSet();
    			while(rs.next()) {
    				Stagiaire stagiaire = new Stagiaire();
    				stagiaire.setId(rs.getInt("id"));
    				stagiaire.setNom(rs.getString("nom"));
    				stagiaire.setPrenom(rs.getString("prenom"));
    			}
    		}
    		catch(SQLException e) {
    			e.printStackTrace();
    		}
    		finally
    		{
    			if (rs != null)
    				try{rs.close();}catch (SQLException e){}
    			if (stmt != null)
    				try{stmt.close();}catch (SQLException e){}
    			if (conn != null)
    				try{conn.close();}catch (SQLException e){}
    		}
    		return stagiaires;
    	}
    }
    Si tu as des questions, n'hésites-pas !

  6. #6
    Expert confirmé

    Femme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Par défaut
    Dans le while, il manque l'ajout de l'instance de stagiaire dans la collection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stagiaires.add(stagiaire) ;

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Oups

    Merci c_navy !

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Par défaut
    Merci à vous de m'aider, ça fonctionne déjà beaucoup mieux comme cela . Voici ma nouvelle classe (je dois laisser la méthode statique dans la classe "Stagiaire" car on me l'a imposé):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    package app;
    import java.sql.*;
    import java.util.*;
     
    public class Stagiaire {
     
    	public Stagiaire(int pid) {
     
    		this.database = new Database("localhost","root","","base");
    		Connection connexion = this.database.connect();
    		try {
    			String sql = "SELECT nom, prenom, datenaissance FROM stagiaire WHERE id = ?";
    			query = connexion.prepareStatement(sql);
    			query.setInt(1, pid);
    			query.executeQuery();
    			System.out.println(query.getWarnings());
    			ResultSet datas = query.getResultSet();
    			if(datas == null) throw new SQLException("Pas de stagiaire correspondant");
    			else {
    				this.id = pid;
    				this.nom = datas.getString(1);
    				this.prenom = datas.getString(2);
    				this.date = datas.getString(3);
    			}
    		}
     
    		catch(SQLException sqle) {sqle.printStackTrace();}	
    		catch(Exception e) {e.printStackTrace();}
    	}
     
    	public Stagiaire() {}
     
    	public static Collection<Stagiaire> getList() {
     
    		Collection<Stagiaire> stagiaires = new LinkedHashSet <Stagiaire> ();
     
    		Database db = new Database("localhost","root","","base");
    		Connection conn = db.connect();
    		Statement query = null;
    		ResultSet datas = null;
    		try {
    			query = conn.createStatement();
    			query.executeQuery("SELECT id, nom, prenom, datenaissance FROM stagiaire ORDER BY nom");
    			datas = query.getResultSet();
    			while(datas.next()) {
    				Stagiaire stagiaire = new Stagiaire();
    				stagiaire.setID(datas.getInt(1));
    				stagiaire.setNom(datas.getString(2));
    				stagiaire.setPrenom(datas.getString(3));
    				stagiaire.setDate(datas.getString(4));
    				stagiaires.add(stagiaire);
    			}
    		}
     
    		catch (SQLException sqle) {sqle.printStackTrace();}		
    		catch (Exception e) {e.printStackTrace();}
     
    		finally {
    			if(datas != null) {
    				try {datas.close();}
    				catch (SQLException e) {e.printStackTrace();}
    			}
    			if(query != null) {
    				try {query.close();}
    				catch (SQLException e) {e.printStackTrace();}
    			}
    			if(conn != null) {
    				try {conn.close();}
    				catch (SQLException e) {e.printStackTrace();}
    			}
    		}
     
    		return stagiaires;
    	}
     
    	public int getID() {return this.id;}
    	public String getNom() {return this.nom;}
    	public String getPrenom() {return this.prenom;}
    	public String getDate() {return this.date;}
     
    	public void setID(int id) {this.id = id;}
    	public void setNom(String nom) {this.nom = nom;}
    	public void setPrenom(String prenom) {this.prenom = prenom;}
    	public void setDate(String date) {this.date = date;}
     
    	private int id;
    	private String nom;
    	private String prenom;
    	private String date;
    	private Database database;
    	private PreparedStatement query;
    }
    Il me reste cependant un petit soucis: seul le premier enregistrement est affiché sur ma page web. Je pense qu'il s'agit cette fois ci de la boucle présente dans ma jsp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Collection<Stagiaire> StagiaireList = Stagiaire.getList();
    		Iterator <Stagiaire> iterator = StagiaireList.iterator();
    		if(iterator != null) {
    			%>
    			<table class="listeStagiaire" align="center" cellpadding="5" cellspacing="1">
    				<tr>
    					<th class="listeStagiaire" align="center">
    						NOM
    					</th>
    					<th class="listeStagiaire" align="center">
    						PRENOM
    					</th>
    					<th class="listeStagiaire" align="center">
    						DATE
    					</th>
    				</tr>
    			<%
                            
                            while(iterator.hasNext()) {
                                    %>
    				<tr>
    					<td class="listeStagiaire">
    						<%= iterator.next().getNom() %>
    					</td>
    					<td class="listeStagiaire">
    						<%= iterator.next().getPrenom() %>
    					</td>
    					<td class="listeStagiaire">
    						<%= iterator.next().getDate() %>
    					</td>
    				</tr>
    				<%
                            }
                            
                            %> 
                            </table>

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    A chaque fois que tu fais iterator.next() tu passes au stagiaire suivant.

    Voici comment s'utilise un iterateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Iterator<Stagiaire> it=stagiaire.getList().iterator();
    while (it.hasNext();)
    {
        Stagiaire stagiaire = it.next();
        // ...
    }
    Par ailleurs, essaie de créer une classe à part pour accéder aux données plutôt que d'inclure les mécanismes techniques de lecture/écriture en base de donnée directement dans tes objets métier (Stagiaire).

    C'est un des grands principe objet (DIP) qui te permettera de gagner en maintenabilité et en évolutivité.

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    219
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 219
    Par défaut
    C'est tout à fait la réponse au problème! Merci énormément, j'apprend beaucoup de choses.

    PS: selon le mécanisme "DIP", ma classe "Stagiaire" devrait implémenter une interface s'occupant des traitements de la base de données?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Tu as deux possibilités :

    - tu conserves les actions dans ta classe Stagiaire mais tu passes par une interface pour appeller le framework technique d'acccès aux données.

    ou :

    - tu délègue les actions CRUD (Create/Read/Update/Delete) des objets métier à une autre classe
    (ex: ObjetMétierStagiaire <=> DAOStagiaire).

    Je préfère la deuxième solution, et plus précisément l'utilisation du Pattern DAO (Data Access Object), mais après c'est à toi de voir...

Discussions similaires

  1. Problème avec base de données oracle
    Par jonnyboy dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 16/02/2010, 12h10
  2. problème avec base de données attachée
    Par mo5andes dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/11/2009, 15h26
  3. Réponses: 1
    Dernier message: 19/02/2008, 23h05
  4. svp problème avec base de données
    Par midosone dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 26/03/2007, 10h45
  5. [MySQL] Problème avec base de données
    Par ThAOTh dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/08/2006, 13h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo