JSFのアクションで独自の出力を行うには
JavaServer Faces でCSV,PDFなどをダウンロードするためのアクションは、こんな風にするとよい。
@In private FacesContext facesContext; public String someAction() { String encoding = "Windows-31J"; String filename = getFilename(); // ファイル名を取得する。 ExternalContext externalContext = facesContext.getExternalContext(); HttpServletResponse response = (HttpServletResponse) externalContext.getResponse(); response.setContentType("application/octet-stream; charset=" + encoding); response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); response.setCharacterEncoding(encoding); PrintWriter writer = response.getWriter(); writeCsvData(writer); // writerに出力する。 facesContext.responseComplete(); return null; }
ポイントはFacesContext.responseComplete()で、これを呼んでおくとRenderResponseフェーズがスキップされる。
JBoss Seam 1.2.0.PATCH1
うーむ。リリースエンジニアリングが甘い。不安だ。
JBoss Seam と Spring
Seam 1.2の目玉は何といってもSpringとSeamのインテグレーションということになる。
Springで書きためてきたコードがそのままSeamに使えるとなれば、スムーズな移行が期待できる。
といっても、そううまくはいかないのが世の常ではあるけれど。
しばらくは、Gavin Kingの宣伝文句を信じて、ついて行ってみよう。
http://blog.hibernate.org/cgi-bin/blosxom.cgi/2007/02/27#thoughtsononedottwo