我正在努力熟悉使用GWT api来创建基于Web的应用程序。我一直在关注GWT的一些教程,但还没有能够进行RPC调用。在广泛的范围内查看问题,我的目标是进行服务器调用以运行我知道工作的一系列数据库测试(我已经测试了这段代码)。
--- --- EDIT
我认为这里的问题是这里正在寻找资源: /MatesWeb/org.matesweb.Main/peopleService
当我认为应该在这里寻找: / MatesWeb / peopleService
--- --- END_EDIT
以下是我认为相关的信息和代码:
- 使用netbeans
我得到的错误是“/MatesWeb/org.matesweb.Main/PeopleService - description - 请求的资源不可用。”-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);
}
有什么想法在这里发生?
干杯, 尼克
答案 0 :(得分:1)
@RemoteServiceRelativePath("PeopleService")
@RemoteServiceRelativePath
注释用于决定要击中的网址。这个路径到服务器是相对到编译模块本身 - 从路径/MatesWeb/org.matesweb.Main/
加载的gwt应用程序,因此正在{{{ 1}}。我假设这意味着你在/MatesWeb/org.matesweb.Main/PeopleService
目录中有一个html文件(可能.war文件叫做MatesWeb?),里面有MatesWeb/
中编译的应用程序,包括最初的JS文件, org.matesweb.Main/
。
如果您想告诉在org.matesweb.Main.nocache.js
找到服务,您有两种选择。第一种是修改注释以备份目录,如下所示:
/MatesWeb/peopleService
使用@RemoteServiceRelativePath("../peopleService")
,我指出父目录,我也改变了路径部分'peopleService'的情况 - 这可能也可能不重要。第二个选项是以编程方式设置URL:
..
在PeopleServiceAsync service = GWT.create(PeopleService.class);
((ServiceDefTarget)service).setServiceEntryPoint("/MatesWeb/peopleService");
javadocs http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/user/client/rpc/RemoteServiceRelativePath.html中引用。
相反,如果您希望按原样离开客户端并告诉服务器该服务应该位于客户端期望的路径上,您可以修改@RemoteServiceRelativePath
以使servlet在该路径上可用客户目前希望找到它:
web.xml
再次注意我已经改变了案例 - 这可能无关紧要,但我通常希望保持一致。
答案 1 :(得分:0)
第一个预感是PeopleService必须是@RemoteServiceRelativePath中的peopleService。请使用firebug来监控您的rpc请求。您可以轻松地观察和验证这些请求网址问题。
在web.xml中更新您的网址格式,如此处
<url-pattern>/org.matesweb.Main/greet</url-pattern>