设置GWT服务的入口点时遇到问题

时间:2011-01-05 20:29:35

标签: java gwt

我已经按照几个教程阅读了code.google.com上的官方文档,但仍无法解决这个问题。

我正在创建简单的服务,以检查用户是否可以被记录。

客户端:

public interface LoginService extends RemoteService {

    /**
     * Checks, if user has valid login.
     * @param user User's login.
     * @return True if such a login is in the database.
     */
     boolean isValidUser(User user);
}

这是Async接口:

public interface LoginServiceAsync {

    /**
     * Checks, if user has valid login.
     * @param user User's login.
     * @param callback the callback to return True if such a login is in the database.
     */
     void isValidUser(User user, AsyncCallback<Boolean> callback);
}

服务器端:

public class LoginServiceImpl extends RemoteServiceServlet implements LoginService {

    /**
     * serial version UID
     */
    private static final long serialVersionUID = 1044980345057997696L;

    /**{@inheritDoc} */
    @Override
    public boolean isValidUser(User user) {
        boolean success = true; //TODO change
    }

}

现在我有入口点类MailClient.java。我在这里添加了小部件:

CustomWidgets.getLoginWidget(this); // access rootPanel and append widget

现在我需要实际打电话给我的服务,这里有问题:

LoginServiceAsync loginService = (LoginServiceAsync) GWT.create(LoginService.class);
                User user = new User(boxName.getText(), boxPassword.getText());
                AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {

                    @Override
                    public void onFailure(Throwable caught) {
                        Window.alert(caught.getMessage()); //TODO change
                    }

                    @Override
                    public void onSuccess(Boolean result) {
                        Window.alert("success"); //TODO change
                    }
                };
                ((ServiceDefTarget) loginService).setServiceEntryPoint(GWT.getModuleBaseURL()+"login"); // dunno what should be here

回顾一下,我不知道如何设置服务的入口点

这是我的MailClient.gwt.xml文件:

<module>
    <inherits name="com.google.gwt.user.User"/>
    <inherits name="com.google.gwt.user.theme.standard.Standard"/> 
    <entry-point class="com.xorty.mailclient.client.MailClient"/>
    <servlet path="/login"
        class="com.xorty.mailclient.server.servlets.LoginServiceImpl" />
    <inherits name="com.xorty.mailclient.MailClient"/>
    <inherits name="com.xorty.mailclient.MailClient"/>
    <inherits name="com.xorty.mailclient.MailClient"/>
    <inherits name="com.xorty.mailclient.MailClient"/>
    <inherits name="com.xorty.mailclient.MailClient"/>
</module>

我的web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
        xmlns="http://java.sun.com/xml/ns/j2ee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <!-- Default page to serve -->
    <welcome-file-list>
        <welcome-file>MailClient.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>LoginService</servlet-name>
        <servlet-class>com.xorty.mailclient.server.servlets.LoginServiceImpl</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginService</servlet-name>
        <url-pattern>/com.xorty.mailclient.MailClient/login</url-pattern>
    </servlet-mapping>
</web-app>

这是项目结构的截图: alt text

2 个答案:

答案 0 :(得分:2)

您可以尝试将入口点设置为"login"而不是GWT.getModuleBaseURL() + "login"

但是,我建议进行一些重构,因为您似乎在使用旧的GWT API。从GWT 1.6开始,您不再需要在调用时为服务设置EntryPoint。现在,可以(并且通常应该)在服务接口上使用RemoteServiceRelativePath注释为每个服务设置一次入口点。因此,在您的示例中,LoginService界面应如下所示:

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

@RemoteServiceRelativePath("login")
public interface LoginService extends RemoteService {

     boolean isValidUser(User user);
}

完成此更改后,您可以删除此行:

((ServiceDefTarget) loginService).setServiceEntryPoint(GWT.getModuleBaseURL()+"login");

servlet文件中不再需要*.gwt.xml个条目。所以你也可以删除这一行:

<servlet path="/login" class="com.xorty.mailclient.server.servlets.LoginServiceImpl" />

您的web.xml看起来不错。

如果您正在使用带有GWT plugin的Eclipe,您可以生成一个简单的GWT项目并查看它 - 生成的项目包含示例代码,显示如何创建和调用服务。如果您没有使用GWT插件,我强烈建议您安装它 - 它会对您有所帮助。

答案 1 :(得分:0)

服务入口点是服务器上存在servlet的位置,通常在web.xml文件中配置。

这是一个相当古老的教程,但servlet配置仍然相关:

http://lkamal.blogspot.com/2008/09/java-gwt-servlets-web-app-tutorial.html