Reponse vom Servlet leer

HimBromBeere

Top Contributor
Malzzeit,

ich verzweifle mal wieder an einem Problem, bei welchem ich auf eure Hilfe angewiesen bin. Ich hab mir ein Servlet gebaut, welches eine DB-Anfrage durchführt und die Ergebnisse ausgibt.

Java:
PrintWriter writer;
String message;
try {
	response.setCharacterEncoding("UTF-8");
	response.setContentType("text/plain");
	writer = response.getWriter();
	message = "irgend ein JSON-Objekt";
	response.setContentLength(message.getBytes().length);
	logger.debug(message);
	writer.write(message);
	writer.flush();
	writer.close();
} catch (SQLException e) {
	logger.error(e.getMessage());
	response.sendError(500, "An internal error occured due to database-problems");
} catch (IOException e) {
	logger.fatal(e.getMessage());
	response.sendError(500, "There was an error on the servers file-system which prevented him from fullfilling the request");
} catch (IllegalArgumentException e) {
	logger.error(e.getMessage());
	response.sendError(502, e.getMessage());
}
Funktioniert auch wunderbar, wenn ich die URL des Servlets in den Browser einhacke. Nun versuch ich, das Servlet in einer Webanwendung mittels AJAX anzusprechen (also Javascript), bekomme als Antwort auch eine schöne 200er-HTTP-Meldung, nur steht da nix mehr drin in der Antwort. Also hab ich mal serverseitig mir angschaut, was da versendet wird (darum das
Code:
logger.debug
) und dieses als valide identifiziert.
Nun hab ich im DragonFly nachgesehen, welche Datenpakete zum Server gehen und welche ankommen. Alle Paramater werden mittels HTTP-POST versendet, woraufhin die bereits erwähnte Antwort generiert wird und wieder beim Client landet. Dass sie auch wirklich ankommt, sehe ich anhand der Größe der empfangenden Daten sowie der vom Servlet erzeugten
Code:
ContentLength
. Weder im DragonFly noch letzlich in der Webseite kann ich diese Daten jedoch verwenden.
Hier mal das Skript zum Laden der Daten:
HTML:
reqString = "gender=Mann&reservation=&timespan=&area=&geometry=&";
		
xmlhttp.onreadystatechange = callback;
xmlhttp.open("POST", url, true);

//Send the proper header information along with the request
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", reqString.length);
xmlhttp.setRequestHeader("Connection", "close");

xmlhttp.send(reqString);
Das gleiche Problem tritt auf, wenn ich den POST durch ´n GET ersetze und einfach die ganzen Parameter an die URL dranhänge. So langsam gehen mir aber ehrlich gesagt die Ideen aus, woran ich noch testen soll...
Ich vermute mal, dass das ganze Thema eher eine Angelegenheit unsere Javascript-Kollegen ist und es sich aufgrund der geringen Zahl dieser Gruppe hier im Forum eher im Sande verlaufen wird, aber vlcht. gibt´s ja doch noch irgendwo einen Guru, der sich mit beiden Seiten der Web.Kommunikation auskennt und eine Vermutung hat, wo das Problem liegen könnte.
 

HimBromBeere

Top Contributor
Danke für eure Hilfsbereitschaft.
Mir fehlt in Deinem JS-Code irgendwie der Teil, der den Response verarbeitet.
Hab ich mir gespart, weil die offensichtlich leer ist. Das haben mir sowohl DragonFly als auch Firebug gesagt und auch wenn ich einfach per
Code:
alert(response.responseText)
mir die Antwort zurückgeben lasse, steht da nix. ICh schreib´s aber dennoch gerne auch noch hin:

