2

Java ServletsでExcelファイルを生成するためにApache POIを使用しています。

getExcel()関数はHSSFWorkbook、クライアントに送信したい を返します。

HSSFWorkbook wb = getExcel();

これは私がこれまでに試したことです。

//block1
ByteArrayOutputStream outByteStream = new ByteArrayOutputStream();
wb.write(outByteStream);
byte [] outArray = outByteStream.toByteArray();
response.setContentType("application/ms-excel");
response.setContentLength(outArray.length);
response.setHeader("Expires:", "0");
response.setHeader("Content-Disposition", "attachment; filename=Demo1.xls");
OutputStream outStream = response.getOutputStream();
outStream.write(outArray);
outStream.flush();

//block2
request.setAttribute("Message", str1);
request.setAttribute("MessageDetails", str2);
request.getRequestDispatcher("/MyFile.jsp").forward(request, response);

上記のコードはExcelファイルをクライアントに送信しますが、例外が発生します:

java.lang.IllegalStateException: Cannot forward after response has been committed

block1上記のコードからorを削除してもエラーは発生しませんが、オブジェクトに追加したクライアントと 2 つの属性をblock2送信したいと考えています。Excel filerequest

Excelを使用してクライアントにファイルを送信できますrequest.getRequestDispatcherか?または、これを行うためのより良い方法はありますか?

任意の提案をいただければ幸いです。

Edit1
を取得している理由はわかっていますIllegalStateExceptionが、私の質問は、クライアントExcelFileRequest Attributes両方を送信する方法です。

Edit2と の両方をクライアント
に送信したい理由は、から送信されたメッセージを表示する があるためです。Excel fileAttributesMyFile.jsp<div>servlet

<div style="background-color: aliceblue">
    <h3>${Message}</h3>
</div>

Edit3
クライアントにメッセージを送信する理由は、クライアントがデータベースにデータを挿入するために提供するExcel file応答としてこれを送信し、重複またはその他の理由で挿入できないものを強調表示しているためです。したがって、クライアントにインポート統計を表示し、エラー行が強調表示された Excel ファイルのコピーを彼に渡したいと思います。Import Excel operationexcel fileexcel rowsMessage

4

1 に答える 1

2

あなたはあなたをフラッシュしてresponseからしようとしていforwardます。コンテナはすでにresponseクライアントに返送しており、別の JSP へのリクエストの方法についてジレンマに陥っているためforward、例外をスローして途中で操作を中止します。HTTP は要求応答モデルです。要求すると、応答が返されます。しかし、応答がコミットされると、トランザクション全体が終了します。

outStream.write(outArray); 
// you already committed the response here by flushing the output stream
outStream.flush(); 

//block2
request.setAttribute("Message", str1);
request.setAttribute("MessageDetails", str2);
// this is illegal after you have already flushed the response
request.getRequestDispatcher("/MyFile.jsp").forward(request, response);

Javadocに従って:

IllegalStateException - 応答がすでにコミットされている場合。

EDIT1 の後:

いいえ、両方はできません。あなたが望むものを決める必要があります。適切な HEADERS と MIME-TYPE を設定する応答にバイトを書き込みます。ブラウザーに何かをダウンロードさせることはできず、同じ応答から JSP ページを表示することもできません。

于 2013-07-05T14:48:40.250 に答える