Mon programme n’exécute pas la méthode DoPost

Résolu/Fermé
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 - Modifié le 25 oct. 2017 à 19:06
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 - 25 oct. 2017 à 21:36
Bonjour,
Etant debutante en JEE et pas très à l'aise en Java je trouve des problèmes pour mon application de gestion de stock
j'ai une Servlet (serveur) et une Jfram ( interface ! client ! ) et une base de donnée
j'ai cree les deux methodes doGet et doPost ( j'ai le droit je pense !! ) juste pour voir un peut les trucs mais la methode doPost ne s’exécute pas !! et dans mon application c a dire l'interface le resultat ne s'affiche pas dans la liste que j'ai crée par contre il s'affiche bien dans la console ! je veux afficher le resultat dans l'element : listeResulta
je ne comprend pas trop !!
je vous remercie


servlet

package serveur;

//des imports ...
import SResultSet.SerializedResultSet;

@WebServlet("/Maservlet")
public class Maservlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private Connection BD;
    private DataSource ds;

    public Maservlet() {
        super();
    }

    public void init(ServletConfig config) throws ServletException {
        try {
            System.out.println("Récupération du contexte");
            Context initCtx = new InitialContext();
            System.out.println("lookup de env");
            Context envCtx = (Context) initCtx.lookup("java:comp/env");
            System.out.println("lookup de base_test");
            ds = (DataSource) envCtx.lookup("jdbc/TestDB");
            System.out.println("Datasource chargée");
        } catch (Exception er) {
            System.out.println("Erreur de chargement du contexte " + er);
        }
    }

    /* doGet n'est pas obligatoire je pense!!! je ne sais pas ca sert a quoi de mettre les deux methodes ?? */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            BD = ds.getConnection();
            java.sql.Statement s = BD.createStatement();
            ResultSet r = s.executeQuery("select * from produit");
            PrintWriter out = null;
            response.setContentType("text/html");
            out = response.getWriter();
            out.println("<html>");
            out.println("<head><title> Test servlet </title></head>");
            out.println("<body>");
            out.println("Contenu de la table produit <BR>");
            out.println("<table>");
            out.println("<TR>");
            out.println("<TD>num</TD>");
            out.println("<TD>nom</TD>");
            out.println("</TR>");
            while (r.next()) {
                out.println("<TR>");
                out.println("<TD>");
                out.println(r.getString("numProduit"));
                out.println("</TD>");
                out.println("<TD>");
                out.println(r.getString("nomProduit"));
                out.println("</TD>");
                out.println("</TR>");
            }
            out.println("</table>");
            out.println("</body>");
            out.println("</html>");
            r.close();
            s.close();
            BD.close();
            s = null;
            r = null;
        } catch (java.sql.SQLException ex) {
            System.out.println("Erreur d'exécution de la requête SQL \n" + ex);
        }
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    /* dans mon cas doPost ne s'execute pas et je ne vois pas de resultat sur la fenetre affiché */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String nom;
        SerializedResultSet sresultat;
        System.out.println("dopost  s'execute ? ");
        // eh beh noon :(
        try { // Récupération du flux d'entrée envoyé par l'applet
            ObjectInputStream entree = new ObjectInputStream(request.getInputStream());
            nom = (String) entree.readObject();
            // Préparation du flux de sortie
            ObjectOutputStream sortie = new ObjectOutputStream(response.getOutputStream()); // Execution de la requête
            sresultat = ExecuterRequete(nom);
            sresultat.first();
            // Envoi du résultat au client
            sortie.writeObject(sresultat);
        } catch (Exception ex) {
            System.out.println("Erreur d'exécution de la requête SQL : " + ex);
        }
    }

    public SerializedResultSet ExecuterRequete(String nom) {
        try { // Exécution de la requête
            System.out.println("s'execute ExecuterRequete ? ");// non
            BD = ds.getConnection();
            java.sql.Statement s = BD.createStatement();
            ResultSet r = s.executeQuery("select * from produit where nomProduit= '" + nom + "'");
            System.out.println("ok???");
            // Transformation du ResultSet en sResultSet
            java.sql.ResultSetMetaData columnNames = r.getMetaData();
            SResultSet.SerializedResultSet sResultSet = new SResultSet.SerializedResultSet();
            for (int i = 1; i <= columnNames.getColumnCount(); i++) {
                sResultSet.addColumn(columnNames.getColumnName(i), i);
            }
            while (r.next()) {
                for (int column = 1; column <= columnNames.getColumnCount(); column++) {
                    sResultSet.addColumnData(column, r.getObject(column));
                }
            }
            r.close();
            s.close();
            BD.close();
            s = null;
            r = null;
            return sResultSet;
        } catch (java.sql.SQLException ex) {
            System.out.println("Erreur d'exécution de la requête SQL \n" + ex);
            return null;
        }
    }
}

