Ich habe eine HTML-Seite entwickelt, die Informationen an ein Servlet sendet. Im Servlet verwende ich die Methoden doGet()
und doPost()
:
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String id = req.getParameter("realname");
String password = req.getParameter("mypassword");
}
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
String id = req.getParameter("realname");
String password = req.getParameter("mypassword");
}
Der HTML-Seitencode, der das Servlet aufruft, lautet:
<form action="identification" method="post" enctype="multipart/form-data">
User Name: <input type="text" name="realname">
Password: <input type="password" name="mypassword">
<input type="submit" value="Identification">
</form>
Wenn ich method = "get"
im Servlet verwende, erhalte ich den Wert von ID und Passwort. Bei Verwendung method = "post"
werden jedoch ID und Passwort auf gesetzt null
. Warum bekomme ich in diesem Fall keine Werte?
Ich möchte auch wissen, wie die vom Servlet generierten oder validierten Daten verwendet werden. Wenn beispielsweise das oben gezeigte Servlet den Benutzer authentifiziert, möchte ich die Benutzer-ID auf meiner HTML-Seite drucken. Ich sollte in der Lage sein, die Zeichenfolge 'id' als Antwort zu senden und diese Informationen in meiner HTML-Seite zu verwenden. Ist es möglich?
Antworten:
Einführung
Sie sollten verwenden,
doGet()
wenn Sie HTTP-GET-Anforderungen abfangen möchten . Sie sollten verwenden,doPost()
wenn Sie HTTP-POST-Anforderungen abfangen möchten . Das ist alles. Portieren Sie das eine nicht zum anderen oder umgekehrt (wie bei der unglücklichen automatisch generiertenprocessRequest()
Methode von Netbeans ). Das macht keinen Sinn.BEKOMMEN
Normalerweise sind HTTP-GET-Anforderungen idempotent . Das heißt, Sie erhalten bei jeder Ausführung der Anforderung genau das gleiche Ergebnis (wobei die Autorisierung / Authentifizierung und die zeitkritische Natur der Seite - Suchergebnisse, letzte Nachrichten usw. - nicht berücksichtigt werden). Wir können über eine mit Lesezeichen versehene Anfrage sprechen. Wenn Sie auf einen Link klicken, auf ein Lesezeichen klicken, eine unformatierte URL in die Adressleiste des Browsers eingeben usw. wird eine HTTP-GET-Anforderung ausgelöst. Wenn ein Servlet die betreffende URL abhört, wird seine
doGet()
Methode aufgerufen. Es wird normalerweise verwendet, um eine Anfrage vorzuverarbeiten . Das heißt, Sie erledigen einige geschäftliche Aufgaben, bevor Sie die HTML-Ausgabe einer JSP präsentieren, z. B. das Sammeln von Daten zur Anzeige in einer Tabelle.Auch das Anzeigen / Bearbeiten von Detaillinks, wie in der letzten Spalte oben gezeigt, ist normalerweise idempotent.
POST
HTTP-POST-Anforderungen sind nicht idempotent. Wenn der Endbenutzer zuvor ein POST-Formular für eine URL gesendet hat, für die keine Umleitung durchgeführt wurde, ist die URL nicht unbedingt mit einem Lesezeichen versehen. Die übermittelten Formulardaten werden nicht in der URL wiedergegeben. Das Kopieren der URL in ein neues Browserfenster / eine neue Registerkarte führt möglicherweise nicht unbedingt zu genau dem gleichen Ergebnis wie nach dem Senden des Formulars. Eine solche URL ist dann nicht mit einem Lesezeichen versehen. Wenn ein Servlet die betreffende URL abhört,
doPost()
wird sie aufgerufen. Es wird normalerweise verwendet, um eine Anfrage nachzubearbeiten . Das heißt, Sie sammeln Daten aus einem übermittelten HTML-Formular und erledigen damit einige geschäftliche Aufgaben (Konvertierung, Validierung, Speichern in der Datenbank usw.). Schließlich wird das Ergebnis normalerweise als HTML von der weitergeleiteten JSP-Seite dargestellt.... die in Kombination mit diesem Servlet verwendet werden können:
Sie sehen, wenn das
User
in der Datenbank gefunden wird (dh Benutzername und Passwort sind gültig),User
wird das in den Sitzungsbereich gestellt (dh "angemeldet") und das Servlet wird auf eine Hauptseite umgeleitet (dieses Beispiel geht zuhttp://example.com/contextname/home
), andernfalls Es wird eine Fehlermeldung gesetzt und die Anforderung an dieselbe JSP-Seite zurückgeleitet, damit die Nachricht von angezeigt wird${error}
.Sie können bei Bedarf auch „verstecken“ die
login.jsp
in/WEB-INF/login.jsp
so dass die Benutzer nur durch das Servlet zugreifen können. Dies hält die URL sauberhttp://example.com/contextname/login
. Alles, was Sie tun müssen, istdoGet()
, dem Servlet Folgendes hinzuzufügen :(und aktualisieren Sie die gleiche Zeile
doPost()
entsprechend)Das heißt, ich bin nicht sicher , ob es nur spielt herum und der Aufnahme im Dunkeln, aber der Code, den Sie nicht gepostet nicht gut aussehen (wie die Verwendung
compareTo()
anstelle vonequals()
und in den parameternames Graben statt nur mitgetParameter()
undid
undpassword
scheint als Servlet-Instanzvariablen deklariert werden (was NICHT threadsicher ist ). Ich würde daher dringend empfehlen, mithilfe der Oracle-Tutorials (siehe Kapitel "Trails Covering the Basics") und der richtigen Verwendung von JSP / Servlets mithilfe dieser Tutorials etwas mehr über die grundlegende Java SE-API zu erfahren .Siehe auch:
Update : nach dem Update Ihrer Frage (was ziemlich großen, sollten Sie nicht Teile Ihrer ursprünglichen Frage entfernen, dies würde die Antworten wertlos .. vielmehr fügen die Informationen in einem neuen Block), es stellt sich heraus , dass Sie Setzen Sie den Codierungstyp des Formulars unnötigerweise auf
multipart/form-data
. Dadurch werden die Anforderungsparameter in einer anderen Zusammensetzung als die (Standard)application/x-www-form-urlencoded
gesendet, die die Anforderungsparameter als Abfragezeichenfolge sendet (zname1=value1&name2=value2&name3=value3
. B. ). Sie brauchen nur,multipart/form-data
wenn Sie eine haben<input type="file">
Element im Formular zum Hochladen von Dateien, bei denen es sich möglicherweise um Nicht-Zeichendaten (Binärdaten) handelt. Dies ist in Ihrem Fall nicht der Fall. Entfernen Sie es einfach und es funktioniert wie erwartet. Wenn Sie jemals Dateien hochladen müssen, müssen Sie den Codierungstyp so einstellen und den Anforderungshauptteil selbst analysieren. Normalerweise verwenden Sie dort den Apache Commons FileUpload für, aber wenn Sie bereits eine neue Servlet 3.0-API verwenden, können Sie einfach integrierte Funktionen verwenden, beginnend mitHttpServletRequest#getPart()
. Ein konkretes Beispiel finden Sie auch in dieser Antwort: Wie lade ich Dateien mit JSP / Servlet auf den Server hoch?quelle
Sowohl GET als auch POST werden vom Browser verwendet, um eine einzelne Ressource vom Server anzufordern. Jede Ressource erfordert eine separate GET- oder POST-Anforderung.
Die GET-Methode wird auf zwei Arten verwendet: Wenn keine Methode angegeben ist, fordern Sie oder der Browser eine einfache Ressource wie eine HTML-Seite, ein Bild usw. an. Wenn ein Formular gesendet wird und Sie die Methode auswählen = GET auf dem HTML-Tag. Wenn die GET-Methode mit einem HTML-Formular verwendet wird, werden die über das Formular gesammelten Daten durch Anhängen eines "?" An den Server gesendet. bis zum Ende der URL und dann Hinzufügen aller Name = Wert-Paare (Name des HTML-Formularfelds und in dieses Feld eingegebener Wert) getrennt durch ein "&" Beispiel: GET /sultans/shop//form1.jsp?name= Sam% 20Sultan & iceCream = Vanille HTTP / 1.0 optionaler Headeroptionaler Header << leere Zeile >>>
Die Formulardaten name = value werden in einer Umgebungsvariablen namens QUERY_STRING gespeichert. Diese Variable wird an ein Verarbeitungsprogramm (wie JSP, Java-Servlet, PHP usw.) gesendet.
Beispiel: POST /sultans/shop//form1.jsp HTTP / 1.0 optionaler Headeroptionaler Header << leere Zeile >>> name = Sam% 20Sultan & iceCream = vanilla
Bei Verwendung der post-Methode ist die Umgebungsvariable QUERY_STRING leer. Vor- und Nachteile von GET gegenüber POST
Vorteile der GET-Methode: Etwas schnellere Parameter können über ein Formular oder durch Anhängen eingegeben werden, nachdem die URL-Seite mit ihren Parametern als Lesezeichen versehen werden kann
Nachteile der GET-Methode: Es können nur Daten im Wert von 4 KB gesendet werden. (Sie sollten es nicht verwenden, wenn Sie ein Textfeld verwenden.) Parameter sind am Ende der URL sichtbar
Vorteile der POST-Methode: Parameter sind am Ende der URL nicht sichtbar. (Verwendung für vertrauliche Daten) Kann Daten im Wert von mehr als 4 KB an den Server senden
Nachteile der POST-Methode: Kann nicht mit ihren Daten vorgemerkt werden
quelle
Die Implementierung der HttpServlet.service () -Methode durch den Servlet-Container wird bei Bedarf automatisch an doGet () oder doPost () weitergeleitet, sodass Sie die Servicemethode nicht überschreiben müssen.
quelle
Könnte es sein, dass Sie die Daten durch get weiterleiten, nicht posten?
quelle
Wenn Sie dies
<form action="identification" >
für Ihr HTML-Formular tun , werden die Daten standardmäßig mit 'Get' übergeben. Daher können Sie dies mit der Funktion doGet in Ihrem Java-Servlet-Code abrufen. Auf diese Weise werden Daten unter dem HTML-Header übergeben und sind daher bei der Übermittlung in der URL sichtbar. Wenn Sie dagegen Daten im HTML-<form action="identification" method="post">
Text übergeben möchten, verwenden Sie Post: und fangen Sie diese Daten in der Funktion doPost ab. Dies war, Daten werden unter dem HTML-Text und nicht unter dem HTML-Header übergeben, und Sie werden die Daten nach dem Absenden des Formulars nicht in der URL sehen.Beispiele aus meinem HTML:
Beispiele aus meinem Java-Servlet-Code:
quelle