HTML:
function callback(response) {
	var json = JSON.parse(response.responseText);
	...
An Tröööts Video kann ich leider im Moment nicht zugreifen (serverrestriktionen), werd´s mir mal zu Hause ansehen...
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
Wenn du das etwa so meinst
HTML:
xmlhttp.onreadystatechange = function() {alert(xmlhttp.responseText);};
lautet die Antwort: die Nachrichtenbox ist vollständig leer.
 

Bleiglanz

Gesperrter Benutzer
ist wohl schwierig, wenn man davon ausgeht dass sicher was gesendet wurde
The responseText attribute must return the result of running these steps:

If responseType is not the empty string or "text", throw an "InvalidStateError" exception and terminate these steps.

If the state is not LOADING or DONE, return the empty string and terminate these steps.

If the error flag is set, return the empty string and terminate these steps.

Return the text response entity body.
ist der state wirklich LOADING oder DONE?
 

HimBromBeere

Top Contributor
ist der state wirklich LOADING oder DONE?
Interessanterweise nicht, den test hab ich mal rausgenommen, um zu sehen, ob dann was kommt, was natürlich nicht der Fall war. Als
Code:
readyState
kommt immer nur ´ne
Code:
1
(opened) raus, obwohl ich den Request auch mittels
Code:
xmlhttp.send();
absende. Er kommt ja auch beim Server an, woraufhin eine Antowrt generiert und zurückgesendet wird. Der FireBug u.a. empfangen diese Antwort ja auch, denn die
Code:
contentLength
im responseHeader wird ja auch richtig übernommen. Aber irgendwie kann diese Antwort scheinbar nicht als solche interpretiert werden...

[EDIT]OK... zumindest readyState == 4 bekomme ich jetzt schonmal, hatte nur falsch im FireBug geschaut. Aber der
Code:
xmlhttp.status
ist jetzt halt 0 und nicht die übliche 200. Mir wäre aber neu, dass man den Status explizit serverseitig setzen muss (also auf 200), oder doch?[/EDIT]
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
So, ich hab jetzt auf der Serverseite folgendes:

Java:
response.setCharacterEncoding(encoding);
response.setContentType(format);
response.flushBuffer();
writer = response.getWriter();
message = "irgendein JSON-String"; 
response.setContentLength(message.getBytes().length);
logger.debug(message);
writer.write(message);
writer.flush();
writer.close();
Irgendeins von diesen flushes ist sicherlich eh zu viel, aber das sollte ja erstmal nicht wehtun.
Zumindest ist das Ergebnis noch immer das selbe:
Code:
readyState == 4
und
Code:
status == 0
 

HimBromBeere

Top Contributor
Java:
response.setCharacterEncoding(encoding);
response.setContentType(format);
writer = response.getWriter();
message = this.toJSON(this.getData(dataLayer, condition.toString())).toString(); 
//response.setContentLength(message.getBytes().length);
response.setStatus(200);
logger.debug(message);
writer.write(message);
writer.flush();
writer.close();
response.flushBuffer();
Ergibt für mein Verständnis aber auch recht wenig Sinn. Erstens: warum sollte ich die Antwort erst übertragen, wenn der zueghörige
Code:
Writer
längst geschlossen wurde und zweitens: die Methode
Code:
flushBuffer
setzt natürlich einen Buffer voraus. Also muss ich den doch sicherlich irgendwo angeben, oder brauch ich gar keinen Buffer?
Wie auch immer: getestet hab ich´s trotzdem erstmal so, gebracht hat´s nix. Paradoxerweise bringt auch das Setzen des Statuscodes
Code:
200
nichts, der state vom
Code:
xmlhttp
-Objekt ist immer noch
Code:
0
 

Bleiglanz

Gesperrter Benutzer
Damit ist die Phase des Herumratens vorbei :)

Ich würd jetzt tatsächlich mal ein funktionierendes Standardbeispiel nehmen und mit Dragonfly/FireBugs oder anderen Sniffing-Tools im Browser einen echten Unterschied zwischen deinem Code und funktionierendem Code suchen.
 

HimBromBeere

