3.8k Aufrufe
Gefragt in Anwendungen(Java,C++...) von
Hallo,

kennt jemand ein funktionierendes Beispiel, wo in einem HTML-Formular mehrere Submit-Buttons verwendet, durch verschiedene name="x1_usw" -Attribute unterschieden werden und anschließend auf dem Server ausgewertet wird, mit welchem Submit-Button das Formular auf die Reise geschickt wurde?

Vielen Dank im Voraus!
spontanerGast

9 Antworten

0 Punkte
Beantwortet von computerschrat Profi (32.8k Punkte)
Hallo,

du gibts jedem Button einen eigenen Namen:

<input type='submit' name='Button1' value='Button1Name>


und dann fragst du ab mit

if (isset($_POST["Button1"]))


Das kannst du dann für beliebig viele Buttons machen.
Alternativ kannst du die Knöpfe auch als Array anlegen, was den Vorteil hat, dass du sie automatisch generieren kannst.


Gruß
computerschrat
0 Punkte
Beantwortet von
Hallo computerschrat,

ich bin jetzt seit letzten Mittwoch bald am verzweifeln, denn eigentlich mache ich es so (allerdings mit Java), wie es alle schreiben, aber es funktioniert trotzdem nicht. Ich vermute, dass if (isset($_POST["Button1"])) PHP ist, aber ich muss es mit Java machen.

Das Ablaufschema ist folgendes:

TestServlet_01.java
- macht erstmal gar nichts außer
- ruft TestJSP_01.jsp mit Hilfe von
RequestDispatcher requestDispatcher = request.getRequestDispatcher("TestJSP_01.jsp");
requestDispatcher.forward(request, response);
=> das funktioniert

TestJSP_01.jsp enthält ein Formular mit
- method="post" - "get" oder "post" sollte egal sein, aber später für <input name="file" type="file"> wird "post" benötigt
- entweder enctype="multipart/form-data" - ich will mit diesem Formular mal einen Datei-Upload machen
- oder enctype="text/plain" - um rauszukriegen, ob es am enctype liegt
- action="TestServlet_02" - ruft also als nächstes (in jedem Fall) das Servlet "TestServlet_02.java" auf
- einem Input-Text-Feld und
- 3 Submit-Buttons
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>TestJSP_01</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="TestServlet_02">
Text: <input type="text" name="text1"><br>
Sbm1: <input type="submit" name="submit11" value="s11"><br>
Sbm2: <input type="submit" name="submit12" value="s12"><br>
Sbm3: <input type="submit" name="submit13" value="s13"><br>
</form>
</body>
</html>
=> funktioniert, d. h. mit jedem der 3 Submit-Buttons kann ich das Formular/den Request abschicken und das "TestServlet_02.java" wird aufgerufen

TestServlet_02.java
- soll alle 4 Parameter des Requests auswerten: text1, submit11, submit12 und submit13
- soll den übermittelten text1 anzeigen
- soll mit einer Fallunterscheidung ermitteln, welcher Submit-Button gedrückt wurde, und ein entsprechendes Servlet aufrufen
=> die Auswertung aller 4 Request-Parameter funktioniert offenbar nicht (ergibt 'null')
=> auch für "text1" wird 'null' ermittelt, obwohl ein Text eingegeben wurde
=> deswegen kommt in der Fallunterscheidung immer nur der Fehlerfall heraus
= und es wird immer nur das "TestServlet_05" aufgerufen (d. h. der nächste Aufruf funktioniert wie gewohnt)
package ServletExamples;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
// Fortsetzung folgt ...
0 Punkte
Beantwortet von
// Fortsetzung von "TestServlet_05"
public class TestServlet_02 extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String contentType = request.getContentType();
HttpSession session = request.getSession();
String submit1 = session.getId();
String text1 = request.getParameter("text1");
String submit11 = request.getParameter("submit11");
String submit12 = request.getParameter("submit12");
String submit13 = request.getParameter("submit13");
RequestDispatcher requestDispatcher = null;