interface :

package client;

// import ... ;

@SuppressWarnings({ "serial", "unused" })
public class Moninterface extends JFrame {
    private JPanel contentPane;
    private JTextField montexte;
    JTextComponent lblRecherche;
    @SuppressWarnings("rawtypes")
    JList listeResultat = new JList();
    String res;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Moninterface frame = new Moninterface();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public Moninterface() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        GridBagLayout gbl_contentPane = new GridBagLayout();
        gbl_contentPane.columnWidths = new int[] { 0, 0, 0 };
        gbl_contentPane.rowHeights = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 };
        gbl_contentPane.columnWeights = new double[] { 0.0, 1.0, Double.MIN_VALUE };
        gbl_contentPane.rowWeights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE };
        contentPane.setLayout(gbl_contentPane);

        // rechercher
        JLabel lblRecherche = new JLabel("Recherche");
        GridBagConstraints gbc_lblRecherche = new GridBagConstraints();
        gbc_lblRecherche.insets = new Insets(0, 0, 5, 0);
        gbc_lblRecherche.gridx = 1;
        gbc_lblRecherche.gridy = 1;
        contentPane.add(lblRecherche, gbc_lblRecherche);

        montexte = new JTextField();
        GridBagConstraints gbc_montexte = new GridBagConstraints();
        gbc_montexte.insets = new Insets(0, 0, 5, 0);
        gbc_montexte.fill = GridBagConstraints.HORIZONTAL;
        gbc_montexte.gridx = 1;
        gbc_montexte.gridy = 3;
        contentPane.add(montexte, gbc_montexte);
        montexte.setColumns(10);

        // boutton
        JButton btnAfficher = new JButton("Afficher");
        btnAfficher.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                Rechercher();
            }
        });
        GridBagConstraints gbc_btnAfficher = new GridBagConstraints();
        gbc_btnAfficher.insets = new Insets(0, 0, 5, 0);
        gbc_btnAfficher.gridx = 1;
        gbc_btnAfficher.gridy = 4;
        contentPane.add(btnAfficher, gbc_btnAfficher);

        // liste
        @SuppressWarnings("rawtypes")
        JList listeResultat = new JList();
        GridBagConstraints gbc_listeResultat = new GridBagConstraints();
        gbc_listeResultat.fill = GridBagConstraints.BOTH;
        gbc_listeResultat.gridx = 1;
        gbc_listeResultat.gridy = 6;
        contentPane.add(listeResultat, gbc_listeResultat);
    }

    private void Rechercher() {
        String nom = montexte.getText();
        try { // Connexion à la servlet
            URL url = new URL("http://localhost:8083/montest/Maservlet");
            URLConnection connexion = url.openConnection();
            connexion.setDoOutput(true);
            // Récupération du flux de sortie
            ObjectOutputStream fluxsortie = new ObjectOutputStream(connexion.getOutputStream());
            // Envoi du nom à rechercher
            fluxsortie.writeObject(nom);
            // Récupération du flux d’entrée
            ObjectInputStream fluxentree = new ObjectInputStream(connexion.getInputStream());
            // Récupération du résultat de la requête
            SerializedResultSet donnees = (SerializedResultSet) fluxentree.readObject();
            // affichage du résultat
            donnees.first();
            @SuppressWarnings("rawtypes")
            Vector contenu = new Vector();
            contenu.clear();
            listeResultat.setListData(contenu);
            for (int i = 0; i < donnees.recordCount(); i++) {
                res = donnees.getString("nomProduit") + " " + donnees.getString("descriProduit");
                contenu.addElement(res);
                donnees.next();
            }
            // ce resultat est affiché dans la console mais pas dans l'interface
            listeResultat.setListData(contenu);
            System.out.println("le nombre des produit est :" + donnees.recordCount());
            if (donnees.recordCount() == 0) {
                res = "pas de produit existant ";
                contenu.addElement(res);
            }
            System.out.println(contenu);
        } catch (Exception sql) {
            System.out.println("erreur " + sql);
        }
    }
}

