Java - HttpServlet:响应何时发送到客户端?

时间:2014-03-29 08:44:12

标签: java httpresponse

我很少尝试使用一些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

1 个答案:

答案 0 :(得分:5)

HttpServletResponse将由您的servlet容器(Tomcat,Jetty等)控制。

如果写入response,servlet容器会在定义的缓冲区大小后自动刷新response(例如9000字节后的Tomcat)。通常可以配置它(在Tomcat中使用参数socketBuffer)。 如果你不自己控制它,这就是它的工作方式。

在您的情况下,您可以控制自己的响应,并在致电response.flush()后,响应将发送给客户。 如果您写了更多的9000 Byte(在Tomcat中),响应将自动发送(在所有的中间)。

(原谅我的英语不好)