0

我正在尝试熟悉使用 GWT api 创建基于 Web 的应用程序。我一直在关注一些关于 GWT 的教程,但还不能进行 RPC 调用。从广泛的角度来看问题,我的目标是进行服务器调用以运行我知道有效的一系列数据库测试(我测试了此代码)。

- -编辑 - -

我认为这里的问题是正在这里寻找资源:/MatesWeb/org.matesweb.Main/peopleService

当我认为应该在这里寻找它时:/MatesWeb/peopleService

---END_EDIT---

这是我认为相关的信息和代码:

- 使用 netbeans

- 我得到的错误是“/MatesWeb/org.matesweb.Main/PeopleService - 描述 - 请求的资源不可用。”

-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。我假设这意味着您在MatesWeb/目录中有一个 html 文件(可能 .war 文件称为 MatesWeb?),其中存在已编译的应用程序org.matesweb.Main/,包括初始 JS 文件org.matesweb.Main.nocache.js.

如果您想告诉在 找到该服务/MatesWeb/peopleService,您有两种选择。首先是修改注解来备份一个目录,像这样:

@RemoteServiceRelativePath("../peopleService")

使用..,我表示父目录,并且我还更改了路径部分“peopleService”的大小写 - 这可能会或可能不会重要。第二种选择是以编程方式设置 url:

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

@RemoteServiceRelativePath如javadocs http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/user/client/rpc/RemoteServiceRelativePath.html中所引用。

相反,如果您希望让客户端保持原样并告诉服务器该服务应该位于客户端期望的路径中,您可以修改web.xml以使 servlet 在客户端当前期望找到的路径上可用:

<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 回答