我试图在服务接口中定义一个静态方法来进行rpc调用。但它不允许我这样做。在这里,我正在粘贴我的代码
客户端类
public void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics) {
String url = GWT.getModuleBaseURL() + "domesticservice";
domesticServiceAsync = (DomesticServiceAsync) GWT.create(DomesticService.class);
ServiceDefTarget endpoint = (ServiceDefTarget) domesticServiceAsync;
endpoint.setServiceEntryPoint(url);
domesticServiceAsync.sendDomesticData(product,dma,yrmnths,dist,metrics,new Domestichandler<Void>() );
}
public class Domestichandler<Void> implements AsyncCallback<Void> {
@Override
public void onFailure(Throwable caught) {
String error = caught.getMessage();
System.out.println(error);
}
public void onSuccess(Void result) {
System.out.println("perfect");
}
}
Service
public interface DomesticService extends RemoteService {
public void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics);
}
public interface DomesticServiceAsync {
void sendDomesticData(String product,String dma,String yrmnths,String dist,String metrics,AsyncCallback<Void> callback);
}
服务器端 -
public void sendDomesticData(String product, String dma, String yrmnths, String dist, String metrics) {
System.out.println(product);
}
基本上我试图将值从前端接口发送到服务器端,我不想要任何返回值。但是传递给服务器端的值应该全局存储在服务器类中,这样我就可以用不同的方法访问这些值。我尝试将所有senddomestic值更改为static但不允许我这样做?为什么呢?
答案 0 :(得分:1)
因为RemoteServiceServlet需要以某种方式调用您的服务方法,并且实现需要实例方法。但这不应该阻止您将方法数据分配给静态字段。请注意多线程。
答案 1 :(得分:1)
GWT始终使用实例方法进行RPC调用,在这种情况下无法使用静态方法。
了解GWT的重要之处在于任何RemoteServiceServlet实例都是由servlet容器(例如Tomcat)创建和维护的。 servlet容器可能在启动时创建许多servlet实例(Tomcat默认创建6个RemoteServiceServlet实例),然后使用负载平衡来确定哪个servlet在特定时间点处理RPC请求。当然,根据设置,您几乎无法控制哪个RemoteServiceServlet实例将完全处理特定的RPC请求。
因此,如果您想使用RPC调用在服务器端全局存储信息,YuPPie提出的使用RemoteServiceServlet实现的静态字段的想法是一个不错的想法。您将不知道服务器维护的哪个RemoteServiceServlet实例包含您的静态数据,并且任何后续调用来检索数据都会产生不稳定的结果。
但是你有几个选择。将信息存储在数据库(或类似的东西)中是最直接的选择,但是从你的帖子我猜你想要更简单的东西。保存数据的单例类可能是要走的路。一个线程安全的例子:
public class DataContainer
{
private static DataContainer _singleton;
private String _dataField1;
public static synchronized DataContainer getInstance()
{
if (_singleton == null)
_singleton = new DataContainer();
return _singleton;
}
public synchronized String getDataField1()
{
return _dataField1;
}
public synchronized void setDataField1(String dataField1)
{
_dataField1 = dataField1;
}
}
然后在RPC调用的服务器端实现中,您可以执行以下操作:
public void sendDomesticData(String product, String dma, String yrmnths, String dist, String metrics)
{
DataContainer.getInstance().setDataField1(product);
}
这样,如果有多个servlet实例,它们将共享DataContainer的单例实例,从而为您提供全局存储数据的位置。我希望这会对你有所帮助。