[Java / JavaScript] Zugriff auf einen Webservice mit JQuery

Tumbleweed schrieb:
Ich weiß nicht wie das bei GlassFish ist, aber du musst dein Servlet natürlich gemountet haben auf der URL, die du mit dem ajax request ansprichst.

in der web.xml steht als url-pattenr "/ZugriffAufWebService", Ajax soll aber mit der URL "de/testpackage/TestClass" kommunizieren.. ich glaube da wird ein armes kleines Servlet richtig lange warten müssen, bis etwas ankommt.
 
Glassfish läuft aufjedenfall und ich erreiche das Projekt auch über die URL.

Wird in der web.xml als url Pattern nicht immer das Hauptverzeichnis angegeben? Die Klasse soll sich dann im de/testpackage Ordner befinden.
Die volle URL müsste also "http://localhost:8080/ZugriffAufWebService/de/testpackage/TestClass.java" sein.

Die Java Datei liegt jetzt vorläufig im gleichen Ordner wie die JavaScript Datei und kann deswegen gefunden werden, allerdings wird die doPost Methode nicht ausgeführt.


Ich glaube die Fehlermeldung, die kommt wenn ich dataType: json; angebe kommt daher, dass der Quellcode der Datei zurückgegeben werden soll, aber in diesem Quellcode Zeichen enthalten sind, die nicht in einem json gespeichert werden können. Aber ich kann mir noch nicht erklären warum immer der Quellcode zurückgegeben wird.
 
Zuletzt bearbeitet:
​Du willst doch aber nicht auf die Java-Datei zugreifen. Die ist ja noch nicht mal kompiliert. Du willst auf den Service zugreifen, der hinter

http://localhost:8080/ZugriffAufWebService/

gehostet ist. Der Service empfängt http requests, d.h. zum Beispiel den GET call des Browsers und später den POST call des ajax requests. Diese landen dann auch in doGet und doPost. Dass dieser Service gehostet wird und auf Grundlage welcher Klasse, dafür sorgt der GlassFish auf Grund seines Wissens aus der web.xml oder Annotation.
​Deswegen stand bei meinem ajax POST auch nur "ServiceSandbox" als URL. Meine Klasse ServiceSandbox habe ich unter gleichem Namen per Annotation auf ServiceSandbox gemountet, so wie du TestClass auf ZugriffAufWebService gemountet hast (oder zumindest wolltest du das, irgendwas liegt da aber im Argen).
 
Zuletzt bearbeitet:
Achso, jetzt wird mir das Problem klar.

Ich habe die web.xml angepasst und jetzt zeigt mir die Konsole von Glassfish eine Fehlermeldung an:

SEVERE: Ausnahme beim Deployment der Anwendung [ZugriffAufWebService] : There is no web component by the name of ZugriffAufWebservice here.
SEVERE: Ausnahme beim Deployment der Anwendung [ZugriffAufWebService]
SEVERE: There is no web component by the name of ZugriffAufWebservice here.
java.lang.RuntimeException: There is no web component by the name of ZugriffAufWebservice here.
at com.sun.enterprise.deployment.node.web.WebCommonNode.endElement(WebCommonNode.java:228)
......

Anscheinend wird das Servlet noch nicht gefunden.


Edit: Jetzt wird das Servlet gefunden und es kommt immerhin schonmal "null" zurück, das ist deutlich besser als der Quellcode hoffe ich.
Die Meldung RequestFailed wenn ich json als Datentyp angebe bleibt allerdings.
 
Zuletzt bearbeitet:
Wie hast du denn bewerkstelligt, dass das Servlet JSON liefert? Response header gesetzt und ein JSON Objekt in die response gesetzt?

Heißt "Servlet wird gefunden", dass deine doGet/doPost-Methode durchläuft (mit breakpoint oder Konsolenausgabe testen)? Wenn nicht, dann passt das immer noch nicht und du solltest vielleicht nochmal deine web.xml zeigen.
 
