IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Comment factoriser plusieurs actions réalisables sur un seul ActionForm ? : Le DispatchAction
auteur : Lionel Roux (aka RanDomX)
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.

<SCRIPT> function setHidden(value){document.formulaire.hidden.value=value;} </SCRIPT>

Dans le formulaire:

<html:form name="formulaire"> ... <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 champs hidden à la place de la méthode execute(...).

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é.

<action path="/cartManagement" type="app.management.CartAction" name="cartForm" scope="request" validate="true" 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.


Comment factoriser plusieurs actions réalisables sans JavaScript ? : Le LookupDispatchAction
auteur : Lionel Roux (aka RanDomX)
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 reprends le mécanisme du DispatchAction. Les seules différences résident dans la déclaration du nom du bouton de soumission qui doit être "submit".

<action path="/cartManagement" type="app.management.CartAction" name="cartForm" scope="request" validate="true" parameter="submit"/>
Dans la JSP, les boutons sont nommés grâce à une clé du ResourceBundle.

<html:form ...> <html:submit> <bean:message key="button.add"/> </html:submit> <html:submit> <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 :

protected Map getKeyMethodMap(ActionMapping mapping, ActionForm form, HttpServletRequest request) { Map map = new HashMap(); map.put("button.add", "add"); map.put("button.delete", "delete"); return map; }
Le reste est identique au DispatchAction.