簡體   English   中英

如何從 servlet 對 jsp 的 stream 文本響應?

[英]How to stream text response to jsp from servlet?

我有一個長時間運行的 servlet 進程,它是從 JSP 調用的。

我想在發生時將 servlet 進程的狀態發送給客戶端。

除了流媒體部分,我的一切都按照我想要的方式工作。

我正在使用 ajax 調用 servlet 並使用響應填充文本區域。 但是,響應在最后一次全部發送到客戶端,而不是逐步流式傳輸。

我希望客戶在發生時看到每個響應(flush()),而不是在通話結束時一次看到所有響應。

Ajax 調用:

postUploadFile = function() {
    $("#status").val("");
    YES.getAndShowStatus("status", "${home}/Upload");
}


YES.getAndShowStatus = function(listenerId, url, successFunction) {
    jQuery.get(url, 
        function(data) {
            val = jQuery("#" + listenerId).val();
            jQuery("#" + listenerId).val(val + data);
        }
    );
};

小服務程序代碼:

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        log.info("----------");
        log.info("Doing post");
        resp.setContentType("text/plain");
        OutputStream out = resp.getOutputStream();
        out.write("FOOBAR 1\n".getBytes());
        out.flush();
        out.write("FOOBAR 2\n".getBytes());
        out.flush();
        out.write("FOOBAR 3\n".getBytes());
        out.flush();
        log.info("Done.");
    }

我最終得到了這個,但沒有看到它發生的進展。 我需要做什么才能看到進度?

在此處輸入圖像描述

這個問題中發布的原始代碼存在一個大問題和一些小問題。 最大的問題是這一行: resp.setContentType("text/plain"); . 將此行更改為resp.setContentType("application/text"); 修復了服務器端的流式傳輸問題。 對客戶端代碼進行了更實質性的更改。 下面的代碼有效,是一個完整的工作解決方案,用於將多部分表單發布到服務器並在它發生時從服務器獲取流響應(幾個值是硬編碼的,需要清理,但它可以完成工作)。

服務器代碼:

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    log.info("----------");
    log.info("Doing post");
    resp.setContentType("application/text");
    OutputStream out = resp.getOutputStream();
    out.write("Writing file to server".getBytes());
    out.flush();
    writeZipFileToDisc(req, resp);
    out.write("\n\nDone.\n".getBytes());
    out.flush();
    log.info("Done.");
}

客戶代碼:

postUploadFile = function() {
    $("#status").val("");
    YES.getAndShowStatus("status", "${home}/Upload");
}

YES.getAndShowStatus = function(listenerId, url, successFunction) {
    // based on https://gist.github.com/sohelrana820/63f029d3aa12936afbc50eb785c496c0
    var form = $("#uploadForm")[0];
    var data = new FormData(form);
    $.ajax({
        type: "POST",
        enctype: 'multipart/form-data',
        url: url,
        data: data,
        processData: false,
        contentType: false,
        cache: false,
        xhrFields: {
            // Getting on progress streaming response
            onprogress: function(e)
            {
                var progressResponse;
                var response = e.currentTarget.response;
                val = jQuery("#" + listenerId).val();
                jQuery("#" + listenerId).val(response);

            }
        }
    });

};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM