2010-01-27 5 views
8

J'ai la configuration du formulaire ci-dessous:formes de manipulation avec plusieurs boutons/messages

<html> 
<head></head> 

<body> 
<form method="post" enctype="multipart/form-data" action="FileUpload"> 
    <table> 
     <th>WEX SI Online Validation</th> 
     <tr> 
      <td>Step 1: Select File for Validation: </td> 
      <td><input name="filename" type="file"/></td> 
     </tr> 
     <tr> 
      <td>Step 2: Validate File:</td> 
      <td><input name="validate" type="button" value="Validate"/></td> 
     </tr> 
     <tr> 
      <td>Step 3: Download and Fix Errors:</td> 
      <td><input name="download" type="button" value="Download"/></td> 
     </tr> 
     <tr> 
      <td>Step 4: Submit</td> 
      <td><input name="submit" type="submit" value="Submit"/></td> 
     </tr> 
    </table> 
</form> 
</body> 

</html> 

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

Je pense qu'il serait préférable de créer une sorte de contrôleur de formulaire qui gère la publication du formulaire et déléguée à d'autres servlets en fonction de ce que fait l'utilisateur. Je ne sais pas trop comment dire ce que l'utilisateur a choisi.

Répondre

3

Comme pour tout autre élément <input> normal, la paire name-value d'un <input type="button"> sera envoyée en tant que paramètre de demande. Le principal inconvénient est que les éléments <input type="button"> et <button> ne fonctionnent pas correctement dans MSIE. Dans toutes les versions de MSIE, l'attribut value d'un élément de bouton ne sera pas envoyé comme valeur de paramètre, mais son corps (le contenu de la balise) sera envoyé! De plus, dans IE6, il y a un autre bug étonnant: non seulement la paire nom-valeur du bouton pressé sera envoyée, mais tous les autres boutons non pressés du formulaire seront également envoyés! De cette façon, vous ne pouvez pas du tout distinguer le bouton enfoncé du côté serveur.

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

E.g.

<input type="submit" name="validate" value="Validate"> 
<input type="submit" name="download" value="Download"> 
<input type="submit" name="submit" value="Submit"> 

en combinaison avec

if (request.getParameter("validate") != null) { 
    // Validate button pressed. 
} else if (request.getParameter("download") != null) { 
    // Download button pressed. 
} else if (request.getParameter("submit") != null) { 
    // Submit button pressed. 
} 

ou

<input type="submit" name="action" value="Validate"> 
<input type="submit" name="action" value="Download"> 
<input type="submit" name="action" value="Submit"> 

en combinaison avec

String action = request.getParameter("action"); 
if ("Validate".equals(action)) { 
    // Validate button pressed. 
} else if ("Download".equals(action)) { 
    // Download button pressed. 
} else if ("Submit".equals(action)) { 
    // Submit button pressed. 
} 

La dernière façon offre plus de possibilités d'abstraire l'un et l'autre plus d'bien à Java l Evel.

D'ailleurs, je suppose de cours que vous utilisez déjà Apache Commons FileUpload pour traiter les données de formulaire multipart, le cas échéant avec l'aide d'un Filter which puts the multipart form data back in the request parameter map, sinon vous ne tirerez rien de HttpServletRequest#getParameter().

+0

J'essaie d'utiliser la dernière suggestion que vous avez faite, tous les boutons de soumission, avec le même nom, des valeurs différentes, mais quand je récupère l'action de ma demande, elle est toujours nulle. J'ai le même html que ci-dessus, sauf avec les changements de nom. – Casey

+0

Lisez le dernier paragraphe de ma réponse :) – BalusC

+0

Pour l'instant, je ne suis pas en train d'analyser quoi que ce soit. J'ai juste le formulaire appelant ma servlet de contrôleur. Cependant, puisque le formulaire est défini sur multipart/form-data, je suppose que je dois mettre l'information au bon endroit. – Casey

0

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

+0

et comment exactement? – Bozho

+0

Je l'utilise déjà pour gérer le téléchargement réel. Tous les boutons ne soumettent pas de fichiers mais déclenchent d'autres processus en arrière-plan. – Casey

1

Les boutons type "button" ne soumettent pas automatiquement le formulaire. Seul le type = "submit" sera.

Si vous souhaitez que différents boutons soumettent et exécutent des actions différentes, vous disposez de plusieurs options. Je pense que l'option que vous avez mentionnée pour avoir une seule servlet décide de ce que l'utilisateur fait et transmet à une autre servlet est une bonne idée. Vous pouvez dire ce que fait l'utilisateur en recherchant le nom du bouton dans la carte des attributs.

String btn = request.getParameter("submitbuttonname"); 
    if(btn != null){ 
     //this was the button clicked. 
    } 

La deuxième option que je peux penser est de diviser le formulaire en plusieurs formes. 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 chacune avec son propre bouton de soumission.

2

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

Ainsi, vous pouvez détecter quel bouton a été poussé en vérifiant l'existence de valeurs pour chaque touche 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é).

En outre, les éléments BUTTON ont besoin des gestionnaires onClick à soumettre effectivement la forme et/ou de tout travail (pour soumettre des éléments par défaut gestionnaire onClick appelle le formulaire de submit())

0

Il peut être manipulé avec JavaScript.

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

...

<input name="download" onClick="submitTo('/download')" ... /> 
0

La meilleure approche est d'avoir un contrôleur de formulaire pour déléguer la logique des classes d'autres, en fonction des valeurs de type entrée transmis en tant que paramètres.