In diesem Artikel wird die Methode des Servlet beschrieben, die Parameter in AJAX -Postanforderungen in den Formulardaten erhalten und Nutzlast anfordern. Teilen Sie es für Ihre Referenz wie folgt weiter:
In der HTTP -Anforderung wird der Formularparameter, wenn es sich um eine GET -Anforderung handelt, der URL in Form von Name = value & name1 = value1 angehängt. Wenn es sich um eine Postanforderung handelt, befindet sich der Formularparameter in der Anforderungsorganisation und befindet sich auch in der Anforderungskörper in Form von Name = value & name1 = value1. Über die Chrome Developer -Tools können Sie Folgendes sehen (hier ist ein lesbares Formular, kein echtes HTTP -Anforderungsprotokollanfrageformat):
Anfrage erhalten:
Requesturl: http: //127.0.0.1: 8080/test/test.do? Name = mikan & address = streetRequest -Methode: GetStatus Code: 200 Okrequest Headersakzept: Text/HTML, Anwendung/xhtml+xml, application/xml; q = 0,9, Bild/Webp,*/*; PH: Alexatoolbar/Alxg-3.2Connection: Keep-Alivecookie: JSessionID = 74AC93F9F572980B6FC10474CD8EDD8DHOST: 127.0.0.1: 8080REFERER: HTTP: //127.0.0.0.1: 8080/testen/Index/INDYPUL-IN INDYPUL-IN INDYPUL-IN INDYPUL-IN INDYPUL-IN INDYPUL-1,0.0.0.0.1: 8080/testen/Index/INDYPUL-INDYPUL/IN IN INDYPUL-IN INDYPUL-IN INDYPUL-IN INDYPUL-IN INDYPUL-IN INDYPUL (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36Query String Parametersname:mikanaddress:streetResponse HeadersContent-Length:2Date:Sun, 11 May 2014 10:42:38 GMTServer:Apache-Coyote/1.1
Postanfrage:
Requesturl: http://127.0.0.1:8080/test/test.dorequest Methode: Poststatus Code: 200 Okrequest HeaderAccept: Text/HTML, Anwendung/xhtml+xml, application/xml; q = 0,9, Bild/webp,*/*; DChaccept-Sprache: ZH-CN, ZH; Q = 0,8, EN; Q = 0,6ALEXATOLBAR-ALX_NS_PH: Alexatoolbar/ALXG-3.2Cache-Kontroll: max-AGE = 0Connection : Keep-Alivecontent-Länge: 25Content-Typ: Anwendung/X-WWW-Form-UrlencodedCookie: JSessionID = 74AC93F9F572980B6FC10474CD8 EDD8DHOST: 127.0.0.1: 8080Origin: http: //127.0.0.1: 8080Referer: http: //127.0.0.1: 8080/test/Index.jspuser-Agent: Mozilla/5.0 (Windows Nt 6.1) Applewebkit/537.36 (KHTML, wie Gecko) Chrom/33.0.1750.149 Safari/537.36Form Dataname: MICANADDRESS: STREETREPREABE-Headern
Hier sollten wir beachten, dass der Inhaltstyp der Postanforderung die Anwendung/x-www-form-urlencoded ist und der Parameter in der Anforderungsbehörde die Formulardaten in der obigen Anforderung befindet.
In einem Servlet können Formparameter durch request.getParameter(name) erhalten werden.
Und wenn Sie die native AJAX -Postanforderung verwenden:
Funktion getXmlHttpRequest () {var xhr; if (window.activeXObject) {xhr = new ActiveXObject ("microsoft.xmlhttp"); } else if (window.xmlhttprequest) {xhr = new XmlHttpRequest (); } else {xhr = null; } return xhr;} Funktion Save () {var xhr = getXmlHttpRequest (); xhr.open ("post", "http://127.0.0.1:8080/test/test.do"); var data = "name = mikan & address = street ..."; Xhr.Send (Daten); xhr.onReadyStatechange = function () {if (xhr.readyState == 4 && xhr.status == 200) {alert ("zurückgegeben:"+ xhr.responseteText); }};}Über die Entwicklertools von Chrome finden Sie den Anforderungsheader wie folgt:
Requesturl: http://127.0.0.1:8080/test/test.dorequest Methode: Poststatus Code: 200 Okrequest Headerasakzept:*/*Akzeptieren: Gzip, Deflate, Sdchaccept-Sprache: ZH-CN, ZH; Q = 0,8, EN; Q = 0,6ALEXATOLBAR-ALX_NS_PH: Alexatoolbar/Alxg-3.2Connection: Keep-Alivecontent-Länge: 28Content-Type: t ext/plain; charset = utf-8cookie: jsessionId = c40c7823648e952e7c6f7d2e687a0a89Host: 127.0.0.1: 8080o Rigin: http: //127.0.0.1: 8080Referer: http: //127.0.0.1: 8080/test/index.jspuser-Agent: Mozilla/5.0 (Windows Nt 6.1) Applewebkit/537.36 (KHTML, wie Gecko) Chrome/33.0.1750.149 Safari/537.36REQUEST PayloadName = MICAN & ADRESSE = StreetResponse Headerscontent-Länge: 2date: Sun, 11 Mai 2014 11:49:23 GMTSERVERVER:
Beachten Sie, dass der angeforderte Inhaltstyp text/plain;charset=UTF-8 ist und der Parameter des Anforderungsformulars in RequestPayLoad ist.
Dann ist request.getParameter(name) im Servlet leer. Warum? Und wie sollten solche Parameter erhalten werden?
Um dieses Problem zu verstehen, habe ich einige Informationen nachgeschlagen und den Quellcode von Tomcat7.0.53 in der Verarbeitung von Anforderungen Parameter gelesen und schließlich herausgefunden, was los war.
Bei der Übermittlung von HTTP-Postformularanfragen ist der verwendete Inhaltstyp application/x-www-form-urlencoded . Wenn der Anforderungs-Header-Requestheader nicht angegeben ist, ist der standardmäßige inhaltliche Inhaltstyp text/plain;charset=UTF-8 .
Weil Tomcat "spezielle Verarbeitung" für inhaltliche Multipart/Form-Data (Datei-Upload) und Anwendung/X-WWW-Form-Forform-Urlencoded (Post-Anforderung) durchführt. Schauen wir uns den relevanten Verarbeitungscode unten an.
Die Implementierungsklasse protected void parseParameters() HttpServletRequest -Klasse von Tomcat lautet org.apache.catalina.connector Die Verarbeitungscodes für Multipart/Form-Data (Datei-Upload) und Application/X-Www-form-form-urlencoded (Postanforderung) in dieser Methode sind wie folgt:
ProtectedVoid Parseparameters () {// Fremde Code aus. Erfolg = wahr; zurückkehren; } if (! ("application/x-www-form-urlencoded" .equals (contentType))) {// Hier ist die Verarbeitung der Postanforderungsparameter // Teil des Codes auslassen ... Versuchen Sie {if (ReadPostBody (FormData), Len)! }} catch (ioException e) {// client disconnect if (context.getLogger (). } zurückkehren; } parameter.ProcessParameter (FormData, 0, len); // Verarbeiten Sie den POST -Anforderungsparameter und setzen Sie ihn in das RequestParameter in der Karte (d. H. Die von Request.GetParametermap erhaltene Karte. do {int Inputlen = getStream (). Read (Körper, Offset, Len - Offset); if (inputlen <= 0) {return offset; } offset += inputlen; } while ((len - offset)> 0); Rückkehr Len;} Aus dem obigen Code können wir feststellen, dass die Postanforderung des Inhaltstyps nicht die Anwendung/X-WWW-Form-Urscoded ist, die die Anforderungskörperdaten nicht liest und die entsprechende Parameterverarbeitung durchführt, dh die Formulardaten werden nicht angerichtet und in die Anforderungsparameterkarte platziert. Daher kann es nicht über request.getParameter(name) erhalten werden.
Wie erhalten wir also die auf diese Weise eingereichten Parameter?
Natürlich ist es die primitivste Methode, um den Eingangsstrom zu lesen, um ihn zu erhalten, wie unten gezeigt:
privatestring getRequestpayload (httpServletRequest req) {StringBuilldersB = new StringBuilder (); try (bufferedReaderReader = req.getReader ();) {char [] buff = new char [1024]; Intlen; while ((len = reader.read (buff))! = -1) {sb.append (Buff, 0, len); }} catch (ioException e) {e.printstacktrace (); } returnsb.toString ();}Natürlich können auf diese Weise auch Postanfragen mit Anwendungen/x-www-form-urlencoded-Set erhalten werden.
Bei Verwendung der nativen AJAX -Postanforderung müssen Sie daher den Anforderungsheader explizit festlegen, dh:
xhr.setRequestheader ("Content-Typ", "Anwendung/X-Www-Form-Urlencoded"); Wenn Sie JQuery verwenden, verwende ich außerdem die Version 1.11.0, um sie zu testen. $.ajax post -Anfrage muss diesen Anfrage -Header nicht explizit festlegen, und ich habe sie nicht selbst auf andere Versionen getestet. Ich glaube, dass Versionen nach 1.11.0 nicht festgelegt werden müssen. Aber einige zuvor sind möglicherweise nicht sicher. Dies wurde nicht getestet.
PostScript:
Ich habe wirklich verstanden, warum der Server eine spezielle Verarbeitung für die Einreichung von Formularen und das Hochladen von Dateien durchführt, da die Formularübermittlungsdaten ein Name-Wert-Paar sind und der Inhaltstyp die Anwendung/X-WWW-Form-Urscoded ist, während der Datei-Upload-Server eine spezielle Verarbeitung benötigt. Das Datenformat gewöhnlicher Postanforderungen (Inhaltstyp ist keine Anwendung/X-WWW-Form-Urscoded) ist nicht behoben, und es ist nicht unbedingt ein Namenswertpaar, sodass der Server die spezifische Verarbeitungsmethode nicht kennen kann, sodass er nur durch Erhalten des ursprünglichen Datenstroms analysiert wird.
Wenn JQuery eine Postanforderung ausführt, wird der Inhaltstyp für Anwendungen/x-www-form-urlencodiert festgelegt, sodass der Server korrekt analysiert werden kann. Bei Verwendung der nativen AJAX-Anforderung ist der Standard-Typ/einfach, wenn nicht der Inhaltstyp angezeigt wird. Zu diesem Zeitpunkt weiß der Server nicht, wie die Daten analysiert werden sollen, sodass die Anforderungsdaten nur durch Erhalten des ursprünglichen Datenstroms analysiert werden können.
Für weitere Informationen zu Java -Algorithmen können Leser, die an dieser Website interessiert sind, die Themen "Zusammenfassung der Java -Netzwerk -Programmierkenntnisse", "Tutorials zu Java -Datenstrukturen und Algorithmen", "Zusammenfassung der Java -Operation Dom Node Skills", "Zusammenfassung der Java -Datei- und Directory Operation Skills" und "Summary Operation Dom Node Skills" und "Summary of Java Cache Operation Skills" und "Summary of Java Cache Operation Skills"
Ich hoffe, dieser Artikel wird für Java -Programme aller hilfreich sein.