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

JDBC Java Discussion :

JDBC et SQL requête UPATE en erreur sous Tomcat


Sujet :

JDBC Java

  1. #1
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut JDBC et SQL requête UPATE en erreur sous Tomcat
    bonjour,

    je travail sur les requêtes SQL via jdbc, jusqu'a aujourd'hui j'ai réussis les requêtes suivantes : SELECT et INSERT, je cherche a faire une requête UPDATE,

    mais j'ai des problemes de convertions de la capture de la ligne dans une table assez simple. en faites depuis ma JSP ou s'affiche les champs de ma table avec l'index je veux pouvoir extraire le numéro de l'index depuis la JSP qui est une string est la convertir en integer pour faire ma requête update.

    voici ma méthode update :
    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
    public void miseajourUtilisateur(Utilisateur utilisateur, Up_noms request) {
     
            loadDatabase();
            int id = Integer.parseInt(request.getString("id"));
            utilisateur.setId(id);
                try {
     
                    PreparedStatement preparedStatement = connexion.prepareStatement("UPDATE noms SET nom = ?, prenom = ? WHERE id = ?");
     
                    preparedStatement.setString(1, utilisateur.getNom());
                    preparedStatement.setString(2, utilisateur.getPrenom());
                    preparedStatement.setInt(3, utilisateur.getId());
     
                    preparedStatement.executeUpdate();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
     
    /*  private String getString(String string) {
            // TODO Auto-generated method stub
            return getString("id");
        }*/
    extrait de 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
    <form method="post" action="db_update">
            <p>
                <label for="id">id : </label>
                <input type="text" name="id" id="id" />
            </p>
            <p>
                <label for="nom">Nom : </label>
                <input type="text" name="nom" id="nom" />
            </p>
            <p>
                <label for="prenom">Prénom : </label>
                <input type="text" name="prenom" id="prenom" />
            </p>
     
            <input type="submit" name="update" id="id"/>
        </form>
    je voudrais pouvoir extraire "id" de la JSP et la convertir en Integer.

    mais eclipse EE me renvoit une erreur sur "GetString" du code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int id = Integer.parseInt(request.getString("id"));
    auto completion me propose de ajouter si dessous cette fonction sur la quelle je suis en erreur et je ne sait quel type renvoyer : string ou integer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private String getString(String string) {
            // TODO Auto-generated method stub
            return getString("id");
        }
    que faut t'il faire ?

    cordialement

    philippe

    ps extrait de ma méthode DoPost de ma servlet

    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
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	    Utilisateur utilisateur = new Utilisateur();
     
    		//utilisateur.setid(request.hashCode(id));
     
     
    	    try {
    			utilisateur.setNom(request.getParameter("nom"));
    		} catch (BeanException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            utilisateur.setPrenom(request.getParameter("prenom"));
            Up_noms tableNoms = new Up_noms();
            tableNoms.miseajourUtilisateur(utilisateur, tableNoms);
            request.setAttribute("utilisateurs", tableNoms.recupererUtilisateurs());
            this.getServletContext().getRequestDispatcher("/WEB-INF/db_update.jsp").forward(request, response);
    	}

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Déjà, pourquoi récupérer un id depuis l'instance de Up_noms pour l'injecter dans l'instance de Utilisateur, ce que tu fais dans ces lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int id = Integer.parseInt(request.getString("id"));
            utilisateur.setId(id);
    Pour ensuite faire le paramètrage de la requête UPDATE à partir de l'id provenant de l'instance de Utilisateur ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preparedStatement.setInt(3, utilisateur.getId());
    au lieu de simplement affecter cette information directement dans la méthode doPost de la servlet (par utilisateur.setId( quelquechose )).

    Ensuite, qu'est-ce qui est censé affecter actuellement cet id dans l'instance de Up_noms dans la servlet (je ne vois aucun code qui pourrait le faire), sachant qu'à priori il s'agit d'un paramètre du post, donc normalement récupérable par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    String paramId = request.getParameter("id");
     
    /*... reste du code de ta servlet ...*/
    En faisant simplement comme ça, tu pourrais le passer directement à ton instance d'Utilisateur par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Utilisateur utilisateur = new Utilisateur();
     
    /** ... affectation nom et prénom ... **/
     
    utilisateur.setId( Integer.parseInt(paramId) );
    En conséquence, à priori, en faisant comme ça, ton instance de Up_noms ne servirait plus à rien dans miseajourUtilisateur().


    Remarque importante : il n'y a pas de libération de ressources dans miseajourUtilisateur(), en particulier sur le PreparedStatement (à voir comment tu gères exactement ta connexion et ce que fait loadDatabase()), qu'il faudrait fermer (toujours fermer Statement, PreparedStatement et/ou ResultSet dans le cas d'un SELECT (ça va fermer automatiquement le PreparedStatement qui l'a créé)).
    Au plus simple, pour faire ça, utiliser un try-with-resource (note bien les parenthèses) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try (PreparedStatement preparedStatement = connexion.prepareStatement("UPDATE noms SET nom = ?, prenom = ? WHERE id = ?")){
     
       preparedStatement.setString(1, utilisateur.getNom());
                    preparedStatement.setString(2, utilisateur.getPrenom());
                    preparedStatement.setInt(3, utilisateur.getId());
     
                    preparedStatement.executeUpdate();
     
    } catch(SQLException e) {
         // traiter l'erreur
    }
    (à la fin du try, la méthode close() de preparedStatement est appelée automatiquement).


    A part ça, à noter que le code suivant (qui ne servirait plus à rien si tu fais comme ci-dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private String getString(String string) {
            return getString("id");
        }
    te causerait une StackOverflowError (la méthode s'appelle elle-même "infiniment" sans condition d'arrêt).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    J'ai effectué les changement que tu m'as conseillé !
    j'ai une erreur sur : paramId
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utilisateur.setId(Integer.parsetInt(paramId);
    Je sais pas si c'est une bonne idée mais j'ai créé une java bean pour chaque requêtes, donc j'ai de la redondance de code,
    j'ai créé Up_noms qui est la copie conforme de Noms simplement pour distinger les requêtes.
    Mais d'après tes explications je mis prends mal, je complique trop mon code, je le reconnais !


    voici ce que je fait dans mon load database !
    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
    package com.boticiel.bdd;
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.PreparedStatement;
    import java.util.ArrayList;
    import java.util.List;
     
    import com.boticiel.forms.BeanException;
    import com.boticiel.forms.Utilisateur;
     
    public class Noms {
        private Connection connexion;
     
        public List<Utilisateur> recupererUtilisateurs() {
        	List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
            Statement statement = null;
            ResultSet resultat = null;
     
            loadDatabase();
            int id=0;
            try {
                statement = connexion.createStatement();
     
                // Exécution de la requête
                resultat = statement.executeQuery("SELECT id, nom, prenom FROM noms;");
     
                // Récupération des données
                while (resultat.next()) {
     
     
                    id = resultat.getInt("id");
     
                    String nom = resultat.getString("nom");
                    String prenom = resultat.getString("prenom");
     
                    Utilisateur utilisateur = new Utilisateur();
                    utilisateur.setId(id);
                    utilisateur.setNom(nom);
                    utilisateur.setPrenom(prenom);
     
                    utilisateurs.add(utilisateur);
                }
            } catch (SQLException | BeanException e) {
            } finally {
     
                // Fermeture de la connexion
                try {
                    if (resultat != null)
                        resultat.close();
                    if (statement != null)
                        statement.close();
                    if (connexion != null)
                        connexion.close();
                } catch (SQLException ignore) {
                }
            }
     
            return utilisateurs;
        }
     
        private String toString(String id) {
    		// TODO Auto-generated method stub
    		return id;
    	}
     
    	private void loadDatabase() {
            // Chargement du driver
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
            }
     
            try {
                connexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee", "root", "");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
     
     
    }
    s'il te plais quand tu me mets du code dit moi la destination, exemple servlet ou bean !
    voici le code de Noms :
    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
    package com.boticiel.bdd;
     
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.PreparedStatement;
    import java.util.ArrayList;
    import java.util.List;
     
    import com.boticiel.forms.BeanException;
    import com.boticiel.forms.Utilisateur;
     
    public class Noms {
        private Connection connexion;
     
        public List<Utilisateur> recupererUtilisateurs() {
        	List<Utilisateur> utilisateurs = new ArrayList<Utilisateur>();
            Statement statement = null;
            ResultSet resultat = null;
     
            loadDatabase();
            int id=0;
            try {
                statement = connexion.createStatement();
     
                // Exécution de la requête
                resultat = statement.executeQuery("SELECT id, nom, prenom FROM noms;");
     
                // Récupération des données
                while (resultat.next()) {
     
     
                    id = resultat.getInt("id");
     
                    String nom = resultat.getString("nom");
                    String prenom = resultat.getString("prenom");
     
                    Utilisateur utilisateur = new Utilisateur();
                    utilisateur.setId(id);
                    utilisateur.setNom(nom);
                    utilisateur.setPrenom(prenom);
     
                    utilisateurs.add(utilisateur);
                }
            } catch (SQLException | BeanException e) {
            } finally {
     
                // Fermeture de la connexion
                try {
                    if (resultat != null)
                        resultat.close();
                    if (statement != null)
                        statement.close();
                    if (connexion != null)
                        connexion.close();
                } catch (SQLException ignore) {
                }
            }
     
            return utilisateurs;
        }
     
        private String toString(String id) {
    		// TODO Auto-generated method stub
    		return id;
    	}
     
    	private void loadDatabase() {
            // Chargement du driver
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
            }
     
            try {
                connexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee", "root", "");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
     
     
    }
    Donc d'après ce que tu m'as écrit j'ai fait des erreurs de codage, je complique trop !
    voici Utilisateurs :
    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
    package com.boticiel.forms;
     
    public class Utilisateur {
     
    	private String paramId;
     
    	public String getParamId() {
    		return paramId;
    	}
     
     
     
    	public void setParamId(String paramId) {
    		this.paramId = paramId;
    	}
     
     
     
    	private int id=0;
    	private String nom;
        private String prenom;
     
    	public Object getParameterInteger;
     
    	public String getNom() {
            return nom;
        }
     
     
     
    	public void setNom(String nom) throws BeanException {
            if (nom.length() > 10) {
                throw new BeanException("Le nom est trop grand ! (10 caractères maximum)");
            }
            else {
                this.nom = nom; 
            }
        }
        public String getPrenom() {
            return prenom;
        }
        public void setPrenom(String prenom) {
            this.prenom = prenom;
        }
     
        public int getId() {
    		return id;
    	}
     
     
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
     
    }
     
    //La DaoFactory.java change peu. On y ajoute seulement un
    je prends un cours de Java EE aprés avoir lu des tas de livres mais c'est toujours pas clair dans mon esprit. désolé

    Mais si tu peux m'aider j'en serais ravi.

    cordialement
    Philippe

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par philo71 Voir le message
    s'il te plais quand tu me mets du code dit moi la destination, exemple servlet ou bean !
    Je t'ai indiqué directement ou indirectement tous les "emplacements" des codes que je t'ai indiqués.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    String paramId = request.getParameter("id");
     
    /*... reste du code de ta servlet ...*/
    Ici la méthode doPost c'est bien la méthode doPost que tu as écrite. Je n'ai jamais dit d'ajouter un attribut paramId dans Utilisateur. Dans ta classe Utilisateur, tu as déjà un attribut id (type int), et c'est cet attribut qui représente l'identifiant de ton Utilisateur.
    Il suffit donc de lire le paramètre de la requête (La ligne String paramId = request.getParameter("id"); dans la méthode doPost de la servlet (méthode faite pour traiter la requête post), et de l'injecter dans l'objet Utilisateur (avec la méthode setId() de cette classe), pour le passer à ta méthode de traitement.
    Donc exactement le code que je t'ai indiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
    String paramId = request.getParameter("id"); // récupération du paramètre de la requête (qui vient du formulaire posté)
     
    /*... reste du code de ta servlet ...*/
    Utilisateur utilisateur = new Utilisateur(); // là c'est déjà ce que tu faisais
     
    /** ... affectation nom et prénom ... donc le code que tu avais écrit avec setNom et setPrenom **/
     
    utilisateur.setId( Integer.parseInt(paramId) ); // ici tu injectes la valeur de paramId dans l'attribut id par le mutateur setId (en convertissant la valeur en int).
    Et tu supprimes bien sûr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int id = Integer.parseInt(request.getString("id"));
            utilisateur.setId(id);
    dans la méthode miseajourUtilisateur, puisque l'id de l'utilisateur est déjà affecté (dans la méthode doPost, ci-dessus).

    Commence déjà par ça. Et tu verras les problèmes de libération de ressources ensuite.

    En particulier, ce que je t'ai déjà indiqué pour fermer un Statement (ou PreparedStatement, c'est pareil). Mais aussi ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	private void loadDatabase() {
            // Chargement du driver
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
            }
     
            try {
                connexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee", "root", "");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    ou tu crées une nouvelle connexion à chaque fois que tu appelles loadDatabase, sans jamais la fermer, donc d'une part sans jamais libérer les ressources associées dans ton application, mais également sans que le sgbd puisse savoir que la connexion ne sert plus à rien (selon le paramétrage, soit il finira par la fermer (idle), soit il gardera toutes les connexions et tu finiras par te faire jeter pour une nouvelle connexion, puisque le nombre de connexions est forcément limité (soit par paramètre, soit par la mémoire allouée au serveur).
    En général, on utilise plutôt un pool de connexions, ce qui permet d'avoir un nombre limité fixe de connexions, qu'on peut partager entre différentes requêtes, et qu'on ferme lorsqu'on arrête l'application.
    Pour faire plus simple, au moins au début, tu peux faire une connexion par requête, mais il faut la fermer lorsque la requête est effectuée et traitée.
    Une première bonne pratique pour éviter les problèmes est surtout de ne pas faire de variable de classe. De toute manière, il ne te sera pas possible de partager la connexion entre plusieurs requêtes simultanées, et tu éviteras ce partage en ne faisant pas de variable de classe.

    Déjà ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
            }
    doit être fait au tout début et une seule fois (au démarrage de l'application). Encore que le plus simple est de ne pas le faire du tout : avec les pilotes de type 4 ce n'est nécessaire de le faire, et je suppose que tu utilises une bibliothèque_que récente, donc tout à fait capable de s'en passer.

    Ainsi, pour obtenir une connexion, la méthode devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private Connection loadDatabase() { // ici la méthode devrait plutôt s'appeler getConnection, parce que c'est ce qu'elle fait, et en aucun cas ne charge la base
     
            try {
                return DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee", "root", "");
            } catch (SQLException e) {
                e.printStackTrace(); // au minimum, ou mieux, à écrire dans un fichier de log
                return null;
            }
        }
    Et donc, faire tes requêtes avec un try-with-ressources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    try(Connection connection = loadDatabase()) {
     
        try(Statement statement = connection.createStatement()) { // ou try(PreparedStatement preparedStatement = connection.prepareStatement("...la requête ici... ")) {
              /* ... faire la requête et la traiter ... */
        }
     
    }
    Ensuite, pour l'exercice, tu pourras voir comment faire un petit pool, ou utiliser un datasource jndi.

    PS: pense que quand tu dis qu'il y a une erreur, il est pertinent de dire laquelle (message d'erreur, et stacktrace). Même si parfois on peut le deviner, il est toujours mieux d'avoir le message exact plutôt que de faire de la divination et de risquer de tomber à côté.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    Je t'es écouté avec attention mais dans ma servlet j'ai une erreur dans la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     utilisateur.setId( Integer.parsetInt(paramId) );
    J'ai une erreur sur le "parsetInt" qui est souligné par eclipse :
    utilisateur.setId( Integer.parsetInt(paramId) );

    voila ma servlet après tes instructions.
    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
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		 String paramId = request.getParameter("id");
     
    		Utilisateur utilisateur = new Utilisateur();
     
     
    	    try {
    			utilisateur.setNom(request.getParameter("nom"));
    		} catch (BeanException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
            utilisateur.setPrenom(request.getParameter("prenom"));
            Up_noms tableNoms = new Up_noms();
            tableNoms.miseajourUtilisateur(utilisateur, tableNoms);
            request.setAttribute("utilisateurs", tableNoms.recupererUtilisateurs());
            utilisateur.setId( Integer.parsetInt(paramId) ); // ici j'ai une erreur sur le parsetInt il est souligné
            this.getServletContext().getRequestDispatcher("/WEB-INF/db_update.jsp").forward(request, response);
    	}

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    C'est parseInt , pas parsetInt.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    oui je m'en suis apercu,
    mais tomcat me léve une exeption 500

    Etat HTTP 500 -

    type Rapport d''exception

    message

    description Le serveur a rencontré une erreur interne qui l''a empêché de satisfaire la requête.

    exception

    java.lang.NullPointerException
    com.boticiel.bdd.Up_noms.miseajourUtilisateur(Up_noms.java:76)
    com.boticiel.servlets.Db_update.doPost(Db_update.java:69)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

    note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de Apache Tomcat/8.0.36.
    Apache Tomcat/8.0.36

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Quel est le code de la ligne 76 de com.boticiel.bdd.Up_noms, et quel est le code complet de cette classe ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    ligne 76 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try (PreparedStatement preparedStatement = connexion.prepareStatement("UPDATE noms SET nom = ?, prenom = ? WHERE id = ?")){
    code complet :
    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
    public void miseajourUtilisateur(Utilisateur utilisateur, Up_noms request) {
     
        	try (PreparedStatement preparedStatement = connexion.prepareStatement("UPDATE noms SET nom = ?, prenom = ? WHERE id = ?")){
     
     		   preparedStatement.setString(1, utilisateur.getNom());
     		   preparedStatement.setString(2, utilisateur.getPrenom());
     		   preparedStatement.setInt(3, utilisateur.getId());
     
     		   preparedStatement.executeUpdate();
     
     		} catch(SQLException e) {
     		     // traiter l'erreurcatch (SQLException e) {
    	            e.printStackTrace();
    	        }
    	    }
     
        private void loadDatabase() {
            // Chargement du driver
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
            }
     
            try {
                connexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee", "root", "");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    j'ai bien renseigner mon mot de passe "root"

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Une NullPointerException signifie que tu appelles une méthode (ou un attribut) que une variable qui vaut null. Dans ton cas, la variable c'est focément connexion. Il manque dans ta méthode un code du type connexion = quelquechose de non null, ou l'appelle d'une méthode qui le fait :
    1. soit il faut appeler loadDatabase() comme tu faisais déjà
    2. soit faire comme je t'avais indiqué (pas d'attribut, try-with-resource)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre régulier Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Points : 78
    Points
    78
    Par défaut
    bonjour,
    j'ai choisi l'option 2, mais j'ai une erreur au loadDatabase
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    try(Connection connection = loadDatabase()) { // j'ai une erreur ici au loadDatabase

    voici mon code intégral :
    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
     public void miseajourUtilisateur(Utilisateur utilisateur, Up_noms request) {
     
        	try(Connection connection = loadDatabase()) { // j'ai une erreur ici au loadDatabase
     
        	    try(Statement statement = connection.createStatement()) { // ou try(PreparedStatement preparedStatement = connection.prepareStatement("...la requête ici... ")) {
        	          /* ... faire la requête et la traiter ... */
     
        	try (PreparedStatement preparedStatement = connexion.prepareStatement("UPDATE noms SET nom = ?, prenom = ? WHERE id = ?")){
     
     		   preparedStatement.setString(1, utilisateur.getNom());
     		   preparedStatement.setString(2, utilisateur.getPrenom());
     		   preparedStatement.setInt(3, utilisateur.getId());
     
     		   preparedStatement.executeUpdate();
     
     		} catch(SQLException e) {
     		     // traiter l'erreurcatch (SQLException e) {
    	            e.printStackTrace();
    	        }
    	    }
        	 }
     
    	}
        private void loadDatabase() {
            // Chargement du driver
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
            }
     
            try {
                connexion = DriverManager.getConnection("jdbc:mysql://localhost:3306/javaee", "root", "");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    sinon avec l'option 1
    c'est a dire en ajoutant un loadDatabase()
    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
      public void miseajourUtilisateur(Utilisateur utilisateur, Up_noms request) {
        	  loadDatabase();
        	        /* ... faire la requête et la traiter ... */
     
        	try (PreparedStatement preparedStatement = connexion.prepareStatement("UPDATE noms SET nom = ?, prenom = ? WHERE id = ?")){
     
     		   preparedStatement.setString(1, utilisateur.getNom());
     		   preparedStatement.setString(2, utilisateur.getPrenom());
     		   preparedStatement.setInt(3, utilisateur.getId());
     
     		   preparedStatement.executeUpdate();
     
     		} catch(SQLException e) {
     		     // traiter l'erreurcatch (SQLException e) {
    	            e.printStackTrace();
    	        }
    	    }
    il n'y a pas d'erreur mais aucune mise a jour de la requête UPDATE !


    Je ne sais trop quoi faire et que penser !

  12. #12
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour le premier cas, si tu n'as pas modifié la méthode loadDatabase comme j'ai indiqué (pour qu'elle retourne une connexion), c'est normal que tu aies une erreur de compilation (explicite normalement).

    Pour le second, il faudrait que tu affiches le résultat de la méthode executeUpdate() (c'est le nombre d'enregistrement affectée). Ensuite, il peut y avoir plusieurs raisons pour lesquelles ça ne fonctionne pas :

    • il n'y a pas d'enregistrement (pas d'utilisateur dans la base) correspondant à l'id indiqué en paramètre (ce qui ne causera aucune exception, ni aucune modification)
    • la connexion n'est pas en autocommit (en théorie, elle l'est par défaut, mais sait-on jamais), donc la modification n'est pas validée en base
    • il y a une erreur mais tu ne la vois pas parce que tu ne l'affiches pas (autre qu'une SQLException), ou tu ne vois pas la SQLException parce que tu ne regardes pas au bon endroit (la console, par défaut)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Erreur sous Integration Services avec requête AS400
    Par jhellier dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/04/2009, 15h51
  2. Réponses: 2
    Dernier message: 21/10/2008, 13h57
  3. [JDBC]probleme avec requête sql
    Par lkryss dans le forum JDBC
    Réponses: 16
    Dernier message: 10/06/2006, 01h44
  4. [JDBC] Requête avec une date sous la forme dd/MM/yyyy
    Par sylviefrfr dans le forum JDBC
    Réponses: 6
    Dernier message: 12/11/2005, 09h35
  5. Réponses: 2
    Dernier message: 06/06/2005, 15h13

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