是否有任何好的工具可用于将GWT(Google Web Toolkit)与ASP.Net服务器应用程序一起使用?GWT的编程模型和工具非常好,但是如果后端可以保留在C#/ ASP.Net中则会很好.
目前有一个很好的解决方案吗?
我正在开发一个GWT项目,其中ASP.NET是我在服务器上的唯一选择.我发现,虽然它需要一些额外的工作,JavaScript Overlay类型可以让它变得简单.无论您的服务器使用什么技术,只要它可以使用JSON序列化数据进行响应.例如,如果您在C#中有一个Contact类:
public class Contact { public int Id { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public string Email { get; set; } }
设计您的服务器,使其返回序列化为JSON.我使用ASP.NET MVC是因为它需要很少的工作.这是一个非常简单的例子,我们假设Contact有一个静态方法,给定一个id,它将返回一个Contact实例:
public class ContactController : Controller { public ActionResult GetContact (int id) { return Json(Contact.GetById(id), JsonRequestBehavior.AllowGet); } }
现在,在您的GWT应用程序中,为您的联系人创建JavaScript覆盖类型:
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 + ')'); }-*/; }
接下来,在您的GWT项目中,使用HTTP请求与服务器通信:
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 } } }
也可以使用具有覆盖类型的泛型类型.例如,我从不返回一个裸对象,我总是使用通用容器进行传输,这样我就可以轻松处理客户端的错误报告.
C#:
public class ServerResponse{ public T Payload { get; set; } public bool Success { get; set; } public String Message { get; set; } }
Java的:
public class ServerResponseextends 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; }-*/; }
这让我可以返回我的联系人,一组联系人或其他什么.它还有助于减少数据加载逻辑中的重复.
这是一个非常简单的示例,但希望它足以为任何需要非Java后端帮助的人清除路径.我发现有助于讨论覆盖类型的另一个资源是Matt Raible的"使用GWT中的JavaScript覆盖类型进行JSON解析 ".
根据GWT FAQ,你应该能够做到这一点.
AJAX的核心是从浏览器中运行的JavaScript应用程序对服务器进行数据读/写调用.GWT是"RPC不可知的",对于用于发出RPC请求的协议,甚至服务器代码编写的语言都没有特别的要求.虽然GWT提供了一个类库,使得与J2EE服务器的RPC通信非常容易,您不需要使用它们.相反,您可以构建自定义HTTP请求以检索,例如,JSON或XML格式的数据.
我不知道有任何简化对象序列化/反序列化逻辑的项目,如果这是你的问题.
客户端GWT代码被编译为javascript,因此用于服务它的服务器并不重要.