我很少尝试使用一些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我看到我已经收到了510ms后生成的响应。因为睡觉,我以为我需要超过1500毫秒。我的理解基于这篇文章:Link
答案 0 :(得分:5)
HttpServletResponse
将由您的servlet容器(Tomcat,Jetty等)控制。
如果写入response
,servlet容器会在定义的缓冲区大小后自动刷新response
(例如9000字节后的Tomcat)。通常可以配置它(在Tomcat中使用参数socketBuffer
)。
如果你不自己控制它,这就是它的工作方式。
在您的情况下,您可以控制自己的响应,并在致电response.flush()
后,响应将发送给客户。
如果您写了更多的9000 Byte(在Tomcat中),响应将自动发送(在所有的中间)。
(原谅我的英语不好)