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 :

problème de passage d'une variable


Sujet :

Struts 1 Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Points : 43
    Points
    43
    Par défaut Redirection avec passage de paramètre
    Salut;
    je n'arrive pas à recupérer une valeur d'une ActionForm et la passer à une autre dans une même classe Action (DaispachAction)
    lorsque je intialise les deux ActionForm dans une même Action il me retourne une erreur(une seule Actionform par Action)
    c'est a dire je veux prendre une valeur d'une JSP associe à une ActionForm et faire une recherche dans une base par cette valeur puis afficher le resultat dans une autre jsp associe à une autre ActionForm , sachant que tous sont dans une même Action
    cad
    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
     
    public class AffecterDemandeAction extends DispatchAction{
     
        public ActionForward enregistrer(ActionMapping mapping,
                  ActionForm form,
                  HttpServletRequest request,
                  HttpServletResponse response)
                  throws IOException, ServletException,SQLException  {
     
              AffecterDemandeForm affecterForm =  ( AffecterDemandeForm)form; 
              ActionErrors errors = new ActionErrors();
              String agent=affecterForm.getAgent();
     
              if((agent.length()==0)||(agent==null))
                      {  
                  errors.add("erreurAgent", new ActionError("errors.agent"));
                  return mapping.findForward(CANCEL);
    }
              else{
              /* ici je récupère l’agent , j’accède à la base je fais une recherche par agent(select * from DEMANDES where AGENT= agent ;   
     puis je veux mettre le resultat dans une autre ActionForm(DetailsDemandeForm) et l'afficher dans une autre JSP  */
     
    return mapping.findForward(SUCCESS);
    }       
              saveErrors(request, errors);
     
          }
    le problème est qu’il ma dit à l’exécution que je ne peux pas instancier DetailsDemandeForm et AffecterDemandeForm dans une seule action AffecterDemandeAction

  2. #2
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Il te faut définir un actionForm exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class LoginForm extends ActionForm {
        private String m_username = "";
     
        public String getUsername() {
    	return this.m_username;
        }
     
        public void setUsername(String username) {
    	this.m_username = username;
        } 
    }

    Une action :

    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
     
    public class LoginAction extends Action {
     
    	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
    		HttpServletResponse response) throws Exception {
     
    //Recupere ton form : 
    LoginForm lf = (LoginForm)form;
    //dans loginForm tu as acces a ta valeur, donc peut donc faire ton traitement
     
     
    // une fois le traitement realisé tu peut l'ajouter à request afin que       
    //ta prochaine JSP y est accès sauf si tu laisses le scope session (voir ci dessous)
     
    		// On redirige vers la vue adaptée (voir struts-config)
    		return mapping.findForward("Success");
    	}
    }
    et dans struts config :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
               <form-beans>
    		<form-bean name="LoginForm" type="LoginForm" />
    	</form-beans>
                <action-mappings>
    	<action	path="/login" name="LoginForm" type="LoginAction" scope="session">
    		<forward name="Success" path="/test.jsp" />
    	</action>
               </action-mappings>
    Voilà avec ca tu devrais facilement y arriver!!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Points : 43
    Points
    43
    Par défaut sol
    pas de solution??????

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    salut,
    Avant de répondre à ta question j'aimerais d'abord attirer ton attention sur ce code que tu as écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if((agent.length()==0)||(agent==null))
                      {  
                  errors.add("erreurAgent", new ActionError("errors.agent"));
                  return mapping.findForward(CANCEL);
    }
    La remarque porte sur le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((agent.length()==0)||(agent==null))
    Ici si agent==null, le code agent.length() va lever un NullPointerException puisqu'il est évalué en premier dans cette expression. La solution c'est d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((agent==null)||(agent.length()==0))
    comme ça la partie agent.length() n'est pas évaluée si agent est null, car l'opérateur || fonctionne en court-circuit...
    Concernant ta question sur le transfert des ActionForm, je crois que tu confonds un peu le rôle d'un objet ActionForm. Les objets ActionForm sont créés par le framework Struts lui-même (le servlet controller ActionServlet, en l'occurence) et passés aux Actions. Donc dans la méthode execute() de l'action, tu ne peux pas caster l'ActionForm vers une classe pour laquelle il n'était pas configuré. Si l'action est configuré pour utiliser un objet de type "AffecterDemandeForm", tu ne vas pas le caster vers le type "DetailsDemandeForm" étant donné que l'instance créé par la servlet Struts n'est pas de ce type.
    Par contre, si tu veux malgré tout transférer l'objet AffecterDemandeForm que tu reçois vers une page JSP qui l'utilise pour l'affichage, dans ce cas, dans la méthode execute() tu pourrais enregistrer l'objet comme attribut de la requete ou de la session genre request.setAttribute("myform", affecterForm) puis faire un forward vers la page JSP qui pourrait alors récupérer ces informations pour l'affichage.
    Sinon, il faudrait que tu revois le flow de controle de ton application.
    Voilà, j'espère que ça pourrait t'aider.
    Bon courage.

  5. #5
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Je t'explique mon code.

    J'ai une jsp ayant, les tags suivants, en ayant pris soin de déclarer html comme tags struts.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <html:form action="/Login" >
      <html:text property="username" />
      <html:submit property="submit" />
    </html:form>
    Si tu mets toutes les classes que je t'ai donné, ainsi que tu mets ce que je t'ai donné dans struts config, MON CODE FAIT :

    Tu as une jsp avec un champ text. Tu le rempli. Quand tu cliques sur le bouton, la valeur est enregistrer par la form. Puis passe dans l'action, (la form est alors en parametre de l'action). Je recupere donc la valeur de ma form dans l'action (ce que tu voulais si je ne me trompe), donc après tu peux faire ce que tu veux avec ta donnée, allez en bas, etc. Et ensuite dans mon action, je redirige vers une autre jsp, (success, il faut regarder dans le bout de struts config que je t'ai rajouté pour voir vers quel JSp il est redirigé).

    Donc en gros c'est ce que tu voulais. A moins que je n'ai pas tout compris.

  6. #6
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Merci maxf1;
    le probléme est que je doit dans une seule classe Action instancier deux classes ActionForm pour passer la valeur d'une ActionForm à une autre ce que est interdit
    N'utilise pas 2 actionForm.
    Dans l'action, il te suffit de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.setAttribute("UnNomDeVariable", ta_variable_ou_objet);
    Juste avant de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return mapping.findForward("Success");
    Et dans la JSP dans laquelle tu vas redirigé, tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <%
    Object object = request.getAttribute("UnNomDeVariable");
    %>
    Et dans object tu auras la valeur que tu as passé dans ton action. (Valeur que tu auras calculé avec la valeur de l'autre JSP, donc ce que tu souhaite).

    S'il te plait, essaye de m'écrire sur le forum (et pas en message privée), sinon j'ai du mal à suivre le sujet étant donné que je donne pas mal de réponse,
    Merci

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Points : 43
    Points
    43
    Par défaut
    ceci est une solution classique mais je veux passer au JSP à travers sa ActionForm

  8. #8
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Ah ok. Je crois que j'ai réelement compris ce que tu veux, en gros tu veux présetter l'actionForm de ta jsp redirigé dans l'action de la jsp cliqué?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Points : 43
    Points
    43
    Par défaut
    Oui c'est ça

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    Citation Envoyé par maxf1
    S'il te plait, essaye de m'écrire sur le forum (et pas en message privée), sinon j'ai du mal à suivre le sujet étant donné que je donne pas mal de réponse,
    Merci
    Si vous vous écrivez plutot en messages privés, évidemment nous autres on va avoir beaucoup de mal à suivre le topic étant donné qu'il nous manquerait des informations.
    Sinon, je pense qu'il y a déjà suffisamment d'éléments maintenant pour résoudre ton problème. Si j'ai bien compris, c'est l'objet (ou la collection) retournée par la recherche dans la base de données que tu cherches à afficher dans une autre page JSP, et là je vois pas autre chose que de le mettre en attribut de requete ou de session, comme dans le code fourni par maxf1. Mais si tu tiens vraiment à ce que l'info soit transférée à travers un actionForm, je me dis que certainement les deux page jsp doivent utiliser la même actionForm ou en tout cas deux actionForm avec des champs identiques, ce qui à mon avis n'aurait pas beaucoup d'intérêt. Tu pourrais dans ce cas te contenter de forwarder vers la même jsp d'origine pour réutiliser l'actionForm contenant déjà les infos dont tu as besoin...
    Par contre, pour revenir un peu à ce que j'avais dit avant, tu n'as pas besoin de mettre à nouveau un actionForm dans les attributs de requete, parce qu'en réalité il s'y trouve déjà avant même que la requete soit tranférée à l'action et sa présence dans la signature de la méthode "execute()" de l'action n'y est surtout que par convenance parce qu'on pourrait y accéder par son nom déclaré dans struts-config.xml ( avec un request.getAttribute("myForm")), ce que tu pourrais faire aussi dans la jsp où tu forward la requete ...
    Voilà.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Points : 495
    Points
    495
    Par défaut
    OK, tu cherches donc à pré-remplir l'actionForm de la deuxième page JSP avant de l'afficher... Alors cette actionForm est associée à une autre action également. Donc dans la première action, tu récupères tes données dans la base, tu les stocke en attribut de requete, puis tu forward vers la deuxième action (en utilisant le path renseigné pour l'action-mapping de cette action). A ce moment, la deuxième action est appelée avec sa propre actionForm déjà instanciée et passée à la méthode execute(). De là tu remplis ta deuxième actionForm dans cette deuxième action en récupérant les infos que tu avais stockées en attribut de requete, puis tu affiches donc la deuxième jsp qui aura ses champs pré-remplis ...
    Je crois que ça devrait résoudre ton problème.

  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
    Etant donné que tu utilises une DispatchAction, je pense que le plus simple c'est de mettre toutes les propriétés de DetailsDemandeForm dans AffecterDemandeForm et donc, d'utiliser une seule ActionForm.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 63
    Points : 43
    Points
    43
    Par défaut solution
    et si j'utilise une simple Action pas DispachAction

  14. #14
    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
    Dans l'Action liée à l'ActionForm AffecterDemandeForm, dans laquelle tu récupères l'agent, tu mets l'agent dans le scope request via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    request.setAttribute("agent",agent);
    .
    Ensuite, cette Action fait un forward vers une autre Action dans laquelle tu récupères l'agent via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String agent=(String) request.getAttribute("agent");
    Tu peux donc ainsi interroger la base de données en fonction de l'agent et initialiser ton deuxième formulaire DetailsDemandeForm.
    Et enfin, cette deuxième Action fait un forward vers la deuxième jsp.

    C'est à peu près ce que manblaizo t'avait proposé précédemment.

  15. #15
    Membre expérimenté Avatar de maxf1
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 229
    Points : 1 371
    Points
    1 371
    Par défaut
    Citation Envoyé par maxf1
    N'utilise pas 2 actionForm.
    Dans l'action, il te suffit de faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    request.setAttribute("UnNomDeVariable", ta_variable_ou_objet);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <%
    Object object = request.getAttribute("UnNomDeVariable");
    %>
    Et moi alors? Je l'avais pas dit?

  16. #16
    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
    Citation Envoyé par maxf1
    Et moi alors? Je l'avais pas dit?
    Effectivement, je n'avais lu que les dernières réponses.
    Toutes mes excuses maxf1.

Discussions similaires

  1. Problème de passage d'une variable
    Par Jiyuu dans le forum Django
    Réponses: 2
    Dernier message: 26/08/2009, 12h31
  2. Réponses: 1
    Dernier message: 21/12/2005, 19h08
  3. passage d'une variable dans une frame
    Par Atchoum_002 dans le forum Langage
    Réponses: 2
    Dernier message: 17/10/2005, 17h06
  4. passage d'une variable en parametre
    Par duga dans le forum Langage
    Réponses: 4
    Dernier message: 11/09/2005, 12h19
  5. [C#] Passage d'une variable pour un controluser
    Par julio84 dans le forum ASP.NET
    Réponses: 10
    Dernier message: 07/04/2005, 13h50

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