8 votes

Manipulation de formulaires avec plusieurs boutons / publications

J'ai la configuration de formulaire suivante :

        Validation en ligne de WEX SI

            Étape 1 : Sélectionnez le fichier à valider : 

            Étape 2 : Valider le fichier :

            Étape 3 : Télécharger et corriger les erreurs :

            Étape 4 : Soumettre

Comment dois-je gérer cela ? J'utilise Java/JSP/Servlets mais je ne suis pas sûr de comment gérer le post pour la partie de téléchargement et ensuite les autres actions.

Je pense qu'il serait préférable de créer un type de contrôleur de formulaire qui gère le post du formulaire et délègue à d'autres servlets en fonction de ce que l'utilisateur fait. Je ne sais pas comment savoir ce que l'utilisateur a sélectionné cependant.

3voto

BalusC Points 498232

Concernant tout autre élément normal , la paire name-value d'un sera envoyée en tant que paramètre de requête.

Le principal inconvénient est que les éléments et ne fonctionnent pas correctement dans MSIE. Dans toutes les versions de MSIE, l'attribut value d'un élément button ne sera pas envoyé en tant que valeur du paramètre, mais plutôt son contenu (le contenu de la balise) sera envoyé !

De plus, dans IE6, il y a un autre bug étonnant : non seulement la paire name-value du bouton pressé sera envoyée, mais aussi celles de tous les autres boutons non pressés dans le formulaire ! De cette manière, vous ne pouvez pas distinguer le bouton pressé du côté serveur.

La solution qui fonctionne en combinaison avec tous les navigateurs est d'utiliser et de leur donner un nom différent (ou le même nom mais une valeur différente).

Par exemple :

en combinaison avec :

if (request.getParameter("validate") != null) {
    // Bouton Valider pressé.
} else if (request.getParameter("download") != null) {
    // Bouton Télécharger pressé.
} else if (request.getParameter("submit") != null) {
    // Bouton Soumettre pressé.
}

ou

en combinaison avec :

String action = request.getParameter("action");
if ("Valider".equals(action)) {
    // Bouton Valider pressé.
} else if ("Télécharger".equals(action)) {
    // Bouton Télécharger pressé.
} else if ("Soumettre".equals(action)) {
    // Bouton Soumettre pressé.
}

La dernière méthode offre plus de possibilités pour abstraire l'un et l'autre de manière plus élégante au niveau Java.

Soit dit en passant, je suppose bien sûr que vous utilisez déjà Apache Commons FileUpload pour traiter les données de formulaire multipart, si nécessaire avec l'aide d'un Filtre qui remet les données de formulaire multipart dans la carte des paramètres de la requête, sinon vous n'obtiendrez rien de HttpServletRequest#getParameter().

2voto

DVK Points 63282

La valeur du bouton de soumission est transmise dans la requête POST ainsi que toutes les autres valeurs du formulaire, avec le nom étant le nom du bouton et la valeur étant la valeur du bouton.

Ainsi, vous pouvez détecter quel bouton a été appuyé en vérifiant l'existence de valeurs pour chaque clé associée à différents boutons (ou si vous nommez vos boutons de la même manière, vous pouvez simplement vérifier quelle est la valeur de la clé).

De plus, les éléments BUTTON nécessitent des gestionnaires onClick pour soumettre réellement le formulaire et/ou effectuer un travail (pour les éléments SUBMIT, le gestionnaire onClick par défaut appelle la méthode submit() du formulaire).

1voto

Vincent Ramdhanie Points 46265

Les boutons de type "button" ne soumettent pas automatiquement le formulaire. Seul le type "submit" le fera.

Si vous voulez plusieurs boutons qui soumettent chacun et effectuent différentes actions, alors vous avez plusieurs options. Je pense que l'option que vous mentionnez d'avoir un seul servlet décider de ce que l'utilisateur fait et renvoyer vers un autre servlet est une bonne idée. Vous pouvez déterminer ce que l'utilisateur fait en recherchant le nom du bouton dans la map d'attributs.

   String btn = request.getParameter("submitbuttonname");
   if(btn != null){
      //c'était le bouton cliqué.
   }

La deuxième option à laquelle je pense est de diviser le formulaire en plusieurs formulaires. Avez-vous besoin de soumettre le fichier pour chaque bouton? Si ce n'est pas le cas, créez un formulaire avec les données que vous devez soumettre, chacun avec son propre bouton de soumission.

0voto

kgiannakakis Points 62727

Apache Commons FileUpload peut gérer tout cela pour vous.

0voto

artemb Points 3303

Il peut être géré avec JavaScript.

function submitTo(url) {
    form.action = url;
    form.submit();
}

...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X