Die doPost wird ausgeführt.

Das mit dem json ist noch das Problem. Mein Serlvet liefert kein json zurück, wenn ich DataType weglasse bekomme ich einfach den Text zurück der in "dataString" gespeichert wurde.

Das sieht jetzt testweise so aus:



Code:
$(".button").click(function() {
           $.ajax({
                                           
                type: "POST",
                url: "TestServlet",
           //   dataType: "json",
                data: {dataString: "Andreas"}
                                           
          
             }).done(function(data){
                    $("span").text("Data Saved:" + data).show();
                                           
                                           
                                           
            }).fail(function(error1, error2, error3){
                     $("span").text("Request failed:" + error1 + error2 + error3).show();
                                           
             })

                                       
      });


und die doPost():

Code:
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


                   String vorname = request.getParameter("dataString");
            
                    PrintWriter out;
                    response.setContentType("text/html");
                    response.setHeader("Cache-control", "no-cache, no-store");
        
                out = response.getWriter();
                out.println("Hallo" + vorname + "");


    }

Ich bekomme "Hallo Andreas" zurück, aber nicht als json. Wahrscheinlich liegt der Fehler im Servlet, denn es wird nirgendwo ein json erstellt.
 
response.setContentType("text/html");

das sieht mir falsch aus. Der MIME-type für JSON steht in dem ersten Link in meinem letzten Beitrag. Das könnte schon reichen.

Ach und was mir gerade noch klar wird - du willst JSON zurückgeben, schreibst aber einfach nur Text in die response. Was du stattdessen willst, ist einen value in das response-Objekt zu setzen. Würde ich zumindest annehmen, ich habs noch nicht versucht. JSON ist ja kein gewöhnlicher Text wie das was du da ausgibst, sondern eine formatierte Objektdefinition.

Schreib mal, was dein eigentliches Ziel ist, d.h. ob du irgendwelchen Text zurücksenden willst oder wirklich Daten, d.h. keys mit zugehörigen Werten.
 
Zuletzt bearbeitet:
Am Ende soll das Servlet Daten aus einer Datenbank auslesen und diese auf Anfrage an den Client senden. Ich glaube die Möglichkeit Arrays in einem json zu speichern ist dafür ganz gut geeignet.
setContentType habe ich auf application/json geändert, aber die Meldung bleibt gleich.

Mit dieser doPost Methode:
Code:
 String vorname = request.getParameter("dataString");                  
                   
                    response.setContentType("application/json");
                    response.setHeader("Cache-control", "no-cache, no-store");
                    
                    PrintWriter out;
                    JSONObject json = new JSONObject();
                    try {
                         json.put("Name", vorname);
                    } catch (JSONException ex) {
                          Logger.getLogger(TestServlet.class.getName()).log(Level.SEVERE, null, ex);
                     }
                    out = response.getWriter();
                    out.println(json);

kommt die Meldung: "Data Saved:[object Object]".
 
Zuletzt bearbeitet:
Das sieht schon ganz gut aus. Ich könnte mir vorstellen (weiß es aber nicht mit Sicherheit), dass du nun nicht mehr
Code:
out = response.getWriter();
out.println(json);
benutzen kannst, denn das wäre ja wieder text/html, das du da antwortest. Mit dem put vorher hast du das JSON-Objekt bereits im response payload platziert und du solltest im F12 des Browsers in der Netzwerkansicht bereits genau diese Daten als response auf den ajax call sehen. D.h. das würde ich mal weglassen und schauen, was auf JS-Seite ankommt.
Du bekommst da ja im success callback 3 Datensätze überreicht
Code:
success(data, textStatus, jqXHR)
Die würde ich mal entweder ausgeben oder im Debugger schauen, was da drinsteht.

kommt die Meldung: "Data Saved:[object Object]"
Das war schon auf JS-Seite oder in der GlassFish-Konsole?

