FAQ StrutsConsultez toutes les FAQ
Nombre d'auteurs : 25, nombre de questions : 96, dernière mise à jour : 23 février 2015 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.
- 7.1. Validation (6)
- 7.2. Checkbox et Radiobutton (2)
- 7.3. Liste et Map (6)
- 7.4. Fichiers (4)
- Comment factoriser plusieurs actions réalisables sur un seul ActionForm ? Le DispatchAction
- Comment factoriser plusieurs actions réalisables sans JavaScript ? Le LookupDispatchAction
- Comment utiliser l'annulation d'un formulaire lorsqu'on utilise une LookupDispatchAction ?
- D'où provient l'erreur JavaScript « document.forms[0].submit is not a function » ?
Il est souvent pratique de pouvoir réaliser plusieurs actions sur un même formulaire.
Par exemple, pour la gestion d'un panier virtuel, il est possible d'ajouter, de modifier ou de supprimer un élément.
Pour réaliser simplement ce genre de tâche, on peut utiliser le DispatchAction qui concentre en une seule action, l'ensemble des opérations réalisables sur une seule JSP.
On utilise un simple JavaScript qui modifie la valeur d'un champ caché lors de la soumission.
Code HTML : | Sélectionner tout |
1 2 3 | <SCRIPT> function setHidden(value){document.formulaire.hidden.value=value;} </SCRIPT> |
Dans le formulaire:
Code JSP : | Sélectionner tout |
1 2 3 4 5 6 | <html:form action="/cartManagement"> ... <html:hidden property="hidden" value="default"/> ... <html:submit onclick="setHidden('add');">ADD ELEMENT</html:submit> </html:form> |
Ensuite dans l'Action concernée, il suffit de créer les méthodes portant les mêmes noms que les valeurs possibles du champ hidden à la place de la méthode execute(...).
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class CartAction extends DispatchAction { public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ... } public ActionForward remove(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ... } public ActionForward modify(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { ... } } |
Dans le fichier de configuration struts-config.xml, il faut ajouter à la déclaration de l'action l'attribut "parameter" et lui indiquer le nom du champ concerné.
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 8 | <action path="/cartManagement" type="app.management.CartAction" name="cartForm" scope="request" validate="true" input="/page.jsp" parameter="hidden"/> |
Il est aussi possible de créer des boutons dont les noms sont les noms des méthodes, car le nom d'un bouton est aussi la valeur renvoyée par celui-ci.
Si le JavaScript n'est pas actif ou pas souhaité, le DispatchAction ne peut fonctionner. Heureusement, Struts offre le LookupDispatchAction[org.apache.struts.actions.LookupDispatchAction] qui permet d'outrepasser cette limitation. Le LookupDispatchAction reprend le mécanisme du DispatchAction. Les seules différences résident dans la déclaration du nom du (ou des) bouton(s) de soumission qui doit être identique (attribut property de la balise submit) à la valeur (arbitraire) donnée à l'attribut parameter dans la définition de l'action.
Code JSP : | Sélectionner tout |
1 2 3 4 5 6 7 8 | <action path="/cartManagement" type="app.management.CartAction" name="cartForm" scope="request" validate="true" input="/page.jsp" parameter="monAction"/> |
Dans la JSP, les boutons sont nommés grâce à une clé du ResourceBundle.
Code JSP : | Sélectionner tout |
1 2 3 4 5 6 7 8 | <html:form action="/cartManagement"> <html:submit property="monAction"> <bean:message key="button.add"/> </html:submit> <html:submit property="monAction"> <bean:message key="button.delete"/> </html:submit> </html:form> |
Les valeurs passées sont ainsi localisées et changent donc en fonction de la locale. Pour mapper ces valeurs à une méthode particulière, on ajoute à l'Action une méthode qui est appelée lors de la soumission :
Code java : | Sélectionner tout |
1 2 3 4 5 6 | protected Map getKeyMethodMap() { Map map = new HashMap(); map.put("button.add", "add"); map.put("button.delete", "delete"); return map; } |
Le reste est identique au DispatchAction.
Depuis la version de struts 1.2.0, le LookupDispatchAction propose une action "cancelled" à surcharger par les classes filles.
Donc dans un formulaire, si vous avez plusieurs html:submit et un html:cancel vous n'avez plus à vous soucier de la manière de récupérer l'appel dans l'action.
Il suffit d'implémenter la méthode "cancelled" et d'ajouter la propriété cancellable pour l'action dans le fichier struts-config.xml (une sécurité pour explicitement déclarer que cette action est annulable) :
Code xml : | Sélectionner tout |
1 2 3 | <action ...> <set-property property="cancellable" value="true"/> </action> |
De plus, le fait d'utiliser html:cancel évite la validation du formulaire.
Attention : il ne faut pas mettre d'attribut "property" dans le tag html:cancel, car sinon plus rien ne marchera. En effet, la validation sera de nouveau effective et l'action voudra appeler la valeur de l'attribut property (identique au tag html:submit).
Quand on utilise du JavaScript dans une page jsp, il faut éviter de donner aux propriétés du formulaire des noms qui correspondent à des attributs des tags comme submit et action.
Exemple :
Code xml : | Sélectionner tout |
<html:submit property="submit" value="Valider">
Code xml : | Sélectionner tout |
<html:select property="itemSelected" onchange="document.forms[0].submit();">
On obtient le message d'erreur suivant induit par l'élément de formulaire identifié par "submit" :
Code : | Sélectionner tout |
document.forms[0].submit is not a function
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.