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 :

Changer l'url après validation d'un ActionForm


Sujet :

Struts 1 Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut Changer l'url après validation d'un ActionForm
    Bonjour,

    J'ai un formulaire trés simple décrit de la manière suivante dans mon fichier struts-config
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form-bean name="FormulaireAjoutAdresseMAC" type="page.mac.FormulaireAjout">
    	<form-property name="adresseMAC" type="java.lang.String" initial=""/>
    </form-bean>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <html:form action="/adresse-mac/ajouter" method="post" >
    	Adresse : <html:text property="adresseMAC" />
    	<html:submit value="Ajouter"/>
    </html:form>
    J'ai crée une action permettant de traiter ce formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <action
    	path="/adresse-mac/traiter-formulaire"
    	name="FormulaireAjoutAdresseMAC"
    	scope="request"
    	validate="true"
    	input="/adresse-mac/erreurs.do"
    	parameter="/adresse-mac.do"
    	type="org.apache.struts.actions.ForwardAction"
    />
    En l'état le comportement de mon petit programme est le suivant : Lorsque je clique sur le bouton Ajouter de mon formulaire, la méthode validate de ma classe FormulaireAjout est appelée.
    En cas d'erreur : redirection vers /adresse-mac/erreurs.do
    En cas de réussite : redirection vers /adresse-mac.do

    Seulement voilà, lors de la redirection, l'url obtenue est celle de l'action /adresse-mac/traiter-formulaire (http://.../adresse-mac/traiter-formulaire.do) ce qui casse la plupart des liens de la page jsp mappée sur l'action /adresse-mac. J'ai donc besoin que la redirection soit absolue et me permette d'obtenir http://.../adresse-mac.do ou http://.../adresse-mac/erreurs.do

    Pour une action classique, j'ai lu qu'il suffisait de faire des <forward> avec redirect="true" mais dans le cas présent j'ignore totalement comment rediriger correctement vers /adresse-mac.do ou /adresse-mac/erreurs.do

    Des idées ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Seulement voilà, lors de la redirection, l'url obtenue est celle de l'action /adresse-mac/traiter-formulaire (http://.../adresse-mac/traiter-formulaire.do) ce qui casse la plupart des liens de la page jsp mappée sur l'action /adresse-mac. J'ai donc besoin que la redirection soit absolue et me permette d'obtenir http://.../adresse-mac.do ou http://.../adresse-mac/erreurs.do
    Je n'ai pas du tout compris "ce qui casse la plupart des liens de la page jsp".
    Et que veux tu dire par "l'url obtenue".

    Pour une action classique, j'ai lu qu'il suffisait de faire des <forward> avec redirect="true" mais dans le cas présent j'ignore totalement comment rediriger correctement vers /adresse-mac.do ou /adresse-mac/erreurs.do
    Je ne pense pas que le redirect ait quelque chose à voir là dedans à première vue.

  3. #3
    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
    Si c'est un problème d'url relative ou absolue, tu peux ajouter le tag <html:base/> dans la balise <head> de tes jsp qui permet d'utiliser des url relatives basées sur l'url de la page elle-même.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Pour ma part j'ai toujours travaillé dans mes JSP en URL absolue en prenant soin de concaténer le context path à une URL relative.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    src="<%= request.getContextPath() %>/user/desktop.do"
    Je ne sais pas sis c'est une bonne habitude mais j'ai appris comme ça.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut
    Tout d'abord merci pour vos réponses.

    Mon problème ne se situe pas dans le fait que les url soient relatives ou non. Les url absolues seraient toutefois une solution (et je pense qu'à terme je vais opter pour çà, avec des EL) mais j'aimerais quand même, par curiosité, savoir s'il existe une solution qui répondent à mon raisonnement initial (permettre de rediriger au niveau de l'input).
    Le html:base me paraît être aussi un moyen plus pratique de fonctionner en absolu sans alourdir les liens.

    En fait, mon problème se situait dans le fait que l'attribut "input" ne permet pas de définir si l'on désire effectuer une réexpedition (forward) ou une redirection, comme ce serait normalement le cas avec une action classique de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <action ...>
    	<forward ... redirect="true/false" />
    </action>
    En cherchant, j'ai tout de même pu trouver une piste de réflexion dans un bouquin (cf Jakarta Struts, collection Précis et concis).
    En effet, il existe un attribut de la balise controller qui permet d'utiliser des actions au sein d'un input.

    Ainsi l'instruction <controller inputForward="true" /> permet d'écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <action
    	path="/adresse-mac/traiter-formulaire"
    	name="FormulaireAjoutAdresseMAC"
    	scope="request"
    	validate="true"
    	input="monForward"
    	parameter="/adresse-mac.do"
    	type="org.apache.struts.actions.ForwardAction"
    >
    	<forward name="monForward" path="/adresse-mac/erreurs.do" redirect="true/false">
    </action>
    Après test, ça fonctionne au niveau de la redirection, mais pour une raison que j'ignore, le fait d'utiliser une redirection au lieu d'une réexpédition entraîne la perte des informations d'erreurs. Et là je sèche complètement .

    Enfin, au final, je pense que je vais changer la structure de ma gestion d'erreurs en quelque chose de moins exotique que ce que j'avais prévu au départ.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Tout d'abord une question : pourquoi tiens tu absolument à fonctionner en mode "redirect" ?

    Après test, ça fonctionne au niveau de la redirection, mais pour une raison que j'ignore, le fait d'utiliser une redirection au lieu d'une réexpédition entraîne la perte des informations d'erreurs. Et là je sèche complètement .
    Cela me parrait normal. Le mode redirect envoie un message au client web (le navigateur) afin que celui ci regénère une requête HTTP vers la ressource désirée. Le fait de changer de requête HTTP fait que tu perds ce qui était présent en attribut de la requête précédente (en l'occurrence tes erreurs).

    La vrai question à se poser est : pourquoi redirect ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut
    J'ai besoin du mode redirect pour un cas spécifique, un exemple sera sans doute plus parlant :

    Prenons le cas d'une page produits.html qui affiche une liste de produits. Sur cette page, je peux ajouter un produit en cliquant sur ajouter. Ce clic m'amène donc sur produit/ajouter.html sur lequel je saisis les informations. Logiquement, une fois mes informations saisies et une fois déclenché l'évènement de fin de saisie (ici le clic sur le bouton valider) il y ai deux cas :

    - ce que j'ai saisi est valide, je m'attends donc à retourner sur produits.html et non pas sur produit/ajouter.html qui serait le résultat d'une réexpédition sur produits.html.
    Note : C'est ici que je voulais parler de liens relatifs cassés. En effet, les liens relatifs de produits.html ne fonctionnent plus sous produit/ajouter.html. Toutefois, l'absolu résoud le souci.

    - ce que j'ai saisi est invalide et, dans la logique désirée par le développeur, les erreurs sont affichées sur la page de listing (produits.html). Je m'attends donc là aussi à retourner sur produits.html comme évoqué dans le premier cas.


    Le mode redirect envoie un message au client web (le navigateur) afin que celui ci regénère une requête HTTP vers la ressource
    Effectivement, c'est logique. Après, existe-t-il un moyen de retransmettre ces données ? Peut être en étendant la classe ForwardAction pour ce cas précis.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Donc, c'est bien ce que je disais; ce n'est pas une question de redirect.

    Je pense que tu confonds deux choses

    - la redirection au sens HTTP qui est prise en charge par l'attribut redirect d'un actionForward

    - et la redirection au sens struts qui est l'actionForward lui même.

    Dans tous les cas, à la fin de l'exécution d'une action, struts tente d'activer un actionForward c'est à dire d'effectuer une redirection.

    Dans ton cas, si la validation du formulaire donne des erreurs on redirigera sur le chemin désigné par l'attribut input et sinon vers le chemin désigné par l'attribut parameter.

    Je te conseille de bien intégrer (par la lecture de documentation) le cycle de vie d'une requête HTTP dans une application Struts. C'est primordial.
    N'hésite pas à passer au debugger dans les action et dans le requestProcessor pour bien comprendre ce que fait Struts.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut
    Je ne comprends pas ta réponse par rapport à l'exemple que j'ai donné :/.

    ce que j'ai saisi est valide, je m'attends donc à retourner sur produits.html et non pas sur produit/ajouter.html qui serait le résultat d'une réexpédition sur produits.html.
    En utilisant la redirection au sens struts (que j'appelle réexpédition, d'après le livre cité plus haut), il est possible d'avoir ce comportement côté client ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Et bien, ce n'est pas très facile de te suivre car dans ton premier exemple tu parles d' "adresseMAC" et dans ton dernier tu parles de "produits".

    Je n'arrive pas à faire le lien et à visualiser ta configuration Struts pour l'exemple des produits.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut
    Oui, c'est vrai que je ne suis pas très clair, j'ai voulu faire un second exemple plus simple (les produits). Plutôt que de parler d'adresse mac ou de produits on pourrait généraliser en "éléments".

    La configuration struts pourrait être la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <form-bean name="FormulaireAjoutElement" type="classe.FormulaireAjoutElement">
    	<form-property name="element" type="java.lang.String" initial=""/>
    </form-bean>
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <action path="/listeElements" forward="listeElements.jsp" />
    <action
    	path="/listeElements/ajouter"
    	name="FormulaireAjoutElement"
    	scope="request"
    	validate="true"
    	input="/listeElements.do"
    	parameter="/listeElements.do"
    	type="org.apache.struts.actions.ForwardAction"
    />
    L'idée c'est ça : en cas d'erreur ou de réussite on arrive sur la page listeElements.do, qui affichera les erreurs s'il y en a.
    Côté client, il ne faut pas que la barre d'adresse affiche /listeElements/ajouter.do, mais change bien en listeElements.do d'où mon choix des redirect.

    Tu me suis mieux ?

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Tu me suis mieux ?
    Presque. Tu n'as pas donné la définition de /listeElements/ajouter.do.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut
    Par définition tu entends quoi ? Le code de la classe associée ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Non, la définition du mapping dans le strutsConfig.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <action
    	path="/listeElements/ajouter"
    	name="FormulaireAjoutElement"
    	scope="request"
    	validate="true"
    	input="/listeElements.do"
    	parameter="/listeElements.do"
    	type="org.apache.struts.actions.ForwardAction"
    />
    N'est ce pas cela le mapping pour /listeElements/ajouter.do ? Je commence à douter d'avoir bien compris le fonctionnement de Struts :s

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Oui pardon, j'avais mal lu.

    Je viens de comprendre que tu as une seule page en fait.

    Ton code me semble correct en fait, sauf que pour être plus propre il vaudrait mieux que ton input pointe sur une jsp et non un mapping.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <action
    	path="/listeElements/ajouter"
    	name="FormulaireAjoutElement"
    	scope="request"
    	validate="true"
    	input="/listeElements.jsp"
    	parameter="/listeElements.do"
    	type="org.apache.struts.actions.ForwardAction"
    />
    Bon maintenant, pourquoi veux tu éviter que l'URL de la barre d'adresse montre /listeElements/ajouter.do ?

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut
    Eh bien pour deux raisons :

    - La première est que les liens sur la page sont cassés. En effet, même si /listeElements/ajouter.do représente la page /listeElements.jsp, les liens relatifs de la page sont calculés comme si /listeElements était un dossier contenant la page ajouter.do
    Par contre, avec des liens absolus, ce problème disparaît de lui même (c'est ce que j'ai fait et ça fonctionne)

    - La seconde est un peu différente. Que va penser un internaute s'il part de la page /listeElements.do pour ensuite arriver sur une page identique mais qui va porter l'url (au niveau de son navigateur) /listeElements/ajouter.do ?
    Pire, s'il copie le lien /listeElements/ajouter.do et l'envoie à un ami ? L'ami en question arrivera sur la page et tombera directement sur des erreurs comme quoi le formulaire n'a pas été rempli.

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Par contre, avec des liens absolus, ce problème disparaît de lui même (c'est ce que j'ai fait et ça fonctionne)
    Oui, c'est la discution précédente. Je pense que les URL absolues sont bien meilleures.

    - La seconde est un peu différente. Que va penser un internaute s'il part de la page /listeElements.do pour ensuite arriver sur une page identique mais qui va porter l'url (au niveau de son navigateur) /listeElements/ajouter.do ?
    Pire, s'il copie le lien /listeElements/ajouter.do et l'envoie à un ami ? L'ami en question arrivera sur la page et tombera directement sur des erreurs comme quoi le formulaire n'a pas été rempli.
    Je ne sais pas trop quoi répondre à ça. Je ne pense pas que struts ait une réponse toute faite pour ça.
    Effectivement, le redirect est peut être une bonne piste. Ceci dit, vu que tu perds tes erreurs, il faudrait mettre ton mapping en scope session.

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 15
    Par défaut
    En effet, j'ai l'impression aussi que Struts n'a pas de mécanisme intégré pour gérer le cas qui m'occupe.
    Je vais changer tout simplement la navigation prévue pour quelque chose de moins casse tête.

    Merci encore du temps que tu as passé à m'aider

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 75
    Par défaut
    Merci encore du temps que tu as passé à m'aider
    Avec plaisir, j'aime bien aller au fond des problèmes.

Discussions similaires

  1. Changer l'url après une action
    Par Nandou56 dans le forum Struts 1
    Réponses: 1
    Dernier message: 17/09/2012, 02h36
  2. Redirection vers URL après validation
    Par YG210844 dans le forum Struts 2
    Réponses: 1
    Dernier message: 25/08/2011, 17h25
  3. Exécuter une url après validation
    Par toony.m dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 10/04/2008, 14h13
  4. Formulaire : changer de page après avoir validé
    Par shaynee dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 23/01/2007, 10h38
  5. [Struts] changer l'url affiché apres un forward
    Par mauvais_karma dans le forum Struts 1
    Réponses: 5
    Dernier message: 31/08/2005, 13h31

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