Strutsでのファイルダウンロードの方法
Webアプリケーションは,時にHTMLではない処理結果をWebブラウザに返却する。返却するものがHTMLの場合は,JSPや何らかのテンプレートエンジンを使用するが,バイナリデータをWebブラウザに返却する場合は,HttpServletResponseオブジェクトから出力ストリームを取得し,情報を送信する。
一般的なWebアプリケーションであれば,以下の手法のどちらかを採用するだろう。
- サーブレットクラスの中に,情報を送信する処理を記述する。* JSPの中に,情報を送信する処理を記述する。
サーブレットクラスの場合には,doGet()やdoPost()にresponseオブジェクトが渡されるので,それを使えばよい。また,JSPの場合は,responseオブジェクトが暗黙オブジェクトとして提供されるので,それを使えばよい。
さて,Strutsを使用していた場合は,もう一つ選択肢を持つことができる。
- Actionクラスの中に,情報を送信する処理を記述する。
Actionクラスのexecuteメソッドにresponseオブジェクトが渡されるので,それを使って情報を送信する処理を記述する。これによってHTTPレスポンスの送信が完結するので,そのことをStrutsに知らせるために,executeメソッドの結果としてnullを返却する。
こんな感じ。
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
…
response.setContentType(“application/octet-stream”);
response.setHeader(
”Content-Disposition”, “attachment; filename=” + fileName);
OutputStream os = response.getOutputStream();
// 送信処理
os.flush();
os.close();
return null;
}
このActionクラスを使用するアクションの定義では,forward要素は必要ない。executeメソッドの結果がnullだったときは,Strutsはフォワードも何もしないようになっている。これについては,ActionクラスのAPIリファレンスに書かれている。
「ActionクラスでView的な仕事しちゃっていいの?」とちょっと思うのだが,Strutsでの想定範囲内の処理なので,いいことにしよう。