当前位置: 首页 > 面试题库 >

doGet方法完成后,Servlet是否返回响应?

赵俊晤
2023-03-14
问题内容

显然,该doGet方法的返回类型为void,因此,它不返回任何内容。从这个意义上讲,我使用“返回”一词来表示将响应发送回请求它的客户端。

我正在尝试实现一个长轮询的Servlet。最好在我有想要发回的东西之前不发送响应,这将是有益的。因此,在doGet方法中,将连接的用户的ID和AsyncContext添加到映射中:

private ConcurrentMap<String, AsyncContext> 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对象上调用complete方法:

asyncContext.complete();


 类似资料:
  • 我使用的是Apache Tomcat7.0 Servlet容器。我一直在研究JavaServer Faces中的请求处理。我可以在web.xml中看到以下配置块:

  • 问题内容: 我做了异步。现在我可以使用了。 这是示例代码: 所以这里的问题是回报承诺,因为我可以使用它吗? 编辑 当我等待时,它将按顺序运行;当我删除等待时,它将运行? 问题答案: 通常不与promises一起使用,因为很少有这种需求。如果在状态更新()之后调用的方法依赖于更新的状态(),则它可以通过其他方式(例如,作为参数)访问它。 使用回调并且不返回承诺。由于很少需要这样做,因此创建未使用的承

  • 文件: Authentication authenticate(Authentication Authentication)抛出AuthenticationException使用与AuthenticationManager相同的约定执行身份验证。参数:authentication-身份验证请求对象。返回:包含凭据的经过完全身份验证的对象。如果AuthenticationProvider无法支持传递

  • 问题内容: 我已经开发了一个将信息发送到的HTML页面。在中,我正在使用方法和: 在调用Servlet的html页面代码中是: method = “get”在Servlet中使用时,我会获得id和password的值,但是在使用时method = “post”,id和password会设置为null。为什么在这种情况下我无法获取值? 我想知道的另一件事是如何使用Servlet生成或验证的数据。例如

  • 问题内容: 我有一个这样的函数,它创建一个写流,然后将字符串数组写到文件中。写作完成后,我想使它返回Promise。但是我不知道该如何做。 感谢您的任何评论! 问题答案: 您将要使用构造函数: