2

私はGWTアプリを構築しています。以前は、Web ページから画像を要求するたびに、その要求がクライアント クラスに送信され、そのクラスが画像の提供に使用されていました。これは、GWT で生成された URL と、コンパイル後のスタンドアロン ファイルの URL の両方で機能しました。

しかし今、その部分をサーバーへの Ajax (RPC) 呼び出しに置き換えました。サーバーサイド クラスはクライアント クラスから必要なパラメーターを受け取り、クライアント クラスから UI に送信される画像を提供します。 . これは GWT が生成する URL では問題なく動作しますが、コンパイル後、(URL バーにファイルへのパスを指定して) スタンドアロンの HTML として実行しようとすると、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 ファイルにアクセスした場合。ブラウザはそれを静的 Web として提供します

page ..ofcourse その html ページ内には、app.nochahe.js 純粋な javascript である your があります。

したがって、ブラウザはためらうことなくすべてのコンテンツを表示します..しかし、いわゆる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クラスであり、HTTPプロトコルでクライアントにデータを提供するRemoteServiceServletを拡張し、サーバーを実行せずにそれらを呼び出すことは不可能です。

GWTさまざまなアプリケーション モードについてまだ混乱がある場合は、この相違点のリンクを参照してください。

于 2013-02-08T19:05:38.907 に答える
1

ファイル システムから直接 HTML ホスト ページを開くだけの場合ですか? サーバーがないため、これは機能しません。そうすれば、RPC 呼び出しに応答できるサーバー側はありません。サーバー側の RPC サーブレットが実行され、クライアントからの RPC 呼び出しに応答できるように、GWT アプリをサーブレット コンテナー (Tomcat や Jetty など) で実行する必要があります。

どこかでサーバーを実行している場合でも。ファイル システムからファイルを開くだけの場合、RPC 呼び出しはサーバーの場所を見つけることができません。RPC 呼び出しは、URL (ホスト ページのベース URL) を使用してそのサーバーを見つけます。あなたの場合、これはfile://C/somethingの代わりですhttp://www.hererunsaserver.com/

ある種のデスクトップ モードを実現するために、おそらくアプリ内にデータを埋め込むことができます。しかし、これがあなたの意図であるかどうかはわかりませんか?

于 2013-02-08T12:47:32.270 に答える
1

これは実行可能である必要があります。サーバーが利用できない場合に呼び出されるため、onFailure を実装する必要があります。

AsyncCallback の新しいクラスを次のように作成します (デフォルトでは、AsyncCallback にはパラメーターが 1 つしかありませんが、2 つ実装しましたか?):

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 からイメージ 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 に答える