# welcher submit-Button wurde gedrückt?



## ernst (8. Nov 2008)

Hallo allerseits,
In einem HTML-Formular kann man mit submit den Inhalt des Formulars an den Webserver versenden.
Angenommen man hat 2 submit-Buttons, wie in dem Beispiel unten.
Wie kann man dann in einem Java-Servlet feststellen, welcher Button gedrückt wurde.
Mit getParameter(...) kann man doch nur den Inhalt eines Textfeldes abholen.
Also wie funktioniert das?


------------------------------------------------------------------------------------
<html>
  <head>
    <title>Datenerfassung</title>
  </head>
  <body>
    <h1>Datenerfassung</h1>
    <form action="http:/localhost:8080/db2/Austausch" method="post">
          Artikelnummer: <input type=text name="Artikelnummer"  size=40 

          Bezeichnung: <input type=text name="Bezeichnung"  size=40 

          Bestand: <input type=text name="Bestand"  size=40 

          Preis: <input type=text name="Preis"  size=40 

          <input type=submit name="suchen"    value="SUCHEN">
          <input type=submit name="einfuegen" value="EINFÜGEN">
    </form>
  </body>
</html>
------------------------------------------------------------------------------------


mfg
Ernst


----------



## donnar (8. Nov 2008)

Hallo Ernst,

wenn ich einen Button abfangen möchte, erstelle ich für jeden ein eigenes Form, wobei auch jeder Button ein eigenes hidden Field besitzt:

```
<form action="<%=request.getContextPath()%>/servlet/ControllerServlet" method="get">
  <input type="hidden" name="doAction" value="suchen" />
  <input type=submit name="suchen" value="SUCHEN">
</form>
<form action="<%=request.getContextPath()%>/servlet/ControllerServlet" method="get">
  <input type="hidden" name="doAction" value="einfuegen" />
  <input type=submit name="einfuegen" value="einf&gen">
</form>
```
Nun wird jedes klicken durch einen ControllerServlet abgefragt: 

```
//import JdbcQueryBean.*;
package deinPackage;

import javax.servlet.*;
import javax.servlet.http.*;


public class ControllerServlet extends HttpServlet {

  private JdbcQueryBean queryBean = null;
  private OrderdataBean orderDataBean = null;


  public void init(ServletConfig config) throws ServletException {
	super.init(config);
    queryBean =  new JdbcQueryBean ();
	orderDataBean = new OrderdataBean ();
  }

  public void doGet(HttpServletRequest request,
                      HttpServletResponse response) {
    try {
	     String doAction   = request.getParameter("doAction");
	     String ActionURL = "ControllerServlet";
	     String url = null;
	     String controlParam =null;
         if (doAction.equals("suchen")){
			url = "/web/jsp/suchen.jsp";
         }
         else if (doAction.equals("einfuegen")){

                    url = "/web/jsp/einfuegen.jsp";
         }
          
            HttpSession session = request.getSession(true);
            RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(url);
            dispatcher.forward(request, response);
   } catch (ServletException ex){
            System.out.println("Exception when forwarding the request");
            ex.printStackTrace();
   } catch(Exception ex){ 
           System.out.println("Exception when reading or writing the request");
   ex.printStackTrace();
   }
  }

  public void doPost(HttpServletRequest request,
                      HttpServletResponse response) {
	  this.doGet(request,response);
  }
}
```
Dein Servlet musst du noch in der web.xml kenntlich machen. Folgende Zeilen musst du hinzufügen:

Das Servlet sollte dich nun zur gewünschten Seite weiterleiten.

```
<servlet>
      <servlet-name>ControllerServlet</servlet-name>
      <description></description>
      <servlet-class>deinpackage.ControllerServlet</servlet-class>
 </servlet>
<servlet-mapping>
    <servlet-name>ControllerServlet</servlet-name>
    <url-pattern>/servlet/ControllerServlet</url-pattern>
</servlet-mapping>
```


----------



## ernst (8. Nov 2008)

Kann man es auch wie folgt abfragen? 

String s;
s=request.getParameter("suchen");

s bekommt den Wert 
SUCHEN 
(also das was im Formular mit value angegeben wurde), 
wenn das Such-Button angeklickt wurde.


mfg
Ernst


----------



## donnar (8. Nov 2008)

Ja, das kannst du auch so abfragen. Aber beachte, dass request.getParameter()  nur innerhalb der Methode doGet funktioniert.


----------



## ernst (9. Nov 2008)

donnar hat gesagt.:
			
		

> Ja, das kannst du auch so abfragen. Aber beachte, dass request.getParameter()  nur innerhalb der Methode doGet funktioniert.


1)
Wie kann man dann es innerhalb der Methode doPost() machen?

2) 
Als ich versucht habe dies innerhalb von doPost() zu machen mit:
---------------------
String s;
s=request.getParameter("suchen");
System.out.println("suchen= "+s);
---------------------
kommt als Bildschirmausgabe:
suchen= null

