ページクラスに
javax.servlet.http.HttpServletResponse
型および
javax.faces.context.FacesContext
型のプロパティを用意します.
ライフサイクルメソッドの中で
HttpServletResponse
の
getOutputStream()
または
getWriter()
メソッドを呼び出して出力ストリームを取得し, コンテンツを出力します. その後,
FacesContext
の
responseComplete()
メソッドを呼び出します.
二重サブミットを防止するボタン (
id
属性が
doOnce
で始まるボタン) と,
CSVやPDFをダウンロードするボタンが同じフォームにあると,
ダウンロードボタンを押した後に画面が書き換わらないため,
二重サブミット防止ボタンを押すと必ず二重サブミットと判定されてしまいます.
これを防ぐには, ダウンロードを行うための非表示のフォームを別途用意し, ダウンロードボタンでそのフォームをサブミットします.
ダウンロード用のフォームは非表示とし,
id
属性が
form
または
Form
で終了するようにします. このフォームに
type
属性が
submit
で,
id
属性が
do
で始まる
<input>
要素 (本当のダウンロードボタン) と,
type
属性が
hidden
で
name
属性が
newwindow
,
value
属性が
true
の
<input>
要素を含めます.
本来の (表示される) フォームには
id
属性を持たないか値が
do/go/jump
で始まらない,
tyep
属性が
button
で,
onclick
属性でスクリプトの関数を呼び出すボタン (表示上のダウンロードボタン) を含めます.
スクリプトの関数は,本来のフォームからダウンロード用のフォームに必要な
<input>
要素をコピーし, ダウンロードボタンをクリックして,
ダウンロード用のフォームをサブミットします.