EzServletのリダイレクト機能


今回は、EzServletのリダイレクト機能について説明いたします。
この機能を利用すればダウンロードを行う前に画面をリフレッシュしてからダウンロードを開始するような機能等が簡単に作成できます。用途は色々考えられますが...


今回は上記のダウンロードを例にとり、リダイレクト機能の説明したいと思います。
まずはおさらいから、EzServletを利用したダウンロード処理を行うコードは以下の通りです。

例:<input type="button" name="download">ボタンが押下された時に呼び出されるメソッド

/** 「ダウンロード」ボタン押下時に呼び出されるメソッドです */public public void download(EzRequest request, EzResponse response, MasterForm masterForm) {
 // ダウンロードするファイルを取得します
 File file = EzFile.getFile("C:/Xxx.pdf", true);
 // ダウンロードファイルをクライアント(ブラウザー)に信します。
 response.download(file);
}
注意:EzResponde#getOutputStream(ファイル名)を利用したダウンロードも可能です

たったこれだけですね(^^)
しかし上記コードでは、ダウンロードパネルが表示されるだけで画面は変更されません。
上記コードに1行追加するだけで、画面を再表示した後にダウンロードパネルが表示されます。

/** 「ダウンロード」ボタン押下時に呼び出されるメソッドです */
public void download(EzRequest request, EzResponse response, MasterForm masterForm) {
 // Master.html画面を再表示します。
 response.redirect(masterForm);
 // ダウンロードするファイルを取得します
 File file = EzFile.getFile("C:/Xxx.pdf", true);
 // ダウンロードファイルをクライアント(ブラウザー)に信します。
 response.download(file);
}
注意:EzResponde#getOutputStream(ファイル名)を利用したダウンロードも可能です

ダウンロードパルルを表示する前に再表示したい画面(HTML)に対応するFormオブジェクトを受け渡すだけでOKです。この1行で画面を再表示してからダウンロードパネルが表示されます。チョー簡単ですね。

ちなみに…ダウンロードファイルを作成するのに時間がかかるような機能の場合は以下のようにしたい場合もあるかと思います。
1.ダウンロードボタンが押下時に「ダウンロードファイル作成処理を開始しました」とメッセージを画面に表示
2.処理時間がかかるダウンロードファイルを作成
3.画面をリフレッシュし「ダウンロードファイル作成処理が完了しました」と画面に表示
4.ダウンロードパネルを表示

こんな時のコードは以下のようになります。

/** 「ダウンロード」ボタン押下時に呼び出されるメソッドです */
public void download(EzRequest request, EzResponse response, MasterForm masterForm) {
 // 処理開始メッセージを表示します。
 masterForm.message="ダウンロードファイル作成処理を開始しました";
1 response.redirect(masterForm);
 // 処理時間がかかるダウンロードファイル作成
2 File file = XxxService.createFile(...);
 // 処理完了メッセージを表示しダウンロードファイルをクライアントに送信します。
 masterForm.message="ダウンロードファイル作成処理が完了しました。";
3 response.download(file).redirect(masterForm);
}

たったこれだけです。redirectメソッドは何回利用しても問題ありません。
処理の流れは、まず1で処理が中断されクライアントに画面が表示されます。その後、クライアント(ブラウザー)はリダイレクトして再度「download」メソッドを呼び出します。downloadメソッドの1の処理はスルーされ、2でダウンロードファイルを作成します。
ファイル作成が完了すると3でクライアントに画面が表示されます。クライアント(ブラウザ)はリダイレクトしてファイルのダウンロード要求を行います。

上記方法以外でもFormオブジェクトやsessionを利用して処理を行う方法もありますね。

/** 「ダウンロード」ボタン押下時に呼び出されるメソッドです */
public void download(EzRequest request, EzResponse response, MasterForm masterForm) {
 // 処理開始メッセージを表示します。
 masterForm.message="ダウンロードファイル作成処理を開始しました";
 response.redirect(masterForm);
 // ダウンロードファイル作成済みかを判別します。
 if(masterForm.download == null) {
   // 時間がかかるダウンロードファイル作成
   masterForm.download = XxxService.createFile(...);
 }
 // 処理完了メッセージを表示しダウンロードファイルをクライアントに送信します。
 masterForm.message="ダウンロードファイル作成処理が完了しました。";
 response.redirect(masterForm);
 // ダウンロードファイルをクライアント(ブラウザー)に信します。
 response.download(masterForm.download);

この機能を利用すれば、色々な画面展開が実現できるようになるのではないでしょうか...(^^)