ファイルダウンロード?

昨日までので新しいウィンドウを開くことはできたんだけど、そこにexcelとかpdfとかを表示したくなったので、いろいろ調べてこんな風にした。

  FacesContext context = FacesContext.getCurrentInstance();
  HttpServletResponse res = (HttpServletResponse)
      context.getExternalContext().getResponse();
  res.setContentType("application/pdf");
  try {
    OutputStream out = res.getOutputStream();
    writePdf(out);
    out.flush();
    out.close();
  } catch (IOException e) {
    // TODO 例外処理
    e.printStackTrace();
  }
  context.responseComplete();
  return null;

参考:http://forum.java.sun.com/thread.jspa?forumID=427&threadID=599946
↑のコードのまんまやな。これをActionのメソッドに記述すればOK。当然っちゃ当然だけど、teedaでもこのまま動くっぽい。

http://www.seasar.org/wiki/index.php?FAQ%2FS2JSF#eea82682
↑ここを見るとFacesContextはinjectionするといいみたい。確かにテストのことを考えるとMockに差し替えたりしやすいのでその方がよさそうだ。

でもs2jsf使ってるのにFacesContextを直接使うのはちょっとイヤだなぁ。中身わかってないから副作用がこわい。「responseCompleteなんて呼んじゃっていいの?」みたいな。この辺も隠蔽して「こんなに簡単にできますよー」ってしてくれると易しさにうっとりしそう(笑)。