Avatar billede caho Nybegynder
08. januar 2010 - 15:51 Der er 3 kommentarer

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ænge

Jeg 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]
Avatar billede caho Nybegynder
08. januar 2010 - 16:41 #1
Lige en lille kommentar. Forsøger jeg at parse XML løber jeg konstant ind i følgende fejl. Uanset hvilken metode jeg forsøger at benytte til at parse:

has notes:XML tolkningsfejl: intet element fundet adresse: http://localhost:8084/Interface/Socket linje 1, kolonne 1:
Avatar billede jonah.hex Nybegynder
09. januar 2010 - 14:04 #2
hvorfor er det svært at forklare når du har siddet med det længe
Avatar billede caho Nybegynder
09. januar 2010 - 15:35 #3
Fordi jeg måske er mere indforstået med koden end udefrakommende læsere. Der er risiko for, at jeg tager nogle ting for givet, der gør problemet svært at forstå som læser. Har du fx. svært ved at forstå mit spørgsmål?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester