Plusieurs boutons de soumission sous la même forme appelant des Servlets différents

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>

Je voudrais comprendre comment envoyer des informations dans le cas où le FirstServlet button a été pressé de FirstServlet et dans le cas où le SecondServlet button a été pressé de 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)

28
demandé sur Pshemo 2012-08-06 18:32:04

5 réponses

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

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

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

Mais cela ne fonctionnera bien sûr pas lorsque L'utilisateur final a js désactivé (navigateurs mobiles, lecteurs d'écran, etc.).


Une autre façon est de mettre le deuxième bouton sous une forme différente, qui peut ou non être ce dont vous avez besoin, en fonction de l'exigence fonctionnelle concrète, ce qui n'est pas clair à partir de la question à 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 ne transmettrait que les données d'entrée contenues dans le même formulaire, et non dans l'autre formulaire.


Encore une fois, une autre façon est de créer simplement un autre servlet de point d'entrée unique qui délègue plus loin les bons servlets (ou de préférence, les bonnes actions métier) en fonction du bouton pressé (qui est lui-même disponible en tant que paramètre de requête par son 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.
}

C'est seulement pas très i18n / entretien amical. Que faire si vous devez afficher les boutons dans une autre langue ou modifier les valeurs des boutons tout en oubliant de prendre en compte le code de servlet?


Un léger changement consiste à donner aux boutons son propre nom fixe et unique, de sorte que sa présence en tant que paramètre de requête puisse être vérifiée au lieu 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 façon serait de utilisez un framework MVC comme 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'une 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.
    }

}
84
répondu BalusC 2017-05-23 12:34:48

En plus de la réponse précédente, la meilleure option pour soumettre un formulaire avec différents boutons sans problèmes de langue est en fait en utilisant une balisebutton .

<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
répondu kiril 2014-02-14 01:17:51

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 j seront:

$("#btnin").click(function(){
   $("#loginform").attr("action", "user_login");
   $("#loginform").submit();
}
$("#btnreg").click(function(){
   $("#loginform").attr("action", "user_regist");
   $("#loginform").submit();
}
3
répondu toxin 2014-03-28 08:23:37

Vous devrez peut-être Écrire un javascript pour chaque bouton Soumettre. Au lieu de définir l'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
répondu kosa 2012-08-06 14:38:14