web-dev-qa-db-fra.com

Plusieurs boutons de soumission dans le même formulaire appelant différentes servlets

Tout d'abord, voici le code:

<form action="FirstServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" value="FirstServlet">
    <input type="submit"value="SecondServlet">
</form>

J'aimerais comprendre comment envoyer des informations au cas où le FirstServlet button a été pressé sur FirstServlet et au cas où le SecondServlet button _ a été pressé sur SecondServlet.

important:
Je veux le faire sous la même forme afin que les mêmes informations soient transférées aux deux servlets. (bien sûr, dans les servlets, je vais utiliser l'info en conséquence)

31
Eli Katzav

Il y a plusieurs façons d'y parvenir.

Le plus simple serait probablement d'utiliser JavaScript pour changer l'action du formulaire.

<input type="submit" value="SecondServlet" onclick="form.action='SecondServlet';">

Mais cela ne fonctionnera évidemment pas si l'utilisateur final a désactivé JS (navigateurs mobiles, lecteurs d'écran, etc.).


Vous pouvez également placer le deuxième bouton sous une forme différente, ce qui peut être ou ne pas être ce dont vous avez besoin, en fonction des exigences fonctionnelles concrètes, ce qui n’est pas clair du tout.

<form action="FirstServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" value="FirstServlet">
</form>
<form action="SecondServlet" method="Post">
    <input type="submit"value="SecondServlet">
</form>

Notez qu'un formulaire lors de l'envoi n'enverrait que les données d'entrée contenues dans le même formulaire, pas dans l'autre formulaire.


Encore une autre solution consiste simplement à créer un autre servlet à point d’entrée unique qui sera délégué aux bons servlets (ou, de préférence, aux bonnes actions commerciales) en fonction du bouton enfoncé (qui est lui-même disponible en tant que paramètre de requête avec son paramètre name):

<form action="MainServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" name="action" value="FirstServlet">
    <input type="submit" name="action" value="SecondServlet">
</form>

avec ce qui suit dans MainServlet

String action = request.getParameter("action");

if ("FirstServlet".equals(action)) {
    // Invoke FirstServlet's job here.
} else if ("SecondServlet".equals(action)) {
    // Invoke SecondServlet's job here.
}

Ce n’est que très peu i18n/entretien facile. Que faire si vous devez afficher les boutons dans une langue différente ou modifier les valeurs des boutons sans oublier de prendre en compte le code de la servlet?


Une légère modification consiste à attribuer aux boutons leur propre nom fixe et unique, afin que leur paramètre de présence en tant que requête puisse être vérifié à la place de sa valeur qui serait sensible à i18n/maintenance:

<form action="MainServlet" method="Post">
    Last Name: <input type="text" name="lastName" size="20">
    <br><br>
    <input type="submit" name="first" value="FirstServlet">
    <input type="submit" name="second" value="SecondServlet">
</form>

avec ce qui suit dans MainServlet

if (request.getParameter("first") != null) {
    // Invoke FirstServlet's job here.
} else if (request.getParameter("second") != null) {
    // Invoke SecondServlet's job here.
}

La dernière solution consisterait simplement à utiliser un framework MVC tel que JSF afin que vous puissiez lier directement les méthodes javabean aux boutons, mais cela nécessiterait des modifications drastiques de votre code existant .

<h:form>
    Last Name: <h:inputText value="#{bean.lastName}" size="20" />
    <br/><br/>
    <h:commandButton value="First" action="#{bean.first}" />
    <h:commandButton value="Second" action="#{bean.Second}" />
</h:form>

avec juste le javabean suivant au lieu d'un servlet

@ManagedBean
@RequestScoped
public class Bean {

    private String lastName; // +getter+setter

    public void first() {
        // Invoke original FirstServlet's job here.
    }

    public void second() {
        // Invoke original SecondServlet's job here.
    }

}
89
BalusC

En plus de la réponse précédente, la meilleure option pour soumettre un formulaire avec différents boutons sans problème de langue consiste à utiliser une balise button.

<form>
    ...
    <button type="submit" name="submit" value="servlet1">Go to 1st Servlet</button>
    <button type="submit" name="submit" value="servlet2">Go to 2nd Servlet</button>
</form>
4
kiril

Si vous utilisez jQuery, vous pouvez le faire comme ceci:

<form action="example" method="post" id="loginform">
  ...
  <input id="btnin" type="button" value="login"/>
  <input id="btnreg" type="button" value="regist"/>
</form>

Et js sera:

$("#btnin").click(function(){
   $("#loginform").attr("action", "user_login");
   $("#loginform").submit();
}
$("#btnreg").click(function(){
   $("#loginform").attr("action", "user_regist");
   $("#loginform").submit();
}
3
toxin
0
gringogordo

Vous devrez peut-être écrire un code javascript pour chaque bouton de soumission. Au lieu de définir une action dans la définition de formulaire, définissez ces valeurs en javascript. Quelque chose comme ci-dessous.

function callButton1(form, yourServ)
{
form.action = yourServ;
form.submit();
});
0
kosa