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 :

Affecter une valeur à un paramètre d'un PreparedStatement


Sujet :

Servlets/JSP Java

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut Affecter une valeur à un paramètre d'un PreparedStatement
    Bonjour à tous,

    Au fait j'ai pu repérer là ou se trouve mon erreur quand je tente de modifier.En effet, j'ai remplacé le paramètre ? que j'ai mis lors de l'appel de ma procédure stockée(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static final String SelectionParNumEtudiantCons = "call SelectionParNumEtudiant(?)";
    )

    par un matricule d'un étudiant que j'ai enregistré dans ma base et j'ai supprimé cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preparedStatement.setString(1,etudiant.getNumEtudiant());
    dans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public List<Etudiant> EtudiantSelectionner(Etudiant etudiant) throws DAOException
    tout a marché(les champs de mon formulaire s'affiche bien avec des informations relatives au matricule) mais dès que je remet le ? et la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preparedStatement.setString(1,etudiant.getNumEtudiant());
    J'ai l'erreur suivante dans le navigateur :
    Nom : Capture.PNG
Affichages : 421
Taille : 42,1 Ko
    ça m'indique une erreur à la ligne 138 et c'est là que se trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preparedStatement.setString(1,etudiant.getNumEtudiant());
    Je me suis dit que peut être l'affectation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preparedStatement.setString(1,etudiant.getNumEtudiant());
    n'est valable que pour des opérations de mise à jour c'est-à-dire insertion,update et suppression alors que pour mon cas c'est de prendre les informations relatives à un matricule donné et les afficher dans les champs de mon formulaire de modification.

    Je demande votre aide pour savoir comment m'y prendre.

    Voici mon code :

    Voici comment je créé le lien vers ma servlet de modification à partir de la liste des étudiants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <td><a href = "<c:url value = "/modifierEtudiant"><c:param name = "matricule" value = "${mapEtudiant.key}"/></c:url>"><img src = "<c:url value = "/Image/modif.png"/>" alt = "Modifier"/></a></td>
    Code de la méthode EtudiantSelectionner(Etudiant etudiant):

    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
     
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
     
    import javax.servlet.http.HttpServletRequest;
     
    import static DAO.DAOUtilitaire.*;
    import DAOException.DAOException;
    import LesObjets.Etudiant;
     
    public class EtudiantDaoImpl implements EtudiantDao {
    	private static final String SelectionCons = "call SelectionEtudiant()";
    	private static final String insertionEtudiant = "call AjoutEtudiant(?,?,?,?)";
    	private static final String suppressionEtudiant = "call SuppressionEtudiant(?)";
    	private static final String SelectionParNumEtudiantCons = "call SelectionParNumEtudiant(?)";
    	//private static final String selectionParEtudiant = null;
    	private DAOFactory daoFactory;
     
    	EtudiantDaoImpl(DAOFactory daoFactory){
    		this.daoFactory = daoFactory;
    	}public List<Etudiant> EtudiantSelectionner(Etudiant etudiant) throws DAOException {
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet resultat = null;
            List<Etudiant> etudiants = new ArrayList<Etudiant>();
            try{
                connection = daoFactory.getConnection();
                //int[] NumEtudiant = null;
                preparedStatement = connection.prepareStatement(SelectionParNumEtudiantCons);
                preparedStatement.setString(1,etudiant.getNumEtudiant());
                resultat = preparedStatement.executeQuery();
                while(resultat.next()){
                    etudiants.add(Stockage(resultat));
                }
            }catch(SQLException e){
                throw new DAOException("La selection a échoué.",e);
            }finally {
                fermeturesSilencieuses( resultat, preparedStatement,connection );
            }
            return etudiants;
            }
    }
    Code de la servlet de modification :

    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
    ackage TPServlet;
     
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
     
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    import CoucheMetier.EtudiantMetier;
    import DAO.DAOFactory;
    import DAO.EtudiantDao;
    import DAOException.DAOException;
    import LesObjets.Etudiant;
     
     
    @WebServlet("/modifierEtudiant")
    public class modifierEtudiant extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	private static final String ConDAOFactory = "daoFactory";
    	private static final String matriculeCons = "matricule";
    	private static final String sessionEtudiantUnique = "resultas";
    	private static final String cheminModif = "/WEB-INF/modifierEtudiant.jsp";
     
    	private EtudiantDao etudiantDao;
     
     
    	public void init() throws ServletException {
          this.etudiantDao = ((DAOFactory) getServletContext().getAttribute(ConDAOFactory)).getEtudiantDao();
    	}
     
     
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String matricule = request.getParameter(matriculeCons);
     
            HttpSession session = request.getSession(); 
     
           if(matricule != null){
               Map<String,Etudiant> resultas =  (HashMap<String, Etudiant>) session.getAttribute(sessionEtudiantUnique) ;
               Etudiant etudiant = new Etudiant();
               try{
            	  //Etudiant matri =  resultas.get(matricule);
        	   etudiantDao.EtudiantSelectionner(resultas.get(matricule)); 
     	      resultas.put(etudiant.getNumEtudiant(),etudiant);
             }catch(DAOException d){
        	  d.printStackTrace();
              }
     
              session.setAttribute(sessionEtudiantUnique, resultas);
           }
          this.getServletContext().getRequestDispatcher(cheminModif).forward(request, response); 
    	}
     
     
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    	}
     
    }
    Merci d'avance!!!

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Maroc

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

    Informations forums :
    Inscription : Décembre 2014
    Messages : 17
    Points : 23
    Points
    23
    Par défaut
    vérifiez que l'instance etudiant n'est pas null et preparedStatement aussi

  3. #3
    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 : 55
    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,

    La variable etudiant utilisée dans preparedStatement.setString(1,etudiant.getNumEtudiant()); doit être null.

    C'est probablement dû à ce qu'il se passe dans la méthode doGet. Voir les commentaires que j'ai mis.
    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
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String matricule = request.getParameter(matriculeCons); 
     
            HttpSession session = request.getSession(); 
     
           if(matricule != null){
               Map<String,Etudiant> resultas =  (HashMap<String, Etudiant>) session.getAttribute(sessionEtudiantUnique) ; // où est initialisée cette map ? que contient-elle : si le seul code qui manipule cette map est cette méthode doGet, la map ne contient qu'un étudiant mappé sur un clef à priori null (voir les commentaires suivant)
               Etudiant etudiant = new Etudiant(); // tu créés une instance d'étudiant (ce serait bien d'avoir le source de cette classe, parce que c'est douteux cette instanciation : à priori, tous les champs sont null)
               try{
            	  //Etudiant matri =  resultas.get(matricule);
        	   etudiantDao.EtudiantSelectionner(resultas.get(matricule)); // tu traite l'étudiant qui correspond au matricule dans la map : s'il n'y en a pas, on appelle EtudiantSelectionner avec null en paramètre, et tu obtiens l'erreur que tu as, et comme à priori il y'en a pas (voir les commentaires sur new Etudiant()) 
     	      resultas.put(etudiant.getNumEtudiant(),etudiant); // comme edudiant n'a pas changé, son num est à priori toujours null, donc ça met une instance de Etudiant a priori ne contenant que des null, mappée sur une clef null : à quoi ça sert ? 
             }catch(DAOException d){
        	  d.printStackTrace();
              }
     
              session.setAttribute(sessionEtudiantUnique, resultas);
           }
          this.getServletContext().getRequestDispatcher(cheminModif).forward(request, response); 
    	}
    Pour la sélection, pourquoi ne pas simplement passer le matricule de l'étudiant en paramètre de la méthode EtudiantSelectionner ?

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Bonsoir,

    J'ai passer le matricule en paramètre de la méthode donc au lieu de "EtudiantSelectionner(Etudiant etudiant)" j'ai fait "EtudiantSelectionner(String Matricule)" , lors de l'affectation j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preparedStatement.setString(1,Matricule);
    et voici comment j'ai modifier la méthode doGet :
    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
    package TPServlet;
     
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
     
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    import CoucheMetier.EtudiantMetier;
    import DAO.DAOFactory;
    import DAO.EtudiantDao;
    import DAOException.DAOException;
    import LesObjets.Etudiant;
     
     
    @WebServlet("/modifierEtudiant")
    public class modifierEtudiant extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	private static final String ConDAOFactory = "daoFactory";
    	private static final String matriculeCons = "matricule";
    	private static final String sessionEtudiantUnique = "resultas";
    	private static final String cheminModif = "/WEB-INF/modifierEtudiant.jsp";
     
    	private EtudiantDao etudiantDao;
     
     
    	public void init() throws ServletException {
          this.etudiantDao = ((DAOFactory) getServletContext().getAttribute(ConDAOFactory)).getEtudiantDao();
    	}
     
     
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String matricule = request.getParameter(matriculeCons);
     
            HttpSession session = request.getSession(); 
     
           if(matricule != null){
               Map<String,Etudiant> resultas =  (HashMap<String, Etudiant>) session.getAttribute(sessionEtudiantUnique) ;
               Etudiant etudiant = null;
               try{
            	  //Etudiant matri =  resultas.get(matricule);
        	   etudiantDao.EtudiantSelectionner(matricule); 
     	      //resultas.put(etudiant.getNumEtudiant(),etudiant);
             }catch(DAOException d){
        	  d.printStackTrace();
              }
     
              session.setAttribute(sessionEtudiantUnique, resultas);
           }
          this.getServletContext().getRequestDispatcher(cheminModif).forward(request, response); 
    	}
     
     
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    	}
     
    }
    Quand j'actualise ma page dans le navigateur ça m'affiche un formulaire avec des champs vides.

    Pour ce qui est de l'initialisation de la map j'ai fais ça dans le filtre dont voici le code :

    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 Filtre;
     
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
     
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
     
    import DAO.DAOFactory;
    import DAO.EtudiantDao;
    import DAO.MatiereDao;
    import LesObjets.Etudiant;
    import LesObjets.Matiere;
     
    /**
     * Servlet Filter implementation class FiltreTP
     */
    @WebFilter("/FiltreTP")
    public class FiltreTP implements Filter {
    	private static final String confDAOFactory = "daoFactory";
     
    	private static final String etudiantUnique = "resultas";
     
    	private EtudiantDao etudiantDao;
    	private MatiereDao matiereDao;
    	public void init(FilterConfig fConfig) throws ServletException {
              this.etudiantDao = ((DAOFactory) fConfig.getServletContext().getAttribute(confDAOFactory)).getEtudiantDao();
    	}
     
    	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
     
    		HttpServletRequest request = (HttpServletRequest) req;
                    HttpServletResponse response = (HttpServletResponse) res;
     
    		HttpSession session = request.getSession();
           if(session.getAttribute(etudiantUnique) == null){
    	        String Matricule = request.getParameter("matricule"); 
    			List<Etudiant> etudiantTrouve = etudiantDao.EtudiantSelectionner(Matricule);
    			Map<String,Etudiant> mapEtudiantTrouve = new HashMap<String,Etudiant>();
     
    			for(Etudiant etudiant1 : etudiantTrouve){
    				mapEtudiantTrouve.put(etudiant1.getNumEtudiant(), etudiant1);
    			}
    			session.setAttribute(etudiantUnique, mapEtudiantTrouve);		    
    		}
     
    		chain.doFilter(request, response);
    	}
    }
    Voici le code du bean Etudiant :

    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
    package LesObjets;
    import java.io.Serializable;
     
    public class Etudiant implements Serializable{
      private String NumEtudiant;
      private String NomEtudiant;
      private String PrenomEtudiant;
      private String AdresseEtudiant;
    public String getNumEtudiant() {
    	return NumEtudiant;
    }
    public void setNumEtudiant(String numEtudiant) {
    	this.NumEtudiant = numEtudiant;
    }
    public String getNomEtudiant() {
    	return NomEtudiant;
    }
    public void setNomEtudiant(String nomEtudiant) {
    	this.NomEtudiant = nomEtudiant;
    }
    public String getPrenomEtudiant() {
    	return PrenomEtudiant;
    }
    public void setPrenomEtudiant(String prenomEtudiant) {
    	this.PrenomEtudiant = prenomEtudiant;
    }
    public String getAdresseEtudiant() {
    	return AdresseEtudiant;
    }
    public void setAdresseEtudiant(String adresseEtudiant) {
    	this.AdresseEtudiant = adresseEtudiant;
    }
    }
    Merci d'avance!!!

  5. #5
    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 : 55
    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
    Il est paramétré comment le filtre (quel est le contenu de l'élément web-app) ?

    Là, ton filtre va récupérer les Etudiant qui ont le matricule passé en paramètre (étrange qu'il puisse y en avoir plusieurs, mais bon), et les rangent dans une map, ce qui fait qu'on aura de toute manière qu'un seul Etudiant pour un matricule.

    La servlet fait la même requête, mais ignore le résultat : dans ton dernier code, elle ne fait rien d'autre (qui change quelque chose, je veux dire, parce que prendre un attribut et le remettre tel quel ne change rien).

    Si le filtre est appelé pour echainer sur la requête, tu fais 2 fois la requête, mais seul l'attribut sessionEtudiantUnique est affecté et contient une map qui contient un étudiant mappé sur son matricule.

    Soit faire que la servlet fasse directement (sans filtre) la requête et affecte un attribut avec directement l'instance d'Etudiant trouvé (il ne devrait n'y en avoir qu'un de toute manière).

    En fait, normalement, lorsqu'on utilise un couple filtre + servlet, c'est pour avoir un endroit unique pour créer une sélection, et l'exploiter dans la ou les servlet. Donc tu peux continuer d'utiliser le filtre, et faire que la servlet ne fasse que récupérer l'etudiant dans la map et le mettre dans un attribut que tu récupères dans la jsp pour l'afficher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String matricule = request.getParameter(matriculeCons);
     
            HttpSession session = request.getSession(); 
     
           Map<String,Etudiant> resultas =  (Map<String, Etudiant>) session.getAttribute(sessionEtudiantUnique) ;
           if ( resultas!=null ) { // si c'est null on n'est jamais passé par le filtre...
               Etudiant etudiant = resultas.get(matricule);
               if( etudiant!=null ) { 
                    session.setAttribute(ETUDIANT_SELECTIONNE, etudiant);
              }
           } else {
               // soit tu lèves une exception pour indiquer que le filtre n'a jamais été invoqué, soit tu fais la requête et tu récupères l'unique Etudiant dans le résultat 
           }
    Avec ETUDIANT_SELECTIONNE, un static final qui contient le nom de l'attribut

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Bonsoir,


    Voici ce que je viens de faire :

    Code de la méthode doGet :

    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
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String matricule = request.getParameter(matriculeCons);
     
            HttpSession session = request.getSession(); 
            Map<String,Etudiant> resultas =  (HashMap<String, Etudiant>) session.getAttribute(sessionEtudiantUnique) ;
           if( resultas != null){
        	   Etudiant etudiant = resultas.get(matricule);
               if( etudiant != null ) { 
                    session.setAttribute(etudiantCons, etudiant);
              }else {
                 throw new DAOException("Le filtre n'a pas été contacté.");
              }
           }
          this.getServletContext().getRequestDispatcher(cheminModif).forward(request, response); 
    	}
    et j'ai cette erreur :
    Nom : Capture1.PNG
Affichages : 359
Taille : 32,9 Ko

    Voici comment est paramétré mon filtre dans web.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <filter>
        <filter-name>monFiltre</filter-name>
        <filter-class>Filtre.FiltreTP</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>monFiltre</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <filter>
    Merci d'avance!!!

  7. #7
    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 : 55
    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
    A priori, ton filtre n'est pas invoqué...

    Les annotations (genre @WebFilter), je ne connais pas, mais il semble qu'il faut les mapper sur les servlets, ou les patterns : @WebFilter("/*") devrait sélectionner le filtre pour toutes les servlets à priori.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Bonsoir,

    Voici comment est parametré le filtre dans web.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <filter>
        <filter-name>monFiltre</filter-name>
        <filter-class>Filtre.FiltreTP</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>monFiltre</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    </web-app>
    et j'ai modifier la méthode doGet en remplacant le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw new DAOException("Le filtre n'a pas été contacté.");
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     etudiantDao.EtudiantSelectionner(matricule);
            	  resultas.put(matricule, etudiant);
                  session.setAttribute(etudiantCons, etudiant);
    Voici le code complet de ce que j'ai fait :

    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 doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           String matricule = request.getParameter(matriculeCons);
     
            HttpSession session = request.getSession(); 
            Map<String,Etudiant> resultas =  (HashMap<String, Etudiant>) session.getAttribute(sessionEtudiantUnique) ;
           if( resultas != null){
        	   Etudiant etudiant = resultas.get(matricule);
               if( etudiant != null ) { 
                    session.setAttribute(etudiantCons, etudiant);
              }else {
            	  etudiantDao.EtudiantSelectionner(matricule);
            	  resultas.put(matricule, etudiant);
                  session.setAttribute(etudiantCons, etudiant);
              }
     
           }
          this.getServletContext().getRequestDispatcher(cheminModif).forward(request, response); 
    	}
    et j'ai eu un formulaire avec des champs vides.
    Merci d'avance!!!

  9. #9
    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 : 55
    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
    Je n'avais pas vu le if(session.getAttribute(etudiantUnique) == null){ dans le filtre, donc effectivement, la requête n'est faite qu'une seule fois, et les nouveaux étudiants n'y seront que si les requêtes de création les y ajoutent (mais dans un contexte multi utilisateur, ça ne fonctionnerait pas). Du coup, le filtre ne sert qu'à charger l'ensemble de la table au premier appel.

    Du coup, effectivement il faut ajouter un code comme celui que tu as fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    etudiantDao.EtudiantSelectionner(matricule);
            	  resultas.put(matricule, etudiant);
                  session.setAttribute(etudiantCons, etudiant);
    Mais ce code fait que ça met juste un étudiant null dans etudiantCons.
    Il faut récupérer l'étudiant dans le résultat de etudiantDao.EtudiantSelectionner(matricule) (la List<Etudiant>), exactement de la même manière que c'est fait dans le filtre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List<Etudiant> listEtudiants = etudiantDao.EtudiantSelectionner(Matricule);
    for(Etudiant etudiantTrouve : listEtudiants){
        if ( matricule.equals(etudiantTrouve.getNumEtudiant()) etudiant=etudiantTrouve;
        resultas.put(etudiantTrouve.getNumEtudiant(), etudiantTrouve); // tu peux mettre à jour la map aussi...
    }
    session.setAttribute(etudiantCons, etudiant);

  10. #10
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Bonsoir,

    Voici ce que je viens de faire :

    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
    if(session.getAttribute(etudiantUnique) == null){
    	        String Matricule = request.getParameter("matricule"); 
    			List<Etudiant> etudiantTrouve = etudiantDao.EtudiantSelectionner(Matricule);
    			Map<String,Etudiant> mapEtudiantTrouve = new HashMap<String,Etudiant>();
     
    			for(Etudiant etudiant1 : etudiantTrouve){
    				if(Matricule.equals(etudiant1.getNumEtudiant())){
    				mapEtudiantTrouve.put(etudiant1.getNumEtudiant(), etudiant1);
    				}
    				}
    			session.setAttribute(etudiantUnique, mapEtudiantTrouve);		    
    		}
     
    		chain.doFilter(request, response);
    	}
    Quand j'ai actualisé en premier lieu c'était bon mais quand j'ai pris un notre étudiant ça m'a affiché 2 fois le formulaire un avec des champs vides et un avec le résultat attendu,quand j'ai pris un autre tout a cessé de fonctionner et je reçois un formulaire avec des champs vides.


    Voici le code de la JSP peut être l'erreur viens de là bas :

    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
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!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>Création d'un etudiant</title>
    <link type="text/css" rel="stylesheet" href="<c:url value ="inc/style.css"/>"/>
    </head>
    <body>
    <c:choose>
    <c:when test = "${empty sessionScope.resultas}">
    <c:out value = "La map est vide."/>
    </c:when>
    <c:otherwise>
    <c:forEach items = "${sessionScope.resultas}" var = "mapEtudian">
    <div>
    <c:import url = "/inc/menu.jsp"/>
    <form  method="post" action = "<c:url value="/etudiant"/>">
    <fieldset>
    <legend>Informations etudiant</legend>
     
    <label for="nomClient">Matricule <span
    class="requis">*</span></label>
    <input type="text" id="nomClient"
    name="matricule" value="<c:out value = "${mapEtudian.value.numEtudiant}"/>" size="20" maxlength="20" />
     
    <br />
    <label for="nomClient">Nom <span
    class="requis">*</span></label>
    <input type="text" id="nomClient"
    name="nom" value="<c:out value = "${mapEtudian.value.nomEtudiant}"/>" size="20" maxlength="20" />
     
    <br />
    <label for="prenomClient">Prénom </label>
    <input type="text" id="prenomClient"
    name="prenom" value="<c:out value = "${mapEtudian.value.prenomEtudiant}"/>" size="20" maxlength="20" />
     
    <br />
    <label for="adresseClient">Adresse 
    <span class="requis">*</span></label>
    <input type="text" id="adresseClient"
    name="adresse" value="<c:out value = "${mapEtudian.value.adresseEtudiant}"/>" size="20" maxlength="20" />
     
    <br />
    </c:forEach>
    </c:otherwise>
    </c:choose>
    </fieldset>
    <input type="submit" value="Valider"  />
    <input type="reset" value="Remettre à zéro" /> <br/>
    </form>
    </div>
    </body>
    </html>
    Merci d'avance!!!

  11. #11
    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 : 55
    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
    Si tu as 2 formulaires qui s'affichent, c'est que la map en contient 2, à priori l'étudiant correspondant au matricule et un autre vide (ou null) : à priori je dirais que ça vient de la liste retournée par ta méthode de DAO.

    La session conserve les attributs que tu y mets : si tu fais un if(session.getAttribute(etudiantUnique) == null){, la map sera créer au premier appel, et ensuite elle restera, avec les valeurs qui s'y trouvent, donc celles qui correspondent au premier étudiant sélectionné. A priori, si tu retrouves avec 2 formulaires vides ensuite, c'est que tu modifies le contenu de la map à un moment, pour en supprimer l'étudiant sélectionné et le remplacer par un étudiant sans propriétés. Pour le deuxième étudiant sélectionné, la map ne change pas : si tu as laissé le code dans le doGet() de la servlet (je parle du else), il devrait y être ajouté, sinon il faut regénérer la map à chaque nouvelle sélection.

  12. #12
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2014
    Messages : 352
    Points : 349
    Points
    349
    Par défaut
    Merci infinement Joel.
    ça fait longtemps que je suis bloqué.Au fait, il faut changer le "if(session.getAttribute(etudiantUnique) == null)" par "if(session.getAttribute(etudiantUnique) != null)" et maintenant j'ai le résultat attendu.Merci encore.

Discussions similaires

  1. Affecter une valeur à un paramètre d'un PreparedStatement(méthode doPost).
    Par Kasko dans le forum Développement Web en Java
    Réponses: 6
    Dernier message: 10/03/2015, 22h16
  2. Affecter une valeur NULL à un paramètre d'un Query ?
    Par Targan dans le forum Débuter
    Réponses: 10
    Dernier message: 18/06/2009, 14h55
  3. Réponses: 4
    Dernier message: 07/04/2005, 14h37
  4. Affecter une valeur à un radiobutton svp
    Par bigfoot dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 12h17
  5. [scriplet] affecter une valeur par un bean:write
    Par viena dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 25/11/2004, 17h29

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