AJAX med Tomcat/Java - kan ikke modtage responseText
Hej. Stil endelig spørgsmål. Det er svært at forklare når man har siddet med et problem længeJeg har et kæmpe problem jeg har døjet med i en del tid. Jeg vil først forsøge at forklare mit setup rimeligt overordnet.
Jeg har en hjemmeside, der sender flere xmlhttprequests til et Java "HttpServlet implements CometProcessor" objekt. På serversiden har jeg desuden et MessageSender objekt, der kan holde styr på de aktuelle xmlhttprequests og skrive et response til alle disse requests.
Hvis jeg "fanger" disse requests direkte i HttpServlettens event metode og skriver til dem der, kan jeg sende svaret tilbage som responseText. Min MessageSender klasse virker til gengæld som om den kun kan sende tilbage som responseXML. Jeg kan se i firebug at svaret ligner korrekt xml.
<?xml version="1.0" encoding="UTF-8"?><json><![CDATA[{"departments": [{"id": "3","departmentName": "56gnjf","locked": "false","cookie": ""}]}]]></json>
Desuden kan jeg overhovedet ikke parse det ovenstående response.
Det skal siges, at jeg benytter et xmlhttprequest (post), til at få svar i et andet request (get). Jeg ved ikke om det har nogen betydning.
Nedenstående er en smule af min kode. Udpluk af HttpServlet klassen, MessageSender klassen og klientside JavaScriptet. Det er uden kommentarer, men for folk, der har arbejdet med Ajax på den her måde er det ikke svært.
[code]
public class Socket extends HttpServlet implements CometProcessor {
public void event(final CometEvent event)
throws IOException, ServletException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
if (event.getEventType() == CometEvent.EventType.BEGIN) {
messageSender.addConnection(response);
}
else if (event.getEventType() == CometEvent.EventType.READ) {
int id = Integer.parseInt(request.getParameter("id"));
String name = request.getParameter("name");
saveDepartment(id,name);
writer.flush();
writer.close();
}
}
private void saveDepartment(int id, String name) {
Query findDep = entityManager.createQuery("SELECT d FROM Department d WHERE d.id = "+id);
Department d = (Department) findDep.getSingleResult();
if(d.isLocked()){
d.setLocked(false);
d.setCookie("");
d.setName(name);
Save(d);
String json =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><json><![CDATA[";
json += "{";
json += "\"departments\": [";
json += d.toJSON();
json += "]}]]></json>";
messageSender.send(json);
}
}
}
[/code]
[code]
public class MessageSender implements Runnable {
public void run() {
while (running) {
if (queries.size() == 0) {
try {
synchronized (queries) {
queries.wait();
}
} catch (InterruptedException e) {
// Ignore
}
}
synchronized (connections) {
pendingQueries = null;
synchronized (queries) {
pendingQueries = queries.toArray(new String[0]);
queries.clear();
}
log.print("Connections size(): "+connections.size());
for (int i = 0; i < connections.size(); i++) {
try {
PrintWriter writer =
connections.get(i).getWriter();
for (int j = 0; j < pendingQueries.length; j++) {
writer.println(pendingQueries[j]);
}
writer.flush();
writer.close();
} catch (IOException e) {
log.print("IOExeption sending message: "+ e);
}
}
}
}
}
}
[/code]
[code]
function StreamFromSocket()
{
xmlhttp = Asynchronous(); //opret et xmlhttprequest objekt
xmlhttp.open("GET", url, true);
xmlhttp.setRequestHeader("Content-type", "text/plain");
xmlhttp.setRequestHeader("Content-length", params.length);
xmlhttp.setRequestHeader("Connection", "close");
xmlhttp.setRequestHeader("Accept", "text/plain");
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4){
if(xmlhttp.status == 200) {
// dette alert er tomt
alert(xmlhttp.responseText);
}
}
};
xmlhttp.send(null);
}
[/code]