Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are there any good tools for integrating GWT with ASP.Net? [closed]

Tags:

c#

asp.net

gwt

Are there any good tools available for using GWT (the Google Web Toolkit) with an ASP.Net server application? The programming model and tools for GWT are quite nice, however, it would be nice if the backend could remain in C#/ASP.Net.

Is there currently a good solution available for this?

like image 356
jsight Avatar asked May 19 '09 21:05

jsight


1 Answers

I am working on a GWT project where ASP.NET is my only option on the server. I have found that, while it requires a little extra work, JavaScript Overlay types can make it easy. It doesn't matter what technology your server is using, so long as it can respond with JSON serialized data. For instance, if you have a Contact class in C#:

public class Contact 
{
  public int Id { get; set; }
  public string LastName { get; set; }
  public string FirstName { get; set; }
  public string Email { get; set; }
}

Design your server so that it returns this serialized as JSON. I use ASP.NET MVC for this because it requires so little work. Here's a very simple example where we'll assume that Contact has a static method that, given an id, will return a Contact instance:

public class ContactController : Controller 
{
  public ActionResult GetContact (int id) 
  {
    return Json(Contact.GetById(id), JsonRequestBehavior.AllowGet);
  }
}

Now, in your GWT application, create a JavaScript overlay type for your Contact:

import com.google.gwt.core.client.JavaScriptObject;

public class Contact extends JavaScriptObject {
  protected Contact() { }

  public final native int getContactId() /*-{ return this.Id; }-*/;
  public final native String getLastName() /*-{ return this.LastName; }-*/;
  public final native String getFirstName() /*-{ return this.FirstName; }-*/;
  public final native String getEmail() /*-{ return this.Email; }-*/;

  public static final native Contact createFromJson(String json) /*-{
    return eval('(' + json + ')');
  }-*/;
}

Next, in your GWT project, use an HTTP request to communicate with the server:

public class ContactLoader {
  private int id; 

  public ContactLoader(int id) {
    this.id = id;
  }

  public void beginLoad() {
    String url = "/YourService/GetContact/?id=" + id;
    RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, url);
    try {
      @SuppressWarnings("unused")
      builder.sendRequest(null, new RequestCallback() {
        @Override
        public void onResponseReceived(Request req, Response resp) {
          Contact contact = Contact.createFromJson(req.getText());
          // do something with your contact.  In my project, I
          // fire an event here for which the contact is the payload
        }

        @Override
        public void onError(Request request, Throwable exception) {
          // handle your error
        }
    catch (Exception exception) {
      // handle your error
    }
  }
}

It is also possible to use generic types with overlay types. For example, I never return a bare object, I always use a generic container for transport so that I can easily handle error reporting on the client side.

C#:

public class ServerResponse<T> 
{
  public T Payload { get; set; }
  public bool Success { get; set; }
  public String Message { get; set; }
}

Java:

public class ServerResponse<T extends JavascriptObject> 
  extends JavaScriptObject {
  protected ServerResponse() { }

  public final native T getPayload() /*-{ return this.Payload; }-*/;
  public final native boolean getSuccess() /*-{ return this.Success; }-*/;
  public final native String getMessage() /*-{ return this.Message; }-*/;
}

This lets me return my Contact, an array of Contacts or whatever. It also helps in reducing duplication in your data loading logic.

This is an overly simple example, but hopefully it is enough to clear a path for anyone needing help with a non-Java back-end. Another resource that I found helpful that discusses overlay types is "JSON Parsing with JavaScript Overlay Types in GWT" by Matt Raible.

like image 57
smcmahon Avatar answered Jan 04 '23 12:01

smcmahon