I expect thats what I'm missing then!

My calling method is as follows:

public native static void getJson(int requestId, String url, CallModel
handler)
/*-{
        var callback = "callback" + requestId;

    var script = document.createElement("script");
    script.setAttribute("src", url+callback);
    script.setAttribute("type", "text/javascript");

        window[callback] = function(jsonObj)
    {
        [EMAIL PROTECTED]::handleJsonResponse(Lcom/google/
gwt/core/client/JavaScriptObject;)(jsonObj);
        window[callback + "done"] = true;
    }

    // JSON download has 1-second timeout
    setTimeout(function()
    {
        if (!window[callback + "done"])
        {
            [EMAIL PROTECTED]::handleJsonResponse(Lcom/
google/gwt/core/client/JavaScriptObject;)(null);
        }

        // cleanup
        document.body.removeChild(script);
        delete window[callback];
        delete window[callback + "done"];
     }
     , 1000);

     document.body.appendChild(script);
}-*/;

I have adapted it from a useful guide here:

http://giantflyingsaucer.com/blog/?p=126

Eggsy

On Oct 7, 12:24 pm, Adam T <[EMAIL PROTECTED]> wrote:
> I think what you are missing is the function name in your output from
> the servlet.  From what I see, you just return:
>
> [{color: \"red\",value: \"#f00\"}]
>
> when I would expect a response something like:
>
> mycallback([{color: \"red\",value: \"#f00\"}])
>
> where the "mycallback" is the name of the function you add to the DOM
> which calls your handleJSONResponse method - without returning a
> function from your servlet, I'm not sure how your handle method is
> being called.
>
> Also, are you defining your callback code to pick up the parameter,
> e.g.
>
> public native static void setup(YourHandlerClass h, String callback) /
> *-{
>     window[callback] = function(someData) {
>       [EMAIL PROTECTED]::handleJSONResponse(Lcom/
> google/gwt/core/client/JavaScriptObject;)(someData);
>     }
>   }-*/;
>
> without the (Lcom/google/gwt/core/client/JavaScriptObject;)(someData)
> part it won't pick up the returned data
>
> //Adam
>
> On 7 Okt, 10:14, eggsy84 <[EMAIL PROTECTED]> wrote:
>
> > Hi Adam,
>
> > Thank you for the reply it definately helps! when you say it needs to
> > be well-formed javascript I have implemented a method that performs
> > the following:
>
> > /* (non-Javadoc)
> > * @see
> > javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
> > javax.servlet.http.HttpServletResponse)
> > */
> > @Override
> > protected void doPost(HttpServletRequest req, HttpServletResponse
> > resp) throws ServletException, IOException
> > {
> >     String output ="[{color: \"red\",value: \"#f00\"}]";
> >     resp.setContentType("text/javascript");
> >     resp.addHeader("Pragma", "no-cache");
> >     resp.setStatus(200);
> >     PrintWriter out = resp.getWriter();
> >     out.println(output);
>
> > }
>
> > Would that be sufficient? Well I ask the question but I assume not as
> > with my implementation I successfully go back to my client handle
> > method now but the JavascriptObject passed in is always null.
>
> > My client side handle method is very basic as a test (shown below) and
> > I can confirm that when the claa is complete is definately hits this
> > method so the glue between is wrong somehow?
>
> > public void handleJsonResponse(JavaScriptObject jso)
> > {
> >     if (jso == null)
> >     {
> >         Window.alert("Unable to parse JSON");
> >         return;
> >     }
> >     else
> >     {
> >         Window.alert("Well done Woohoo!!");
> >     }
>
> > }
>
> > eggsy
>
> > On Oct 6, 9:28 pm, Adam T <[EMAIL PROTECTED]> wrote:
>
> > > Eggsy,
>
> > > To get it to work you need to get the plumbing right, and it's not
> > > quite the same way as calling from code - btw, the example on that
> > > page is aimed at client side not server side.  The server is any
> > > language you want as long as it returns a well-formed JavaScript
> > > segment of the form:
>
> > > mycallback({....some json content....})
>
> > > So your servlet would work as long as it returns something like the
> > > above.
>
> > > In this approach you don't call the servlet in the normal way from the
> > > program code, rather it gets called as a consequence of adding a
> > > <script> tag to the DOM - this is what the addScript() method in the
> > > example code does.  Once the script is added to the DOM the browser
> > > accesses the defined url of your service and expects a response.  As
> > > the response is a JavaScript function, it will get evaluated in the
> > > browser.
>
> > > If you also define a function in the DOM with the same name you expect
> > > back in the server response, e.g. mycallback, and that function calls
> > > the GWT handle() function then the loop is closed.  The example code
> > > adds such a function using the setUp() method.
>
> > > The example code reserves a new function name for each "call" made to
> > > the server, adds that new function to the DOM and then the <script>
> > > tag.
>
> > > Where things usually go wrong are if the server returns a function
> > > name not set up, or the response is not a valid javascript expression.
>
> > > Hope that helps in some small way!
>
> > > //Adam
>
> > > this then gets evaluated in the browser
>
> > > On 6 Okt, 17:02, eggsy84 <[EMAIL PROTECTED]> wrote:
>
> > > > Hi all,
>
> > > > Taking the informative article by Dan Morrill at GWT
>
> > > > Link:http://code.google.com/support/bin/answer.py?answer=65632&topic=11368
>
> > > > It explains how to code for Server side mashups so that you can
> > > > perform cross site JSONP calls.
>
> > > > In the article he uses the handle method (Shown below) to handle the
> > > > return from the server side:
>
> > > > public void handle(JavaScriptObject jso) {
> > > >     JSONObject json = new JSONObject(jso);
> > > >     JSONArray ary =
> > > > json.get("feed").isObject().get("entry").isArray();
> > > >     for (int i = 0; i < ary.size(); ++i) {
> > > >       RootPanel.get().add(new
> > > > Label(ary.get(i).isObject().get("title").isObject().get("$t").toString()));
> > > >     }
> > > >   }
>
> > > > I have tried writing my own basic Java Servlet GET/POST we all know
> > > > the score and I can successfully call into my servlet but I never get
> > > > back to my client side, in this case after the servlet has done its
> > > > stuff, I never go back to the handle method to perform some whizz bang
> > > > GWT stuff - is there something specific you are required to do on the
> > > > server side? Such as extends RemoteServiceServlet as you would do in a
> > > > normal GWT AsyncCallback call? Anyone got any ideas?
>
> > > > Thanks all
>
> > > > eggsy
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to Google-Web-Toolkit@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to