3

サーブレットを使用してデータを CSV としてダウンロードしようとしていますが、JSP は に含まれていflush=trueます。スタック トレースを以下に示します。レポートは期待どおりに保存されていますが、後ろに例外が表示されます。理由を教えてください。を閉じてOutputStream、バッファをフラッシュしようとしましたが、まだ運がありません。

1:36:38,304 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:619)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
    at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173)
    at atg.taglib.dspjsp.IncludeTag.flushOut(IncludeTag.java:873)
    at atg.taglib.dspjsp.IncludeTag.doEndTag(IncludeTag.java:773)

pResponse.setContentType(MS_EXCEL);
pResponse.setHeader(CONTENT,FILENAME);

outputStream = pResponse.getOutputStream();
pResponse.flushBuffer();
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
4

1 に答える 1

0

あなたが呼び出しpResponse.getOutputStream();ているのは違法です。ServletResponse.getOutpustStream()のいずれかを使用する必要がありますServletResponse.getWriter()。同じ応答で両方を使用することはできません。

JSPServletResponse.getWriter()がデフォルトで使用するため。ServletResponse.getWriter() 代わりにに書き込む必要がありますServletResponse.getOutpustStream()

これは Java Doc が言うことです:

getOutputStream...

ServletOutputStream getOutputStream() が IOException をスローする

レスポンスにバイナリ データを書き込むのに適した ServletOutputStream を返します。サーブレット コンテナはバイナリ データをエンコードしません。

ServletOutputStream で flush() を呼び出すと、応答がコミットされます。本文を書き込むために、このメソッドまたは getWriter() のいずれかを呼び出すことができますが、両方を呼び出すことはできません。

戻り値: バイナリ データを書き込むための ServletOutputStream 例外: IllegalStateException - このレスポンスで getWriter メソッドが呼び出された場合

于 2013-03-27T17:23:29.863 に答える