窗口关闭处理程序中可能有GWT RPC吗?

时间:2012-03-08 22:28:48

标签: gwt

我在听一个窗口关闭事件:

closeHandlerReg = Window.addCloseHandler(new CloseHandler<Window>() {
  @Override
  public void onClose(CloseEvent<Window> event) {
    // ...
  }
});

文档说没有UI可以在该回调中显示。 GWT RPC调用怎么样?我正在尝试创建一个,但它没有出现在服务器上(在断点或日志语句中)。

4 个答案:

答案 0 :(得分:2)

问题是GWT RPC是异步的,并且对RPC服务的调用立即返回。在这种情况下,窗口在浏览器有机会发送基础XMLHTTPRequest之前关闭。

如果绝对必要,你应该能够使用“同步”XMLHTTPRequest手工调用某种servlet(而不是GWT RPC)。请看这里的示例:http://weblogs.asp.net/bleroy/archive/2005/12/15/433278.aspx

但实际上你不应该在window.onunloadwindow.onbeforeunload中做这类事情(这些是Window的CloseEvent和ClosingEvent的底层DOM事件。也许有更好的方法做你想做的事。

答案 1 :(得分:2)

您应该可以使用用例。当您在closeHandler中进行RPC调用时,它应该到达服务器,因为当它直接返回时,它已经开始发送数据,并设置回调以等待结果。但是,回调将失败,因为窗口关闭会导致连接丢失。但这不是问题,因为您只想通知服务器。所以问题可能是你发送了什么?当你在代码中的某个其他位置发送它而不是在closeHandler中时,它是否可以工作?

答案 2 :(得分:0)

古老的问题,但仍然-也许有人面临着同样的问题。

如前所述,

RPC无法在结束处理程序中运行。这个解决方法对我有用:

在onClose方法中,执行以下操作:

Window.Location.replace(GWT.getModuleBaseURL() + "rpcCall?param1=" + param1 + "&param2=" + param2);

而“ rpcCall”是您在web.xml文件中设置的rpc URL的名称。当然,可以在URL中传递随机数量的参数。

然后,在rpc接口的服务器端实现中,您可以覆盖doGet方法:

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {

    String param1 = URLDecoder.decode(request.getParameter("param1"), "UTF-8");
    String param2 = URLDecoder.decode(request.getParameter("param2"), "UTF-8");

    // do something
}

答案 3 :(得分:0)

另一种解决方案:不要在窗口关闭时进行rpc调用,但是可以由服务器端的自定义servlet处理常规的http调用。

在GWT模块中,执行以下操作:

Window.addWindowClosingHandler(new ClosingHandler() {

        @Override
        public void onWindowClosing(ClosingEvent event) {
            sendWindowClosed(GWT.getModuleBaseURL() + "teardownservice");
        }
    });


    private native void sendWindowClosed(String url)
    /*-{
        var Http = new XMLHttpRequest();
        Http.open("GET", url);
        Http.send();
       }-*/;
}

然后在服务器端servlet中,您可以处理此调用:

public class TearDownServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        .... whatever you want ....
    }
}