GWT RPC调用无法在编译模式下工作

时间:2013-02-05 09:21:22

标签: java ajax gwt rpc

我正在构建一个GWT应用程序。以前,每当我从网页请求图像时,该请求都会转到客户端类,而该类用于提供图像。这适用于GWT生成的URL以及编译后的独立文件URL。

但是现在我已经用服务器的Ajax(RPC)调用替换了那部分,其中服务器端类从客户端类接收必要的参数,并提供由客户端类发送的映像。到UI。这适用于GWT生成URL,但在编译之后,当我尝试将其作为独立HTML运行时(通过在URL栏中提供文件的路径),不会触发Ajax请求。

是因为RPC调用需要服务器来响应(与jQuery Ajax调用相比,它仅在桌面上运行得很好)?我如何在桌面模式下模仿Ajax行为呢?电话看起来像这样:

private final GreetingServiceAsync response = GWT.create(GreetingService.class); //(I haven't changed the defualt names..:))
response.greetServer(i, j,new AsyncCallback<String,String>() {  // i,j is already calculated, server needs to know these to pass an image url
     public void onSuccess(String url1, String url2) {...}
     public void onFailure(Throwable caught) {...}
});

3 个答案:

答案 0 :(得分:2)

你完全离开了GWT structure

编译项目后,所有GWT代码都会转换为JavaScript。

即使没有服务器正在运行,并且您从文件系统(例如C://myapp/myapp.html)访问了html文件。浏览器将其作为静态网络

页面..ofcourse里面的html页面会有你的app.nochahe.js这是纯粹的javascript。

所以没有任何犹豫,浏览器会显示所有内容..但它永远不会成为所谓的Web应用程序,它永远不会制作任何ajax或任何其他服务器

呼叫。

在您的情况下,您没有运行任何服务器并以static pages方式访问它们,并期望它们连接server并带来您的数据,这是非常不可能的。

首先,请在开发模式下运行||调试代码。

开始运行或调试项目后..开发模式选项卡中生成的URL将如下所示。

h t t p : / / localhost : 8888 / MyModule.html ? gwt.codesvr = localhost : 9997

您可能对参数gwt.codesvr有疑问。

它运行您的客户端Java代码,该代码被编译为类文件,但尚未编译为JavaScript文件。

完成您的实现后,编译项目并将war文件夹导出到任何服务器上以测试或访问它们并以

方式访问它们
ex:localhost:8080/myapp/someservice.

进入所谓的AJAX调用,它们在GWT中是RPC .RPC是与服务器通信的GWT内部结构,通常它们都是impl类,一般是扩展的RemoteServiceServlet HTTP协议上的客户端数据,无法在不运行服务器的情况下唤起它们。

如果您仍然对不同的GWT应用模式感到困惑,请参阅此差异link

答案 1 :(得分:1)

您的意思是,您是否只是直接从文件系统打开HTML主页?这不起作用,因为您没有服务器。这样就没有服务器端可以接听你的RPC调用。您必须在servlet容器(如Tomcat或Jetty)中运行GWT应用程序,以便服务器端RPC servlet正在运行并准备好应答来自客户端的RPC调用。

即使您在某处运行服务器。如果您只是从文件系统中打开文件,则RPC调用无法在哪里找到服务器。 RPC调用使用URL(主机页基URL)来定位其服务器。在您的情况下,这是file://C/something而不是http://www.hererunsaserver.com/

您可以在应用中嵌入数据,以实现某种桌面模式。但我不知道这是否是你要做的?

答案 2 :(得分:1)

这应该是可行的。您必须实现onFailure,因为如果没有可用的服务器,它将被调用。

为AsyncCallback创建一个新类,就像这样,(默认情况下AsyncCallback只有一个参数,你用两个参数实现了吗?):

public class UrlCallback implements AsyncCallback<String, String> {
    private String url1;
    private String url2;

    public UrlCallback(String url1, String url2) {
        this.url1 = url1;
        this.url2 = url2;

    }
    @Override
    public void onSuccess(String result1, String result2) {

        //"Do what you want to do here"

    }

    @Override
    public void onFailure(Throwable caught) {

        //Respond the static file here

    }

}

我在我的情况下处理它,当我没有互联网连接时,从localstorage服务器image-urls:

public class PictureCallback implements AsyncCallback<Picture> {
    private Image picture;
    private IAppRequestTransportSupport storage;
    private String storeId;

    public PictureCallback(String storeId, Image picture) {
        this.picture = picture;
        this.storage = new  AppLocalStorageSupport();
        this.storeId = storeId;
    }
    @Override
    public void onSuccess(Picture result) {

        picture.setUrl(result.getImageUrl());
        storage.doOnSuccess(result.getImageUrl(), "picture"+storeId);

    }

    @Override
    public void onFailure(Throwable caught) {

        try {
            String pic = storage.readFromLocaleStorage("picture"+storeId);
            if(pic != null && !pic.equals("")) {
                picture.setUrl(pic);
            }
        } catch (KeyNotFoundException e) {
            e.printStackTrace();
        } catch (NoLocaleStorageSupportException e) {
            e.printStackTrace();
        }
    }

}