mfg
Ernst


----------



## maki (9. Nov 2008)

>> wenn ich einen Button abfangen möchte, erstelle ich für jeden ein eigenes Form, wobei auch jeder Button ein eigenes hidden Field besitzt: 

Viel zu umständlich, man kann jedem Button ein eigenen namen geben.
Dann reicht ein eine form.


----------



## ernst (9. Nov 2008)

maki hat gesagt.:
			
		

> >> wenn ich einen Button abfangen möchte, erstelle ich für jeden ein eigenes Form, wobei auch jeder Button ein eigenes hidden Field besitzt:
> 
> Viel zu umständlich, man kann jedem Button ein eigenen namen geben.
> Dann reicht ein eine form.



Das glaube ich mittlerweile nicht mehr, denn:

1)
Formular (HTML-Datei) des Client:
<html>
  <head>
    <title>Datenerfassung</title>
  </head>
  <body>
    <h1>Datenerfassung</h1>
    <form action="http://localhost:8080/db2/Austausch" method="get">
          Artikelnummer: <input type=text name="Artikelnummer" size=40> 

          Bezeichnung: <input type=text name="Bezeichnung"  size=40> 

          Bestand: <input type=text name="Bestand"  size=40> 

          Preis: <input type=text name="Preis"  size=40> 

          <input type=submit name="einfuegen" value="EINFÜGEN">
          <input type=submit name="suchen" value="SUCHEN">
    </form>
  </body>
</html>


2)
Quellcode in meinem Servlet (in der doGet-Methode):
...
Enumeration paramNames=request.getParameterNames();
while(paramNames.hasMoreElements()){
  String paraN = (String) paramNames.nextElement();
  System.out.println("Parameter="+paraN);
}
...
liefert folgende Bildschirmausgabe (auf dem Fenster des Tomcat):
Parameter=Bezeichnung
Parameter=Preis
Parameter=einfuegen
Parameter=Bestand
Parameter=Artikelnummer


Offensichtlich werden nur die Daten _eines_ submit-Buttons übertragen.
Oder wo habe ich einen Fehler gemacht?

mfg
Ernst


----------



## Guest (9. Nov 2008)

maki hat gesagt.:
			
		

> >> wenn ich einen Button abfangen möchte, erstelle ich für jeden ein eigenes Form, wobei auch jeder Button ein eigenes hidden Field besitzt:
> 
> Viel zu umständlich, man kann jedem Button ein eigenen namen geben.
> Dann reicht ein eine form.




Beruf: SW Entwickler so lügt man sich selbst an


----------



## ernst (9. Nov 2008)

donnar hat gesagt.:
			
		

> Ja, das kannst du auch so abfragen. Aber beachte, dass request.getParameter()  nur innerhalb der Methode doGet funktioniert.


1)
Nein. Ich arbeite gerade nur mit doPost und getParameter() funktioniert ohne Probleme:

2)
Ich habe folgendes herausgefunden:
Wenn man mehrere submit-Buttons in einem Formular hat, dann wird beim Versenden _nur_ der Name des Buttons verschickt, das angeklickt wurde (die Namen der anderen submit-Buttons werden nicht versendet).
Im Servlet bekommt man das heraus, indem man die Methode getParameterNames() benutzt.

mfg
Ernst


----------



## maki (9. Nov 2008)

>> Wenn man mehrere submit-Buttons in einem Formular hat, dann wird beim Versenden _nur_ der Name des Buttons verschickt, das angeklickt wurde (die Namen der anderen submit-Buttons werden nicht versendet). 

Richtig!

So reicht eine einzige form.

Etwas umständlicher wird das ganze, wenn man lokalisierte Namen für die Buttons verwendet.

>> Beruf: SW Entwickler so lügt man sich selbst an

Ach, ein feiger Gast mehr oder weniger, wieso sollte irgendwer auf so jemanden hören?


----------



## ernst (9. Nov 2008)

> Richtig!
> 
> So reicht eine einzige form.
> 
> Etwas umständlicher wird das ganze, wenn man lokalisierte Namen für die Buttons verwendet.


Meinst du so, wie in einem meiner letzten Beiträge (siehe einer meiner letzten Postings):
...
<input type=submit name="einfuegen" value="EINFÜGEN">
<input type=submit name="suchen" value="SUCHEN"> 
...
(weiters dazu: siehe einer meiner letzten Postings)

mfg
Ernst


----------



## maki (9. Nov 2008)

>> Meinst du so, wie in einem meiner letzten Beiträge (siehe einer meiner letzten Postings): 

So in der Art.
Wenn ich mich recht erinnere zeigen Button und Input Elemente da ein leicht unterschiedliches Verhalten, bei ersterem Name=value.

Würde ich dir empfehlen dich in ein Framwework (zB. struts) einzuarbeiten, das fertige Lösungen für solche und viele andere Probleme liefert und ausführlich dokumentiert ist.


----------

