2

我正在构建一个 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) {...}
});
4

3 回答 3

2

你完全脱离了GWT structure

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

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

页面 ..ofcourse 在那个 html 页面里面会有你app.nochahe.js 的纯 javascript。

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

称呼。

在您的情况下,您没有运行任何服务器并将它们作为 a 访问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应用程序模式感到困惑,请参阅此差异链接

于 2013-02-08T19:05:38.907 回答
1

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

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

您可能会在应用程序中嵌入您的数据,以实现某种桌面模式。但是不知道你是不是这样的?

于 2013-02-08T12:47:32.270 回答
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

    }

}

我在我的情况下处理它,当我没有互联网连接时从本地存储服务器图像 URL:

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();
        }
    }

}
于 2013-02-12T15:44:10.727 回答