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 :

formulaire dynamique avec struts


Sujet :

Struts 1 Java

  1. #1
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 11
    Par défaut formulaire dynamique avec struts
    Bonjour,

    J'utilise struts 1 sur une plateforme websphere 6.1.

    J'ai un formulaire JSP, son but est de modifier certains attributs d'une liste d'objets donnée. Donc dans mon formulaire, j'ai un tableau html dont le nombre de lignes est variable : une ligne par objet avec un champs html:text .

    Je prépare la liste d'objets en amont, je l'envoie à la JSP ; Tout va bien, la liste est récupéré par la JSP est affiche un formulaire prérempli.

    mais quand je valide le formulaire, la class ModifierTauxMajorationForm ne récupère pas les données.
    Voici mon code :

    dans struts config.xml :
    <form-beans type="org.apache.struts.action.ActionFormBean">
    <form-bean name="ModifierTauxMajorationForm" type="package.struts.ModifierTauxMajorationForm" />

    Contenu de tauxMajorationIHM :
    package package;

    import
    [...]

    public class TauxMajorationIHM implements java.io.sarializable {
    private String codePdr;
    private String annemaj;
    private String tauxMaj;
    private String dateDebutPdr;
    private String dateFinPdr;
    [...]


    Extrait de ma JSP :

    <html:form>
    <table>
    <% int i = 0 ;%>
    <td><tr>
    <logic:iterate id="tauxMajorationIHM" name="ModifierTauxMajorationForm" property="listeTauxMajorationIHM" type="package.TauxMajorationIHM">

    <html:hidden property='<%="listeTauxMajorationIHM["+i+"].anneeMaj"%>' value="<%= tauxMajorationIHM.getAnneeMaj()%>"/>
    <html:hidden property='<%="listeTauxMajorationIHM["+i+"].codePdr"%>' value="<%= tauxMajorationIHM.getCodePdr()%>"/>
    <html:hidden property='<%="listeTauxMajorationIHM["+i+"].dateDebutPdr"%>' value="<%= tauxMajorationIHM.getDateDebutPdr()%>"/>
    <html:hidden property='<%="listeTauxMajorationIHM["+i+"].dateFinPdr"%>' value="<%= tauxMajorationIHM.getDateFinPdr()%>"/>


    A saisir : <html:text maxlength="10" size="8" property='<%="listeTauxMajorationIHM["+i+"].tauxMaj"%>' value="<%= tauxMajorationIHM.getTauxMaj()%>"/></font>
    </td></tr>
    <%i = i + 1 ;%>
    </logic:iterate>
    dans mon ActionForm :
    package package.struts;

    import java.io.Serializable;
    import java.util.Enumeration;
    import java.util.Vector;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;

    import org.apache.struts.action.ActionError;
    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionMapping;

    public class ModifierTauxMajorationForm extends ActionForm implements Serializable {

    private Vector mListeTauxMajorationIHM;

    public ActionErrors validate(ActionMapping aMapping, HttpServletRequest aRequest) {

    // Liste des erreurs de saisie
    ActionErrors errors = new ActionErrors();

    /* Recuperer les valeurs du formulaire */
    Enumeration enumTaux;
    TauxMajorationIHM tauxMajorationIHM = null;


    // Recuperation de la session HTTP
    HttpSession session = aRequest.getSession();


    tauxMajorationIHM = (TauxMajorationIHM) mListeTauxMajorationIHM.elementAt(0);
    anneeMaj = tauxMajorationIHM.getAnneeMaj();
    ...
    Le plantage est sur :
    tauxMajorationIHM = (TauxMajorationIHM) ListeTauxMajorationIHM.elementAt(0);

    il s'agit d'une exeception array index out of range : 0 ;
    => en fait le vecteur mListeTauxMajorationIHM envoyé de la jsp a ModifierTauxMajorationForm est vide ...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 160
    Par défaut
    Salut,

    Pourquoi tu passes par cette méthode?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class ModifierTauxMajorationForm extends ActionForm implements Serializable {
     
    private Vector mListeTauxMajorationIHM;
     
    public ActionErrors validate(ActionMapping aMapping, HttpServletRequest aRequest) {
    le mieux ne serait-il pas d'utiliser la méthode execute?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	@Override
    	public ActionForward execute(ActionMapping mapping, ActionForm form,
    		HttpServletRequest request, HttpServletResponse response)
    	throws Exception {
    Ainsi tu as ton ActionForm avec lequel tu peux récupérer les valeurs de ton formulaire.

    Ici tu utilise directement du code java,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <html:hidden property='<%="listeTauxMajorationIHM["+i+"].anneeMaj"%>' value="<%= tauxMajorationIHM.getAnneeMaj()%>"/>
    <html:hidden property='<%="listeTauxMajorationIHM["+i+"].codePdr"%>' value="<%= tauxMajorationIHM.getCodePdr()%>"/>
    je pense que le mieux serait plutôt d'avoir recours a des EL qui te permettent d'éviter d'insérer du code java dans une jsp ( t'as un super tutos ici:http://adiguba.developpez.com/tutoriels/j2ee/jsp/el/)

  3. #3
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 11
    Par défaut
    salut, merci pour la réponse.

    Salut,

    Pourquoi tu passes par cette méthode?

    Code :

    public class ModifierTauxMajorationForm extends ActionForm implements Serializable {

    private Vector mListeTauxMajorationIHM;

    public ActionErrors validate(ActionMapping aMapping, HttpServletRequest aRequest) {

    le mieux ne serait-il pas d'utiliser la méthode execute?

    Code :

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response)
    throws Exception {
    Ainsi tu as ton ActionForm avec lequel tu peux récupérer les valeurs de ton formulaire.
    En fait j'utilise Validate() pour valider mon Formulaire struts : je fais quelques tests sur les données qui sont saisies.

    Après validate, j'utilise pour faire mon traitement :

    public class ModifierTauxMajorationAction extends Action {

    public ActionForward perform(ActionMapping aMapping, ActionForm aForm, HttpServletRequest aRequest, HttpServletResponse aResponse)
    {

    String action = "action_suivante";
    ActionErrors errors = new ActionErrors();

    ModifierTauxMajorationForm modifierTauxMajForm = (ModifierTauxMajorationForm) aForm;
    Vector listeTauxMajorationIHM ;

    try {

    listeTauxMajorationIHM = ModifierTauxMajorationForm.getListeTauxMajorationIHM();
    //traitement java pour mettre à jour la base de données avec les valeurs de tabTauxMajorationIHM

    }
    catch (Exception e)
    { errors.add("appelerConsulterTauxMaj", new ActionError("error.chargement.listeTauxMajoration")); }
    saveErrors(aRequest, errors);
    ActionForward af = aMapping.findForward(action);
    String pagePhys = af.getPath();
    return af;
    }
    A titre de test, j'ai vidé la validate() pour aller directment dans cette methode Perform ; Là aussi je récupère pas mes données.
    En fait le gros du problème est que j'arrive pas à avoir après saisie sur la JSP un objet form contenant un vector listeTauxMajorationIHM non vide.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    160
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2008
    Messages : 160
    Par défaut
    Salut,

    Il me semble que l'ActionForward doit être la surcharge de la méthode execute ( d'ou le overide). ensuite, c'est normal que tu ne récupère pas tes valeurs car tu transforme l'ActionForm en (ModifierTauxMajorationForm)

    Voila comment je récupère mes valeurs si par exemple j'ai dans un formulaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <html:text name="eleveForm" property="nom" />
    Et dans la methode execute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		DynaActionForm dynaform = (DynaActionForm) form;
    		String nomEleve=  dynaform.getString("nom"); //Dans le cas d'une chaine.

  5. #5
    Expert confirmé

    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
    Par défaut
    Il suffit de mettre le scope de ModifierTauxMajorationForm à session dans le mapping des Actions liées à ce formulaire.

  6. #6
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 11
    Par défaut
    merci pour vos réponses. Je suis désolé, j'ai oublié quelques précisions :

    -> j'ai d'autres champs , de simples String ou int dans le formulaire, qui eux passent sans problèmes dans l'actionForm. Le problème concerne juste le vecteur mListeTauxMajorationIHM.

    ->en fait je suis en fait en train de réaliser une migration de websphere 4 à websphere 6 ; l'appli est un existant, le code que j'ai posté fonctionnait bien sur W4 et c'est depuis la migration sur Websphere que j'ai des soucis avec le vecteur. je me demande si ca n'est pas lié a une montée de version de struts, ou quelque chose dans ce gout-là ....

    j'ai essayé de mettre "scope=session" sur mon form, mais là je ne récupère plus aucune donnée ...

  7. #7
    Expert confirmé

    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
    Par défaut
    Citation Envoyé par tinkywinky Voir le message
    j'ai essayé de mettre "scope=session" sur mon form, mais là je ne récupère plus aucune donnée ...
    As-tu bien mis scope="session" dans le mapping de toutes les Actions liées au form-bean ModifierTauxMajorationForm ?

    Concernant une éventuelle montée de version de Struts, il faudrait que tu saches exactement avec quelle version tu travailles parce que vu le code que tu as posté, il semblerait que ce soit une 1.0.
    Avec les versions récentes, la méthode perform est remplacée par la méthode execute et la classe ActionError par la classe ActionMessage.
    Donc si vraiment la version de Struts a changé, tu devrais avoir des messages d'erreur.

  8. #8
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 11
    Par défaut
    Concernant une éventuelle montée de version de Struts, il faudrait que tu saches exactement avec quelle version tu travailles parce que vu le code que tu as posté, il semblerait que ce soit une 1.0.
    Avec les versions récentes, la méthode perform est remplacée par la méthode execute et la classe ActionError par la classe ActionMessage.
    Donc si vraiment la version de Struts a changé, tu devrais avoir des messages d'erreur.
    Ok. j'ai vérifié c'est toujours Struts 1.
    En fait je continue le travail de quelqu'un d'autre, c'est pour ca que je n'étais plus sûr de ce qui était fait.


    As-tu bien mis scope="session" dans le mapping de toutes les Actions liées au form-bean ModifierTauxMajorationForm ?
    Effectivement j'en avais oublié un. Et là, ca a marché, merci ! coment cela se fait -il que les données ne peuvent pas circuler avec un scope=request ? (et surtout pourquoi ca marchait sous websphere 4 ???)
    Enfin, encore merci.

  9. #9
    Expert confirmé

    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
    Par défaut
    En fait, je ne comprends pas bien comment cela pouvait fonctionner en l'état sous Websphere 4.

    En effet, dans ton cas, la requête commence à l'appel de l'Action qui remplit le vecteur et donc initialise le formulaire avec ce vecteur remplit.
    Quand la jsp s'affiche, la réponse a été construite et envoyée au navigateur, ce qui signifie que la requête est terminée.
    Si le form-bean est dans le scope request, celui-ci est réinstancié au submit du formulaire, parce que c'est une nouvelle requête qui est envoyée.
    Ceci explique pourquoi tu as le message d'erreur indiquant que le vecteur est vide.

  10. #10
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 11
    Par défaut
    En fait, je ne comprends pas bien comment cela pouvait fonctionner en l'état sous Websphere 4.

    En effet, dans ton cas, la requête commence à l'appel de l'Action qui remplit le vecteur et donc initialise le formulaire avec ce vecteur remplit.
    Quand la jsp s'affiche, la réponse a été construite et envoyée au navigateur, ce qui signifie que la requête est terminée.
    Si le form-bean est dans le scope request, celui-ci est réinstancié au submit du formulaire, parce que c'est une nouvelle requête qui est envoyée.
    Ceci explique pourquoi tu as le message d'erreur indiquant que le vecteur est vide.
    Je vois. Mais dans ce cas, la nouvelle requête qui est envoyée après le submit contient bien les données saisies dans le formulaire ? et le form-bean réinstancié (en particulier le vecteur) n'est pas instancié avec ces données ?

  11. #11
    Expert confirmé

    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
    Par défaut
    Effectivement, la nouvelle requête envoyée au submit du formulaire contient bien les données saisies mais le vecteur étant réinstancié, celui-ci a une taille égale à zéro et c'est un vecteur simple et non plus un vecteur d'objets TauxMajorationIHM. Il ne saura donc pas le "repeupler" avec les données saisies dans le formulaire.

    Le plus simple est donc de mettre le form-bean en scope session.

    Mais il existe une solution avec le form-bean en scope request en utilisant les Lazy List.

  12. #12
    Membre habitué
    Inscrit en
    Février 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 11
    Par défaut
    Ok je comprends mieux.
    Merci pour le lien!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. include dynamique avec struts
    Par LeXo dans le forum Struts 1
    Réponses: 2
    Dernier message: 26/10/2007, 11h11
  2. formulaire dynamique avec Label For
    Par stardeus dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 03/05/2007, 13h39
  3. Utilisation des formulaires dynamiques avec struts
    Par nabdelghafour dans le forum Struts 1
    Réponses: 1
    Dernier message: 30/03/2007, 11h58
  4. Réponses: 13
    Dernier message: 08/02/2007, 17h05
  5. Formulaire Dynamique Avec Struts
    Par tarakakik dans le forum Struts 1
    Réponses: 1
    Dernier message: 24/08/2006, 13h22

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