Top Contributor
Ich muss mal ehrlich sagen, ich habe bei meiner ganzen Google-Suche nicht ein einziges Beispiel gefunden, bei welchem das
Code:
flushBuffer
tatsächlich von Nöten gewesen wäre, da mit
Code:
response.close
sowieso alle enthaltenen Inhalte , die noch im Buffer sind, geschrieben werden. Da ich jedoch auch nie was in einen Buffer schreibe - wozu auch, die Datenmengen sind so gering, dass das meines Erachtens gar nicht notwendig sein sollte - sondern gleich per
Code:
writer.write
, sollte doch die Antwort auch mit rausgehen. Das bestätigt mir ja auch der Aufruf der URL, da kommt ja das gewünschte Resultat, nur halt nicht per Aufruf im Skript...
In den Standardbeispielen (z.B. hier) wird zudem nichts anderes gemacht...
 

Bleiglanz

Gesperrter Benutzer
ja eben, das Problem liegt höchstwahrscheinlich beim Client, im Browser: du sagst ja selbst, dass die Daten dort ankommen...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Encera Servlet Mapping Netzwerkprogrammierung 5
N Test Servlet funktioniert nicht Netzwerkprogrammierung 11
D Response in Java Servlet erzeugen Netzwerkprogrammierung 0
C Servlet erstellen klappt nicht Netzwerkprogrammierung 3
S HTTP Servlet als Instanzen im Programm starten Netzwerkprogrammierung 3
H Servlet Umlaute Netzwerkprogrammierung 20
R Socket SSL-Connect in Servlet - keystore wird nicht gefunden Netzwerkprogrammierung 2
F Kann Klasse nicht zu Servlet casten Netzwerkprogrammierung 5
S send riesige "Query" to servlet Netzwerkprogrammierung 7
S Servlet - Datei kann nicht gelöscht werden Netzwerkprogrammierung 12
N Servlet Response fehlerhaft Netzwerkprogrammierung 14
E RMI - Servlet Netzwerkprogrammierung 4
D Apache Mina und GWT Servlet Netzwerkprogrammierung 4
B Pdf Stream von Servlet mit itext Netzwerkprogrammierung 12
M Servlet als Login Netzwerkprogrammierung 20
B HTTP PDF Servlet download vom Server zum Client Netzwerkprogrammierung 3
B HTML meets Servlet Netzwerkprogrammierung 6
J ObjectOutputStream legt Servlet lahm Netzwerkprogrammierung 7
H Objekt von JSP an Servlet übergeben Netzwerkprogrammierung 4
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
S Servlet InputStream leer?! Netzwerkprogrammierung 14
H kleines Servlet Problem Netzwerkprogrammierung 2
N Servlet-RMI Kommunikation Netzwerkprogrammierung 8
D Verbindung über ein Servlet zu einem Server Netzwerkprogrammierung 4
Paule Connection Applet Servlet ohne Socket bzw RMI Netzwerkprogrammierung 2
R Problem mit Servlet ansprechen Netzwerkprogrammierung 7
B Servlet URL aufruf Netzwerkprogrammierung 4
R Servlet Komunikations Problem Netzwerkprogrammierung 4
D Einfache Applet-Servlet-Kommunikation Netzwerkprogrammierung 5
A JSP->Servlet->Programm (Ausführung) -> Servlet -&gt Netzwerkprogrammierung 2
M Servlet - Applet Kommunikation Netzwerkprogrammierung 3
R Java Applikation als Client ,Servlet als Server: Problem? Netzwerkprogrammierung 3
Z dateidownload vom servlet aus Netzwerkprogrammierung 4
T Servlet-Programmierung & Templates Netzwerkprogrammierung 4
T Einfacher Servlet-Server Netzwerkprogrammierung 8
A RMI Servlet Client Netzwerkprogrammierung 6
S object via post auf servlet send und weiter bearbeiten Netzwerkprogrammierung 11
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
R applet servlet kommunikation Netzwerkprogrammierung 2
I Servlet ParameterChaos Netzwerkprogrammierung 2
C Applet <> Servlet Netzwerkprogrammierung 4
K RMI Kommunication zw. Servlet und EJB Netzwerkprogrammierung 7
T Wieso ist mein Objekt leer? Netzwerkprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben