POST Übermittlung an Servlet / Parameter = null

Rukh75

Grünschnabel
Hallo liebe Community,

seid Stunden nervt mich ein kleines Problem und ich kann suchen wie ich will und finde keine Lösung. Aber manchmal sieht mal den Wald vor lauter Bäumen ja nicht.

Hier der Code:
Formular:
HTML:
<form id="mietwagen_aenderung_form" action="javascript:sendeFormular()" onsubmit="return pruefeFormularMietwagen()" method="post">
<label for="kennzeichen">Kennzeichen</label>
<input id="mietwagenKennzeichen" disabled="disabled"/>
<br/>
<label for="Hersteller">Hersteller</label>
<input id="mietwagenHersteller"/>
<br/>
<label for="Modell">Modell</label>
<input id="mietwagenModell"/>
<br/>
<label for="Farbe">Farbe</label>
<input id="mietwagenFarbe"/>
<br/>
<input id="formButton" type="submit" value="Speichern"/>
<button id="formButton" onclick="aenderungAbbrechen()">Abbrechen</button>
</form>

Javascript Funktion sendeFormular()
Code:
function sendeFormular() {
	with(new Ajax()) {
		url = "UpdateMietwagen";
		onSuccess = erfolg;
		method = "POST";
		params = "kennzeichen=" + escape(document.getElementById("mietwagenKennzeichen").value)
				+"&hersteller=" + escape(document.getElementById("mietwagenHersteller").value)
				+"&modell=" + escape(document.getElementById("mietwagenModell").value)
				+"&farbe=" + escape(document.getElementById("mietwagenFarbe").value);
		doRequest();
	}
	
	function erfolg() {
		alert("Datensatz erfolgreich gespeichert!");
		document.getElementById("mietwagen").removeChild(document.getElementById("mietwagen_aenderung"));
	}
}

Hier meine Ajax-Klasse:
Code:
function Ajax() {
	this.url="";
	this.params="";
	this.method="GET";
	this.onSuccess=null;
	this.onError=alertError;
	this.asynchron = true;
	
	function alertError(msg) {
		alert("alert: " + msg);
	}
}

Ajax.prototype.doRequest=function() {
//	Datenüberprüfung
	if(!this.url) {
		this.onError("Keine URL angegeben, Request wird abgebrochen.");
		return false;
	}
	if(!this.method) {
		this.method("GET");
	}
	else {
		this.method.toLocaleUpperCase();
	}
//	Referenz auf Klasse Ajax für andere private Methoden
	var _this = this;
	
//	XMLHttpRequest-Objekt erzeugen
	var xmlHttpRequest = getXMLHttpRequest();
	if(!xmlHttpRequest) {
		this.onError("Es konnte kein XMLHttpRequest-Objekt erstellt werden.")
		return false;
	}
//	Übertragungsmethode unterscheiden und Daten entsprechend behandeln
	switch(this.method) {
	case "GET" : 	xmlHttpRequest.open(this.method, this.url + "?" + this.params, this.asynchron);
					xmlHttpRequest.onreadystatechange = readyStateHandler;
					xmlHttpRequest.send("null");
					break;
	case "POST" :	xmlHttpRequest.open(this.method, this.url, this.asynchron);
					xmlHttpRequest.onreadystatechange = readyStateHandler;
					xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-formurlencoded');
					xmlHttpRequest.setRequestHeader("Content-length", this.params.length);
					xmlHttpRequest.setRequestHeader("Connection", "close");
					xmlHttpRequest.send(this.params);
					break;
	}
	function readyStateHandler() {
		if(xmlHttpRequest.readyState < 4) {
			return false;
		}
		if(xmlHttpRequest.status == 200 || xmlHttpRequest.status == 304) {
			if(_this.onSuccess) {
				_this.onSuccess(xmlHttpRequest.responseText, xmlHttpRequest.responseXML);
			}
		}
		else {
			if(_this.onError) {
				_this.onError("Es trat ein Fehler bei der Datenübertragung auf.\n"+xmlHttpRequest.getResponseHeader("fehlermeldung"));
			}
		}
	}
}
function getXMLHttpRequest() {
	if(window.XMLHttpRequest) {
		return new XMLHttpRequest();
	}
	else {
		if (window.ActiveXObject) {
			try {
				return new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e) {
				try {
					return new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e) {
					return null;
				}
			}
		}
	}
	return null;
}

Servlet doPost:
Code:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		Connection con = DB_Verbindung.baueVerbindungAuf();	
		Mietwagen mietwagen = new Mietwagen();
		
		mietwagen.setKennzeichen(request.getParameter("kennzeichen"));
		mietwagen.setHersteller(request.getParameter("hersteller"));
		mietwagen.setModell(request.getParameter("modell"));
		mietwagen.setFarbe(request.getParameter("farbe"));
			
		try {	
			int i = DB_Eintrag.updateMietwagen(con, mietwagen);
			if(i == 0) {
				response.setStatus(response.SC_BAD_REQUEST);
				response.addHeader("fehlermeldung", "Keine Zeile geupdatet!");
			}
		}
		catch(Exception e) {
			response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
			response.addHeader("fehlermeldung", "Server-Error! Siehe Logfile für nährere Informationen.");
			e.printStackTrace();
		}
	}

Hier die HTTP-Anfrage:

http://localhost:8080/Autovermietung/UpdateMietwagen

POST /Autovermietung/UpdateMietwagen HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.14) Gecko/2009082707 Firefox/3.0.14
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-formurlencoded; charset=UTF-8
Referer: http://localhost:8080/Autovermietung/
Content-Length: 70
Pragma: no-cache
Cache-Control: no-cache
kennzeichen=HI-DR%20260&hersteller=Fiat&modell=Scudo%20Neu&farbe=green

HTTP/1.x 400 Bad Request
Server: Apache-Coyote/1.1
fehlermeldung: Keine Zeile geupdatet!
Content-Type: text/html;charset=utf-8
Content-Length: 971
Date: Wed, 14 Oct 2009 15:59:56 GMT
Connection: close

Problembeschreibung:
Das Problem ist, dass in der doPost-Methode request.getParameter() null liefert. Wenn ich den Content mit getReader() auslese, steht dort aber meine korrekte Anfrage. Jetzt kommts: Wenn ich die gleiche Anfrage per GET übertrage (in doGet steht der gleiche Code wie bei doPost) ist request.getParameter() mit den richtigen Inhalten gefüllt.

:confused:
 

Sven Mintel

Mitglied
Moin,

ich würde mal jenes verdächtigen:
Code:
application/x-www-formurlencoded

sollte besser so lauten:
Code:
application/x-www-form-urlencoded

Übrigens Gratulation:
Dein Thema belegt bei Google Platz 1+2 bei der Suche nach application/x-www-formurlencoded , wenn das nach 1h mal nicht nach Rekord riecht :)