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

Struts 1 Java Discussion :

Probleme avec le DispatchAction


Sujet :

Struts 1 Java

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut Probleme avec le DispatchAction
    Bonjour tout L monde,

    J'utilise un DispatchAction pour gerer deux actions dans une page jsp je modifie bien mon fichier struts-config en ajoutant le champ parametre comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <action
          attribute="modification1Form"
          input="/modification1.jsp"
          name="modification1Form"
          parameter="operation"
          path="/modification1"
          scope="request"
          type="com.iam.struts.action.Modification1Action">
          <forward name="tout" path="/modification1.jsp" />
        </action>
    Tandis que dans mon Action.class :

    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
     
     
    public class Modification1Action extends DispatchAction {
     
    	public ActionForward lire(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    		Modification1Form modifes = (Modification1Form) form;
    	 Integer anneeSelected=modifes.getAnnee();
     
    	 modifes.setAnnee(anneeSelected);
    	 modifes.setFinanceList(Charger.chargerList(anneeSelected)) ;
    		return mapping.findForward("tout");
     
    	}
    	public ActionForward save(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    		Modification1Form modifes = (Modification1Form) form;
     
    		Integer year=modifes.getAnnee();
    		ArrayList<Finance> ham =modifes.getFinanceList();
    		Modifier.modifier(Charger.chargerList(year),ham, year);
     
    			return mapping.findForward("tout");
     
    	}
    J'ai deux fonctions gérées par le DispatchAction : lire et save .

    Et finallement dans la jsp je gère le traitement comme suit :

    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
     
     
    <meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<SCRIPT>function set(target) {document.Modification1Form[0].operation.value=target;}</SCRIPT>
     
    // Pour la fonction lire via une Liste déroulante
    annee : <html:select property="annee" onchange="setHidden('lire');" onchange="submit();">
     
    			<html:option value ="2007">2007</html:option>
                <html:option value ="2008">2008</html:option>
                <html:option value ="2009">2009</html:option>
                <html:option value ="2010">2010</html:option>
              </html:select>
    //La fonction save 
    <html:submit onclick="set('save');">SAVE</html:submit>
    Le problème se trouve en niveau de la fonction save qui me retourne l'erreur suivante :

    'document.Modification1Form.0' a la valeur null ou n'est pas un objet.

    L'autre fonction lire marche très bien sans problème.

    Votre aide sera la bienvenue.

  2. #2
    Expert éminent

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Je me demande comment cela peut fonctionner pour "lire" étant donné que tu fais appel à une fonction Javascript setHidden() alors que la fonction Javascript définie dans la jsp est set().
    De plus, tu as codé deux attributs onchange dans le tag select.

    Enfin, le form-bean s'appellant modification1Form, dans la fonction Javascript, il faut donc coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function set(target) {document.modification1Form.operation.value=target;}

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    Je me demande comment cela peut fonctionner pour "lire" étant donné que tu fais appel à une fonction Javascript setHidden() alors que la fonction Javascript définie dans la jsp est set().
    De plus, tu as codé deux attributs onchange dans le tag select.

    Enfin, le form-bean s'appellant modification1Form, dans la fonction Javascript, il faut donc coder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function set(target) {document.modification1Form.operation.value=target;}
    Oui pour votre première remarque c'est une erreur que j'ai commis lors de mes modifications ,j'ai oublié de remplacer le setHidden par le set maintenant c'est fait merci.

    Pour le onchange vue qu'il s'agit d'une liste déroulante sur laquelle je doit gerer deux actions. D'abord je dois récupérer l'année séléctionnée puis déclancher la fonction lire, bon j'ai trouver ceci bizarre moi aussi mais ça marche sinon vous me propser quoi comme alterantive pour utilser un seul onchange au lieu de deux.

    Pour le 3eme point c'est bon .

  4. #4
    Expert éminent

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Tout simplement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:select property="annee" onchange="set('lire');submit();">

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    Je viens de corriger mon code en tenant compte de vos remarques c nvy ,la bonne nouvelle c'est que l'erreur n'est plus.Mais rien ne se passe quand je clique sur mon bouton save sachant que la fonction lire marche bien comme au départ.

    Est ce que j'ai oublié un autre truc par hazard ?

  6. #6
    Expert éminent

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Oui, il faut ajouter le tag html:hidden dans le tag html:form avec une valeur par défaut, par exemple lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       <html:hidden property="operation" value="lire"/>
    D'ailleurs, je ne vois pas de tag html:form dans le code de la jsp.

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    J'ai ajouté le tag html:hidden ,cependant j'ai affaire toujours au meme probleme j'ai un bouton save inacttif c'est comme ci je clique sur le vide aucune action ne se déclanche et pas d'erreur.

    Voila mon nouveau code corrigé :

    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
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html:html locale="true">
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <html:base />
     
     
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<SCRIPT language="javascript" type="text/javascript">function set(target) {document.modification1Form.operation.value=target;}</SCRIPT>
     
        </script>
      </head>
     
      <body>
     
    <html:form action="/modification1"><div><br> <div><html:hidden property="operation" value="lire" />&nbsp;&nbsp; 
    <html:hidden property="operation" value="save"/>
     
     
    			annee : <html:select property="annee" onchange="set('lire');submit();">
     
    			<html:option value ="2007">2007</html:option>
                <html:option value ="2008">2008</html:option>
                <html:option value ="2009">2009</html:option>
                <html:option value ="2010">2010</html:option>
              </html:select>
              <html:errors property="annee"/><br/>
     
    <html:submit onclick="set('save');">SAVE</html:submit>
     
    </html:form>
      </body>
    </html:html>

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu as 2 fois le paramètre "operation", il n'en faut qu'un.

    A+

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    Ok c bon ça marche maintenant merci bcp.

    Cependant la fonction save fait sujet de l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    cause mère 
     
    java.lang.NullPointerException
     
    am.hiebrnate.Modifier.modifier(Modifier.java:22)
    com.am.struts.action.Modification1Action.save(Modification1Action.java:41)
    Bon si j'ai bien détécter l'objet null je dirais qu'il s'agit de la liste "modifs.getFinanceList()" qui est de type ArrayListe<Fianace> ,elle est sous forme de tableau dans ma page jsp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public ActionForward save(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    		Modification1Form modifs = (Modification1Form) form;		
    		Integer year=modifs.getAnnee();
    		Modifier.modifier(modifs.getFinanceList(),year);
    La methode getFianceListe est bien definie ,alors pourquoi elle me recupére un objet null ??

  10. #10
    Expert éminent

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Il faut mettre le scope du form-bean à session dans le mapping de l'Action.

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    J'ai modifié le scope en lui attribuant la valeur "session" ,.
    La bonne nouvelle c'est que j'ai plus l'erreur (objet -ArrayList-null).

    La mauvaise nouvelle c'est que après la premiere modification que j'ai appliqué à mon tableau via la fonction save ,il me semble que je n'arrive plus à apporter une deuxieme modification .

    Je pense que le fait de travailler avec une session matient la valeur des objets ,et ceci necessite un rafréchisseement du tableau dans mon cas je suppose !

  12. #12
    Expert éminent

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Je ne vois pas en quoi le fait de mettre le scope du form-bean à session t'empêche de modifier les éléments de la collection.

    As-tu un message d'erreur ?

    Pourrais-tu montrer le code complet de la page jsp ?

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    En fait puisque le but est de modifier un tableau dans ma page jsp ,je procéde comme suit:

    1-Je recupère le tableau avec le getFinaceListe à partir de la jsp apres modif.
    2-Je recupère le premier element du tableau qui est en fait une liste Finance car c'est un tab de liste ArrayList<Finance>.
    3-Je compare cette liste avce la liste avant modification.
    4-Si un element est modifié je fait un set dans ma base de donnée.

    Voila mon code :


    L'action save déclanché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    public ActionForward save(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    		Modification1Form modifs = (Modification1Form) form;		
    		Integer year=modifs.getAnnee();
    		Modifier.modifier(modifs.getFinanceList(),year);
    			return mapping.findForward("tout");
    	}
    la fonction modifier :

    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
     
    public class Modifier {
     
     
    	public static ArrayList<Finance> l;
    	public static void modifier (ArrayList<Finance> finan,Integer annee){
     
    		l=Charger.chargerList(annee);//ancienne liste
     
    				if(l.get(1).getJav()!=finan.get(1).getJav())// s'il ya inégalité 
     
    {	
    					changer.change(annee, "jav", "estime",finan.get(1).getJav()); //Je fait le set via une methode abstraite change
    		}
    	}
    J'ai pas de message d'erreur.
    Malheusement il s'avère qui ne se passe pas de modification ds ma BD.

  14. #14
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    Après certains test sur mon code je viens de découvrir ou se trouve le problème.

    Le problème c'est que mon code ne récupère pas le tableau après l'édition de l'utilisateur pas en utilisant un simple getFinanceListe en tout cas.

    Il prend que l'ancien tab avant la saisit de l'utilsateur .

    Voila comment mon tab est déclaré dans ma jsp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
     
      <nested:iterate property="financeList">
              <th height="65" bgcolor="#333366" scope="row"><nested:write property="type"/></th>          
         <td width="8"/><nested:text  size="5" property="jav" onChange=""  />
          <td width="8"/><nested:text  size="5" property="fev" />
           <td width="8"/><nested:text  size="5" property="mars" />
         <td width="8"/><nested:text  size="5" property="avril" />
           <td width="8"/><nested:text  size="5" property="mai" />
          <td width="8"/><nested:text  size="5" property="juin" />
          <td width="8"/><nested:text  size="5" property="juil" />
          <td width="8"/><nested:text  size="5" property="aout" />
           <td width="8"/><nested:text  size="5" property="sep" />
           <td width="8"/><nested:text  size="5" property="oct" />
            <td width="8"/><nested:text  size="5" property="nov" />
           <td width="8"/><nested:text  size="5" property="dec" />
            </tr>
            <tr>
             </nested:iterate>
    S'il quelqu'uns a une iddée sur comment je pourrais récupérer mes listes(tab) après modification j'en serai reconnaissant.

    Car le getFinaceListe ne donne pas de résulatats.

  15. #15
    Expert éminent

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Pour récupérer la collection modifiée, il faut tout simplement soumettre le formulaire.

  16. #16
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    Citation Envoyé par c_nvy Voir le message
    Pour récupérer la collection modifiée, il faut tout simplement soumettre le formulaire.
    Normalement c'est fait dans la fonction save :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public ActionForward save(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
     
    		Modification1Form modifs = (Modification1Form) form;		
    		ArrayList<Finance> lis=modifs.getFinanceList();
    		Modifier.modifier(lis,2009);
     
    		System.out.println(lis.get(0).getJav());
    			return mapping.findForward("tout");
    	}
    Mais d'après ce que j'ai compris , le get n'est pas suffisant pour récupérer mon arrayList<Finance> après édition .

    En poussant ma recherche un peu plus hier j'ai constater qu'il fallait utilser des lazyListe au lieu des nested! J'éspère que je n'aurais pas à les utiliser car je doit refaire tt le programme au cas contraire

  17. #17
    Expert éminent

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Avec les tags nested, une fois le formulaire soumis, tu dois pouvoir récupérer la liste modifiée via son getter.
    Les Lazy List ne sont utiles à mettre en oeuvre que si tu veux garder le scope du form-bean à request.

  18. #18
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    Pour l'action de modification j'ai mis le scope à session comme vous me l'aviez recommender mais seulement pour l'action modification.

    Lorsque je récupère ma liste dans la fonction save via son getter bah les valeur des elements ne changent pas ,je m'en suis assuréré en faisant un print lors de l'action .

    Je trouve ça bizzare en fait car j'ai bien déclarer mon getter ds mon form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Modification1Form extends ActionForm {
     
    	private static final long serialVersionUID = 4L; 
    	public   ArrayList<Finance> financeList;
    	private  Integer annee;
     
    	public void setFinanceList(ArrayList<Finance> financeList) {
    		this.financeList = financeList;
    	}
     
    	public  ArrayList<Finance> getFinanceList() {
    		return financeList;
    	}
    Et je fait un simple appele dans mon action comme n'importe quel bean du formulair :

    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
     
     
    	public ActionForward lire(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    		Modification1Form modifes = (Modification1Form) form;
    	 Integer anneeSelected=modifes.getAnnee();
     
    	 modifes.setAnnee(anneeSelected);
     ArrayList<Finance> m=Charger.chargerList(anneeSelected);
    	 modifes.setFinanceList(m) ;
    		return mapping.findForward("tout");	
    	}
    	public ActionForward save(ActionMapping mapping, ActionForm form,
    			HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
     
    		Modification1Form modifs = (Modification1Form) form;
    		Integer Selected=modifs.getAnnee();
    		ArrayList<Finance> lis=modifs.getFinanceList();
    		Modifier.modifier(lis,Selected);
    		System.out.println("hello :"+lis.get(0).getJav());
    			return mapping.findForward("tout");
    	}

  19. #19
    Expert éminent

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 793
    Points : 7 778
    Points
    7 778
    Par défaut
    Attention, si le form-bean est défini dans le mapping de plusieurs Actions, il faut mettre le scope de ce form-bean à session dans le mapping de toutes ces Actions.

  20. #20
    Membre du Club
    Inscrit en
    Septembre 2007
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 233
    Points : 67
    Points
    67
    Par défaut
    Voila comment j'utilise mon forme bean :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <html:form action="/modification1"> 
    <html:hidden property="operation" value="save"/>
     
          <p><br>Modification du budget Etud</p>
     
        <blockquote>
       <html:submit onclick="set('save')">SAVE</html:submit>
    Dois-je ajouter un "submit" dans le onclick pour garantir la soumission du formulair ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Probleme avec DispatchAction
    Par tomy29 dans le forum Struts 1
    Réponses: 20
    Dernier message: 06/11/2008, 16h09
  2. Probleme avec DispatchAction
    Par L Ankou dans le forum Struts 1
    Réponses: 3
    Dernier message: 11/02/2008, 09h56
  3. probleme avec DispatchAction
    Par ayoub2010 dans le forum Struts 1
    Réponses: 9
    Dernier message: 05/05/2007, 12h16
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

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