if(submit11 != null) {
System.out.println("submit11 - text1: " + text1);
submit1 = "submit11";
requestDispatcher = request.getRequestDispatcher("TestJSP_02.jsp");
}
else if(submit12 != null) {
System.out.println("submit12 - text1: " + text1);
submit1 = "submit12";
requestDispatcher = request.getRequestDispatcher("TestJSP_03.jsp");
}
else if(submit13 != null) {
System.out.println("submit13 - text1: " + text1);
submit1 = "submit13";
requestDispatcher = request.getRequestDispatcher("TestJSP_04.jsp");
}
else {
System.out.println("Fehler1 - text1: " + text1);
submit1 = "Fehler1";
requestDispatcher = request.getRequestDispatcher("TestJSP_05.jsp");
}
session.setAttribute("text1", text1);
session.setAttribute("submit1", submit1);
requestDispatcher.forward(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

@Override
public String getServletInfo() {
return "TestServlet_02.java";
}
}


Die entscheidende Frage an alle Java-Experten scheint zu sein: Warum kriege ich mit String text1 = request.getParameter("text1"); und String submitXX = request.getParameter("submitXX"); immer nur 'null' und nicht die richtigen Werte aus dem Formular? Außerdem habe ich ein anderes Beispiel (von www.hameister.org/JEE6WebClientJSP.html), wo alles ganz genau so gemacht wird, außer dass es nur ein Servlet und eine JSP gibt und die beiden sich immer nur gegenseitig (im Kreis) aufrufen, und das funktioniert einwandfrei!

Woran kann's liegen?

spontanerGast
0 Punkte
Beantwortet von
Sorry, oben in Antwort 3 muss es natürlich
// Fortsetzung von "TestServlet_02"
heißen.

spontanerGast
0 Punkte
Beantwortet von computerschrat Profi (32.8k Punkte)
Hallo spontanerGast,

ja, ich habe das mit PHP gemacht. Java verwende ich nicht, weil das auf vielen Rechnern abgeschaltet ist. Demnach habe ich da leider absolut keine Erfahrung und muss mich aus der Fragestellung ausklinken.

Viel Erfolg noch!

Gruß
computerschrat
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Schau dir doch mal z.B. mit dem Tool "Fiddler" an, welche Daten deine Webseite tatsächlich an den Server schickt.
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Wenn dein Formular mutlipart/form-data verwendet, kannst du nicht mittels request.getParameter() auf die Feldinhalte zugreifen. Vielmehr mußt du mit request.getParts() die einzelnen Abschnitte deines Multipart-Requests abrufen und dann über die zurückgegebene Collection iterieren.
0 Punkte
Beantwortet von
Hallo Supermax,

Dein Hinweis bringt mich wahrscheinlich auf zumindest eine richtige Fährte. Ich versuche es in den Formularen die ganze Zeit abwechselnd mit

1. enctype="text/plain" oder mit 2. enctype="mutlipart/form-data"

aber ich kriege noch ganz andere Ergebnisse, wenn ich (3.) den Parameter enctype ganz weglasse. Mit der Anweisung

String xxx = request.getParameter("XXX");

bekomme ich für ein gewöhnliches Input-Textfeld XXX bei 1. und 2. immer nur 'null', bei 3. jedoch '!null' und xxx.length() = 0, wenn ich in das Feld nichts reinschreibe, bzw. xxx.length() > 0, wenn ich was reinschreibe.

Das scheint mir aber noch nicht alles zu sein, wovon die request.getParameter-Ergebnisse abhängen, deshalb die Frage speziell an alle Java-Experten: worauf muss man noch achten?

- Ob das Formular in einem Servlet oder in einer JSP ist?

- Von <!DOCTYPE HTML> oder <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> oder .... ?
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Wird das ENCTYPE-Attribut weggelassen, wird der Standardwert "application/x-www-form-urlencoded" verwendet. In dieser Codierung kannst du auch mit request.getParameter() auf die Formularangaben zugreifen. "text/plain" sollte in Formularen generell nicht verwendet werden.

Der DOCTYPE spielt hier keine Rolle, egal ob HTML4, HTML5 oder XHTML, die Codierung der gesendeten Daten ist unter allen DOCTYPEs gleich.
...