2012-08-06 13 views
25

pierwsze, oto kod:Multiple złożyć przyciski w tej samej formie nazywając różne Servlets

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

Chciałbym zrozumieć, w jaki sposób do wysyłania informacji w przypadku FirstServlet button został wciśnięty do FirstServlet aw przypadku SecondServlet button został przyciśnięty do SecondServlet.

ważne:
chcę zrobić to w tej samej formie, więc te same informacje zostaną transered zarówno do serwletów. (oczywiście, w serwletach będę używać informacji odpowiednio)

Odpowiedz

79

Istnieje kilka sposobów, aby to osiągnąć.

Prawdopodobnie najłatwiej byłoby użyć JavaScript, aby zmienić działanie formularza.

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

Ale to oczywiście nie będzie działać, gdy Użytkownik końcowy ma JS niepełnosprawnych (mobilnych przeglądarek screenreaders, etc).


Innym sposobem jest umieszczenie drugiego przycisku w innej formie, która może lub nie może być to, czego potrzebujesz, w zależności od konkretnego obowiązku funkcjonalnej, która nie wynika z kwestii w ogóle.

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

Należy zauważyć, że forma będzie on złożyć tylko wysłać dane wejściowe znajdujące się w tej samej formie, a nie w innej formie.


Znowu innym sposobem jest po prostu utworzyć innego pojedynczego punktu wejścia aplet które przekazuje dalej na prawo serwletów (lub korzystnie, odpowiednie działania roboczych) w zależności od wciśnięty przycisk (co jest samo w sobie dostępny jako parametr żądanie przez jego 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> 

z następujących w 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. 
} 

to nie jest tylko ver y i18n/przyjazne utrzymanie. Co zrobić, jeśli chcesz wyświetlać przyciski w innym języku lub zmieniać wartości przycisków, pamiętając o uwzględnieniu kodu serwletu?


Nieznaczna zmiana jest dać przyciski własną nazwę stałej i niepowtarzalną, tak, że jego obecność jako żądanie parametru mogą być sprawdzone, a nie jej wartości, które byłyby wrażliwe na i18n/konserwacji:

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

z następujących w MainServlet

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

ostatni sposób byłoby j Użyj struktury MVC, takiej jak JSF, aby móc bezpośrednio łączyć metody javabean z przyciskami, ale wymagałoby to drastycznych zmian w istniejącym kodzie.

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

tylko z następującym JavaBeans zamiast serwletu

@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. 
    } 

} 
+4

Wow, bardzo wyczerpująca odpowiedź! –

+0

+1 za odpowiedź poza zakresem :) – srk

+0

@BalusC Czy możesz wyjaśnić, jak wywołać aplet, którego próbowałem, jak to 'RequestDispatcher rd = request.getRequestDispatcher ("/servletName "); \t \t rd.forward (żądanie, odpowiedź); '.Ale to nie działa – spt

0

Możesz potrzebować napisać javascript dla każdego przycisku przesłać. Zamiast definiować akcję w definicji formularza, ustaw te wartości w javascript. Coś jak poniżej.

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

W uzupełnieniu do poprzedniej odpowiedzi, najlepszym rozwiązaniem, aby złożyć formularz z różnych przycisków bez problemów językowych jest rzeczywiście za pomocą przycisk etykietka.

<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> 
2

Jeśli używasz jQuery, u można zrobić to tak:

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

i JS będą:

$("#btnin").click(function(){ 
    $("#loginform").attr("action", "user_login"); 
    $("#loginform").submit(); 
} 
$("#btnreg").click(function(){ 
    $("#loginform").attr("action", "user_regist"); 
    $("#loginform").submit(); 
} 
Powiązane problemy