我在听一个窗口关闭事件:
closeHandlerReg = Window.addCloseHandler(new CloseHandler<Window>() {
@Override
public void onClose(CloseEvent<Window> event) {
// ...
}
});
文档说没有UI可以在该回调中显示。 GWT RPC调用怎么样?我正在尝试创建一个,但它没有出现在服务器上(在断点或日志语句中)。
答案 0 :(得分:2)
问题是GWT RPC是异步的,并且对RPC服务的调用立即返回。在这种情况下,窗口在浏览器有机会发送基础XMLHTTPRequest之前关闭。
如果绝对必要,你应该能够使用“同步”XMLHTTPRequest手工调用某种servlet(而不是GWT RPC)。请看这里的示例:http://weblogs.asp.net/bleroy/archive/2005/12/15/433278.aspx
但实际上你不应该在window.onunload
或window.onbeforeunload
中做这类事情(这些是Window的CloseEvent和ClosingEvent的底层DOM事件。也许有更好的方法做你想做的事。
答案 1 :(得分:2)
您应该可以使用用例。当您在closeHandler中进行RPC调用时,它应该到达服务器,因为当它直接返回时,它已经开始发送数据,并设置回调以等待结果。但是,回调将失败,因为窗口关闭会导致连接丢失。但这不是问题,因为您只想通知服务器。所以问题可能是你发送了什么?当你在代码中的某个其他位置发送它而不是在closeHandler中时,它是否可以工作?
答案 2 :(得分:0)
古老的问题,但仍然-也许有人面临着同样的问题。
如前所述,RPC无法在结束处理程序中运行。这个解决方法对我有用:
在onClose方法中,执行以下操作:
Window.Location.replace(GWT.getModuleBaseURL() + "rpcCall?param1=" + param1 + "¶m2=" + 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 ....
}
}