Edit: Moment, mir ist gerade aufgefallen, du befüllst ja nur dein JSON-Objekt, setzt es aber nicht in die response. Mach das mal. Das geht nicht mit printLn sondern mit put oder so, mir fällt gerade nicht der Methodenname ein.

Edit2: Mal hier abschauen.
 
Zuletzt bearbeitet:
data, testStatus und jqXHR geben "[object Object]success[object Object]" aus. die Meldung "Data Saved......" erscheint auf der JS-Seite.

Anstelle von:
Code:
out = response.getWriter();
out.println(json);
hab ich das jetzt mit:
Code:
response.getWriter().write(json.toString());
ausprobiert, aber ich bekomme die gleiche Meldung.

Edit:
Die Netzwerkkonsole von Firebug zeigt unter "Post" die richtigen Daten an. Unter "Antwort" steht "{"Name":"Andreas"}". Bei meiner alten Methode, die weiter oben steht (post #26) zeigt mir Firebug unter Antwort "Hallo Andreas" an.
 
Zuletzt bearbeitet:
Dann kann es aus meiner Sicht jetzt nur noch an der Art hapern, wie du dein JSON-Objekt zusammenbaust. In dem einen verlinkten Beitrag kam der Ersteller ja auch zu der Erkenntnis, dass er anders herangehen muss:
Got it working! I should have been building a JSONArray of JSONObjects and then add the array to a final "Addresses" JSONObject

Vielleicht spielst du an der Stelle mal rum.

Die Netzwerkkonsole von Firebug zeigt unter "Post" die richtigen Daten an. Unter "Antwort" steht "{"Name":"Andreas"}". Bei meiner alten Methode, die weiter oben steht (post #26) zeigt mir Firebug unter Antwort "Hallo Andreas" an.
Na das sieht doch schon mal gut aus. {"Name":"Andreas"} ist JSON.

"Hallo Andreas" hingegen ist plain text, also quasi text/html.
 
Zuletzt bearbeitet:
Könnte das Problem nicht auch daran liegen, dass das json in der js Datei nicht richtig verarbeitet wird und deswegen nur [object Object] angezeigt werden kann?

Edit: Firebug zeigt mir jetzt auch in der Netzwerkkonsole unter dem Reiter "JSON" eine Tabelle mit den Daten an, die ich im json speichere, also scheint das schonmal rivhtig u funktionieren.
 
Zuletzt bearbeitet:
Ich arbeite nie mit JS und begebe mich jetzt auf ganz dünnes Eis, aber was erwartest du denn statt [object Object]? Das ist ja eigentlich genau das, was du wolltest: $("span").text("Data Saved:" + data).show();
Wenn du den Namen möchtest, dann solltest du auch auf diesen zugreifen :)

Noch was zu oben: Solange man JSON mit dem für JSON bestimmten MIME-Type ausliefert, ist völlig egal, ob man im Servlet getWriter (character data) oder getOutputStream (binär) benutzt. JSON ist einfach nur simpler Text, MIME-Type hin- oder her. Der MIME ist eine Erfindung für's web, Java und JSON selbst wissen gar nicht, was das sein soll, das ist maximal für dem Empfänger interessant. Wo wir gerade dabei sind: plain text ist text/plain, nicht text/html :)
 
Zuletzt bearbeitet:
Stimmt, text/plain gibt es ja auch noch. Ich sehe das Problem aber hier auch gelöst. JSON wird offenbar übertragen, nun muss es nur noch auf Browserseite interpretiert werden, d.h. mit Ajax das Objekt schnappen und auswerten. Das "Hallo" wird also in diesem Fall von Javascript davor gesetzt, nicht schon auf Java-Seite.
 
Jetzt geht es endlich! Wenn ich data.name aufrufe bekomme ich die Daten die im json gespeichert wurden.

Vielen Dank! Ihr habt mir damit echt einen großen Gefallen getan!
 
Zurück
Oben