在doGet方法完成后,Servlet是否会返回响应?
显然, doGet
方法的返回类型为void,因此,它不会返回任何内容。 从这个意义上讲,我使用“return”这个词来表示将响应发送回请求它的客户端。
我正在尝试实现一个长轮询Servlet。 如果我有想要寄回的东西,就不要发送回复是有益的。 因此,在doGet方法中,我将连接用户的ID和AsyncContext添加到地图中:
private ConcurrentMap contexts = new ConcurrentHashMap(); //...in the doGet method when I need to add the context... contexts.put(userId, context);
然后,当我有东西要发回时,我可以检索适当的上下文并写入它的响应输出流:
AsyncContext context = contexts.get(userId); PrintWriter writer = context.getResponse().getWriter(); writer.write("something to send to the client");
但是,客户似乎永远不会收到回应。 查看浏览器开发者控制台中的“网络”选项卡,我可以看到发送的GET请求然后返回(状态为200)。 这发生在我实际发送回来之前。 这让我相信在doGet方法完成后会返回响应。 也许正因为如此,在此之后,没有任何东西可以发送到客户端,因为没有打开连接。
一旦方法执行完毕,doGet方法是否将响应发送到客户端? 如果是这种情况,如何保持连接打开以获得长轮询效果?
回答我自己的问题: Does the doGet method send the response to the client once the method is finished executing?
是的,当doGet(或任何HttpServlet方法,例如:doGet,doPost等)方法完成执行时,它会将响应发送回客户端。
If this is the case, how can I keep the connection open for a long-polling effect?
使用异步Servlet(我正在使用它,但是,我发现我的特定问题必须在其他地方,但这些答案仍然与所提出的问题相关)。 在ServletRequest对象上调用startAsync方法,如下所示:
AsyncContext context = request.startAsync(request, response);
“这将通知Web容器,在请求调用结束时,它应释放处理线程并保持连接打开,以便其他线程写入响应并结束连接。” 参考链接。
另外,我将为我的特定问题添加解决方案(客户端没有收到响应)是因为在我的Servlet中,我没有在AsyncContext对象上调用完整方法:
asyncContext.complete();
是的,当doGet()完成执行时,响应流被刷新并关闭。
保持UI线程长时间占用违反了Java Enterprise的最佳实践。
如果没有任何响应,建议您立即返回,并在客户端(浏览器)端实现计时器,以便经常轮询服务器以获得结果。