Wicket:ストリームダウンロード処理

色々試したけど、こんな感じで落ち着きました。


■SubmitLink実装

SubmitLink submit = new SubmitLink("outputButton", form){
    @Override
    public void onSubmit(){
        // RequestTarget設定(インナークラス"CSVResourceStreamWriter.write"に処理を委譲)
        IRequestTarget target = 
                new ResourceStreamRequestTarget( new CSVResourceStreamWriter(), "AccessReport.csv");
        getRequestCycle().setRequestTarget(target);
    }
};

■インナークラス(AbstractResourceStreamWriter実装)

class CSVResourceStreamWriter extends AbstractResourceStreamWriter{
    /**
     * OutputStreamによるCSV出力処理を実装する。
     *
     * @param out
     */
    @Override
    public void write(OutputStream out ) {
        try{
			// outputStreamへの書き出しサンプル
            String tmp = new String("CSVダウンロードテスト");
            byte[] byteArray = tmp.getBytes("UTF-8");
            out.write(byteArray);
        }
        finally{
            try{
                out.flush();
                out.close();
            }
            catch( IOException iex ){
                iex.printStackTrace();
            }
        }
    }

    /**
     * Content-Type要素を定義する。
     *
     * @return
     */
    @Override
    public String getContentType() {
        // Conent-Type設定
        return "application/octet-stream;charset=UTF-8";
    }
}

AbstractResourceStreamWriter.write(OutputStream)メソッドの実装部分で、DBからのデータ取得などをやってやれば良いかと。

wicketって色んなコンポーネント持ってるなぁ。しみじみ。