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

このエントリーをはてなブックマークに追加

関連記事

2023年のRemap

Remapにファームウェアビルド機能を追加しました

Google I/O 2023でのウェブ関連のトピック

2022年を振り返って

現在のRemapと今後のRemapについて