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

fry*_*yk9 3 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);
        } }
Run Code Online (Sandbox Code Playgroud)

通过Firebug,这里发生了什么,我看到我已经收到510毫秒后生成的响应。我以为我会因为睡眠而需要1500毫秒以上的时间。我的理解是基于此信息:链接

drk*_*bar 5

HttpServletResponse会由servlet容器(Tomcat的,码头等)进行控制。

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

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

(对不起,我的英语不好)