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での想定範囲内の処理なので,いいことにしよう。

Trackback URL:



Get Adobe Flash playerPlugin by wpburn.com wordpress themes