我几乎没有尝试过一些 HttpServlet 的东西来更好地理解它。我想构建一个请求传入的场景,我需要尽快相应地发送响应,然后在 servlet 中做更多的工作。根据我目前的理解,只有在返回 doGet 或 doPost 方法时,才应将响应发送给客户端。但是从我的示例来看,响应已经在 servlet 中的命令处理过程中发送回客户端。所以它已经在我没想到的时候返回了。
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
Logger.getLogger(DisplayHeader.class.getName()).log(Level.SEVERE, null, ex);
}
response.setContentType("text/plain; charset=ISO-8859-1");
response.setStatus(HttpServletResponse.SC_FORBIDDEN);
final StringWriter sw = new StringWriter();
PrintWriter out = new PrintWriter(sw);
//TODO most be implemented SynchronizedStatusCodeDimo
out.println("StatusCode=0");
out.println("StatusText=Accepted");
out.println("paymentType=PaymentXY");
out = response.getWriter();
out.print(sw.toString());
out.flush();
out.close();
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(DisplayHeader.class.getName()).log(Level.SEVERE, null, ex);
} }
这里发生了什么,通过 Firebug 我看到我已经收到了 510 毫秒后生成的响应。由于 sleep ,我认为我需要超过 1500 毫秒。我的理解是基于这篇文章:Link
最佳答案
HttpServletResponse
将由您的 servlet 容器(Tomcat、Jetty 等)控制。
如果您写入 response
,servlet 容器会在定义的缓冲区大小后自动刷新 response
(例如 Tomcat 在 9000 字节后)。通常您可以配置它(在 Tomcat 中使用参数 socketBuffer
)。
如果您不自己控制它,这就是它的工作方式。
在您的情况下,您可以自己控制响应,在您调用 response.flush()
后,响应将发送到客户端。
如果你写了更多的 9000 字节(在 Tomcat 中),响应将自动发送(在它的中间)。
(请原谅我的英语不好)
关于Java-HttpServlet : When is the response sent to the client?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22728916/