如何在web.xml中最小化gwt-rpc的servlet声明?

时间:2015-05-15 08:55:52

标签: gwt gwt-rpc

抱歉,我还是GWT的初学者。我注意到,当我的项目成长时,web.xml文件中rpc的servlet声明很多,很多很多。对于单个 * ServiceImpl 类,我们需要在web.xml中定义为

<servlet>
    <servlet-name>greetServlet</servlet-name>
    <servlet-class>com.my.testing.server.GreetingServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>greetServlet</servlet-name>
    <url-pattern>/testing/greet</url-pattern>
</servlet-mapping>

如果有30个 * ServiceImpl 类,则在web.xml中可能需要大约200行才能进行rpc调用。所以,我想知道

  1. web.xml文件是声明rpc servlets的唯一地方吗?
  2. 有些人会跳过陈述式样式(我的意思是通过注释&#39; @&#39;等)?

2 个答案:

答案 0 :(得分:3)

使用Annotations时,GWT在web.xml中没有这些声明的情况下运行良好:

/*
 * this is your server-side rpc-implementation
 */
@WebServlet(name = "YourService", urlPatterns = {"/path/to/yourservice"})
public class YourServiceImpl extends RemoteServiceServlet implements YourService {

  public void doSomething() {
    //some code
  }
}

/*
 * this is the corresponding rpc-interface
 */
@RemoteServiceRelativePath("path/to/yourservice")
public interface YourService implements RemoteService {

  void doSomething();
}

生成的servlet路径取决于您的项目结构。如果您的项目部署在服务器根目录中,您将在那里找到您的servlet(使用上面指定的路径 urlPatterns )。但是,如果您在自己的URI下部署项目,则必须将其添加到urlPattern。

答案 1 :(得分:2)

如果您使用Guice,可以使用ServletModule轻松解决此案例。 在此模块中,您可以以编程方式定义(并在JUnit中测试)所有RPC servlet和过滤器。

示例:

public class WebModule extends ServletModule {

  @Override
  protected void configureServlets() {
    // configure filters
    filter("/*").through(CacheControlFilter.class);
    filter("/*").through(LocaleFilter.class);

    // bind XSRF servlet
    bind(XsrfTokenServiceServlet.class).in(Singleton.class);
    serve("/gwt/xsrf").with(XsrfTokenServiceServlet.class);

    // configure servlet mapping
    serve("path/to/servlet").with(LoginServiceImpl.class);
  }
}