Quand j'execute Moninterface.java avec comme nom de recherche "produit1 " Ca m'affiche dans la console
le nombre des produit est :3
[produit1 jolie, produit1 base, produit1 qualite]


Mais dans l'nterface la zone list est toujours vide !
Et quand j'execute Maservlet.java ca m'affiche dans la console :

Récupération du contexte
lookup de env
lookup de base_test
Datasource chargée

Et dans le navigateur sous le lien http://localhost:8083/montest/Maservlet
Contenu de la table produit 
num nom
1 produit1
2 produit2
3 produit3
4 produit4
5 produit5
6 produit6
7 produit1
8 produit1


J'espere que quelqu'un puisse voir mon probléme je redis que je suis debutante ducoup je ne vois pas trop l'architecture le comment ca marche tt ca mais j'hesite pas a commenter partt et tester ttt pr savoir ca sert a quoi chaque truc;

Je vous remercie bcp :) et bonne fin de journée

2 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
25 oct. 2017 à 16:51
Bonjour,

1 - Si ta question concerne le java .... il faut poster ta question dans le forum JAVA !
Je la déplace (encore une fois.... )

2 - Lorsque tu postes du code sur le forum.. tu dois (je te le répète encore une fois....) utiliser les BALISES DE CODE (ET en y précisant le langage pour avoir la couleur!!) !
Voir ici: https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

0
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 3
25 oct. 2017 à 16:54
bonjour
merci pour votre réponse Jordane ! par contre quand j'ai utilisé la balise <code> ça m'a mis le code en désordre genre pas d'espace et pas de retour a la ligne du coup j'ai préféré le modifier en texte avec <gras> peut être c'est plus visible !! !
0
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 3
25 oct. 2017 à 17:21
C'est bon, c'est fait je l'ai bien modifier  :)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 oct. 2017 à 19:31
Bonjour,

Si tu ne sais pas à quoi servent les méthodes que tu surcharges (doGet et doPost), il faut regarder la documentation de la classe mère dont tu hérites (HttpServlet), parce que soit on sait, soit on ne sait pas, mais on ne peut pas deviner.

https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServlet.html

En l'occurence ici, c'est les bases du protocole HTTP, il y a une dizaine de verbes disponibles (dont GET et POST), correspondant à des opérations différentes.

https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol

Par exemple, si côté interface tu fais un
url.openConnection()
(ou si tu tapes l'adresse directement dans le navigateur), ce sera un GET qui sera envoyé au serveur, donc c'est la méthode doGet() qui sera appelé et doPost() ne servira à rien.
0
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 3
25 oct. 2017 à 20:11
rebonjour
merci et c'est bien ca que j'ai conclu
mais dans mon cas je veux bien que deux doPoste qui sera appelé mais elle ne s'execute pas !!
merci pour les liens
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 25 oct. 2017 à 20:34
" deux doPoste qui sera appelé"
Pourquoi deux ?

Dans ton code client tu peux rajouter :
connexion.setRequestMethod("POST");
pour forcer l'usage du POST.

Remarque : dans ton cas (la recherche de données) c'est GET qu'il faudrait utiliser pour respecter le sens des verbes HTTP.
0
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 3
25 oct. 2017 à 20:48
je veux que doPost qui soit exécuté.
pourquoi le résultat s'affiche sur la console et pas sur la fenêtre s'il vous plait ??
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 oct. 2017 à 20:54
Il s'affiche dans la console car tu fais System.out.println(contenu); sauf que ce contenu que tu ne le récupères pas pour le mettre dans la fenêtre...

Remarque : depuis Java 2, il est conseillé d'utiliser ArrayList plutôt que Vector, voir la documentation : https://docs.oracle.com/javase/9/docs/api/java/util/Vector.html
0
Nouvelle_Informaticienne Messages postés 153 Date d'inscription mercredi 20 avril 2016 Statut Membre Dernière intervention 20 décembre 2021 3
25 oct. 2017 à 21:36
oui voila c'est avec ca
 System.out.println(contenu);
que je l'affiche dans la console pour tester et bien voir le résultat retourner

comment le récupérer et a quel endroit je dois le faire s'il vous plait ?
je prend note pour modifier vector
merci
0