一种在不使用实际RPC servlet的情况下通过GWT中的RPC机制编组/取消链接字符串/对象的方法

时间:2011-07-20 19:12:35

标签: gwt gwt-rpc

我的大部分应用程序都使用GWT-RPC在servet和client之间进行通信。但是有些类需要通过“字符串粉碎”URL来手动构建一个get请求,其中包含各种这样的参数...

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) {
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH
            + "?templateInstanceId=" + templateInstanceId
            + "&fileName=" + pageImage.getImageId()
            + "&isBackground=false"
            + "&cropX=" + pageImage.getCropX()
            + "&cropY=" + pageImage.getCropY()
            + "&cropWidth=" + pageImage.getCropWidth()
            + "&cropHeight=" + pageImage.getCropHeight();
}

我很想知道,有没有办法让GWT相当棒的GWT-RPC对象编组来执行此操作?

public static String getTemplateImage(String templateInstanceId, PageImage pageImage) {
    return GWT.getHostPageBaseURL() + TEMPLATE_INSTANCE_IMAGE_SERVLET_PATH
            + "?templateInstanceId=" + templateInstanceId
        + "&pageImage=" + SomeGWTClass.toRpcString(pageImage)
       ;
}

然后在servlet端执行此操作...

 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        final String templateInstanceId = req.getParameter("templateInstanceId");
        final String strPageImage= req.getParameter("pageImage");
        **final PageImage pageImage = SomeGWTClass.unmarshallString(PageImage.class,strPageImage);**    
}

2 个答案:

答案 0 :(得分:0)

我不是GWT RPC是否以这种方式使用是个好主意。位于com.google.gwt.user.client.rpccom.google.gwt.server.rpc包中的GWT序列化类是GWT的内部类,您不应该从您的应用程序代码中调用它(如果您正在编写一般代码,那就没问题了)目的框架,你愿意在GWT的新版本出货时进行调整,可能会对这些类的API进行重大修改。

GWT难以实现这种通用功能的原因在于它缺乏Java的反射支持。但是,您可以使用JavaScript来获得一些灵活性。例如,如果您可以将PageImage类转换为GWT Overlay类型,则可以使用new JSONObject(pageImage).toString()将对象编组为json。像XStream这样的JSON库可以将此字符串转换回服务器上的Java对象。

有关GWT Overlay类型技术的详细信息,请参阅此question

答案 1 :(得分:0)

基本上可以做这样的事情,但实施起来却很困难。服务器部分非常简单,问题出在客户端。

由于GWT缺乏反射,因此它在编译时生成类,如FieldSerializer。对于通过GWt-RPC服务传递的任何类,GWT将创建一个FieldSerializer,它知道如何序列化/反序列化该对象。

因此,为了使用此功能,您需要创建某种框架,您将指示要序列化/反序列化某个对象,定义自定义生成器,这将生成您需要的所有内容等。

但也有一种简单的方法(但它非常脏,我不建议使用它,但是谁在乎=)。将要序列化的类添加到某些GWT-RPC服务,而不是使用 -gen 选项运行编译器。它会将所有FieldSerializer写入磁盘。您只需将它们包含在您的应用程序中并使用它们即可。但是每次更改序列化类时都需要重新生成它们。这是一个非常黑客,但我们几次用它来进行调试。

所以选择权归你的。我个人会建议忘记GWT-RPC mecahnism,并使用overlay-type + JSON parse / stringify