0

GWT API を使用して Web ベースのアプリケーションを作成することに慣れようとしています。GWT に関するいくつかのチュートリアルに従っていますが、まだ RPC 呼び出しを行うことができません。問題を広い範囲で見ると、私の目標は、サーバー呼び出しを行って、動作することがわかっている一連のデータベース テストを実行することです (このコードをテストしました)。

- -編集 - -

ここでの問題は、リソースがここで検索されていることだと思います: /MatesWeb/org.matesweb.Main/peopleService

ここで探す必要があると思うとき: /MatesWeb/peopleService

---END_EDIT---

関連する情報とコードは次のとおりです。

-netbeans の使用

-私が得ているエラーは「/MatesWeb/org.matesweb.Main/PeopleService - description - The requested resource is not available.」です。

-GWT.getModuleBaseURL() の戻り値: :8080/MatesWeb/org.matesweb.Main/

-ブラウザの URL は: :8080/MatesWeb/

web.xml ファイルから

<servlet>
    <servlet-name>peopleService</servlet-name>
    <servlet-class>org.matesweb.server.PeopleServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>peopleService</servlet-name>
    <url-pattern>/peopleService</url-pattern>
</servlet-mapping>

PeopleService サービス パッケージ org.matesweb.client から;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("PeopleService")
public interface PeopleService extends RemoteService {

String[] saveGetPerson(String[] persInfo);
int runTests();

}

PeopleServiceImpl パッケージ org.matesweb.server から;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import org.matesweb.client.PeopleService;

import org.matesweb.server.tests.DbTest;

class PeopleServiceImpl extends RemoteServiceServlet implements PeopleService {

    @Override
    public String[] saveGetPerson(String[] persInfo) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public int runTests()
    {
        int retInt;

        DbTest dbTest = new DbTest();
        retInt = dbTest.runTests();
        return retInt;
    }

}

PeopleServiceAsync から

package org.matesweb.client;

import com.google.gwt.user.client.rpc.AsyncCallback;

public interface PeopleServiceAsync
{
  void saveGetPerson(String[] persInfo, AsyncCallback<String[]> persInformation);
  void runTests(AsyncCallback<Integer> retInt);
}

ここで何が起こっているのか分かりますか?

乾杯、ニック

4

2 に答える 2

1
@RemoteServiceRelativePath("PeopleService")

@RemoteServiceRelativePathアノテーションは、ヒットする URL を決定するために使用されます。サーバーへのこのパスは、コンパイルされたモジュール自体 (パスからロードされた gwt アプリ)に対して相対的/MatesWeb/org.matesweb.Main/であるため、サービスは で検索され/MatesWeb/org.matesweb.Main/PeopleServiceます。これは、ディレクトリに html ファイルがありMatesWeb/(おそらく .war ファイルは MatesWeb と呼ばれますか?)、その中にコンパイル済みのアプリが存在しorg.matesweb.Main/、最初の JS ファイルが含まれていることを意味すると思いますorg.matesweb.Main.nocache.js

サービスが で見つかるようにするに/MatesWeb/peopleServiceは、2 つのオプションがあります。1 つ目は、次のように、ディレクトリをバックアップするように注釈を変更することです。

@RemoteServiceRelativePath("../peopleService")

を使用し..て、親ディレクトリを示し、パス部分「peopleService」の大文字と小文字も変更しました。これは問題になる場合とそうでない場合があります。2 番目のオプションは、URL をプログラムで設定することです。

PeopleServiceAsync service = GWT.create(PeopleService.class);
((ServiceDefTarget)service).setServiceEntryPoint("/MatesWeb/peopleService");

@RemoteServiceRelativePathJavadoc http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/user/client/rpc/RemoteServiceRelativePath.htmlで参照されているとおり。

代わりに、クライアントをそのままにして、このサービスがクライアントが期待するパスにある必要があることをサーバーに伝えたい場合は、 を変更しweb.xmlて、クライアントが現在期待しているパスでサーブレットを利用できるようにすることができます。

<servlet-mapping>
    <servlet-name>peopleService</servlet-name>
    <url-pattern>/MatesWeb/org.matesweb.Main/PeopleService</url-pattern>
</servlet-mapping>

大文字と小文字を変更したことにもう一度注意してください - それは問題ではないかもしれませんが、私は一般的に一貫性を保ちたいと思っています。

于 2012-12-12T06:03:01.080 に答える
0

最初の勘は、PeopleServiceは@RemoteServiceRelativePathのpeopleServiceでなければならないということです。Firebugを使用してRPCリクエストを監視してください。このようなリクエストURLの問題を簡単に観察して確認できます。

ここのようにweb.xmlのURLパターンを更新します

<url-pattern>/org.matesweb.Main/greet</url-pattern>
于 2012-12-12T02:07:59.597 に答える