抱歉,我还是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调用。所以,我想知道
答案 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);
}
}