ハマったので備忘録としてメモ。
画面でボタンをクリックするとファイルのダウンロードを行う処理。
ファイルが無い場合は画面遷移を行わずに画面へエラーメッセージまたはダイアログで通知したい。
サーバはJavaを使用。FWは使用しない。(SAStrutsなら簡単そう?)
ダイアログを出すならAjaxかなと思いjQueryを使用。
Servletの非同期呼び出しは下記のように$.postで呼び出し、パラメータとコールバックメソッドを指定する
function download(parameter) {
query = {
parameter : parameter,
}
$.post("/DownloadServlet", query, read);
}
function read(resp) {
// コールバック関数でなんか処理
}
ただ、Ajaxだとレスポンスをjavascriptが解釈してしまい、ブラウザのダイアログによるファイルダウンロードを行うことができない。
そのため、最初の非同期呼び出しでチェック処理だけ行い、ファイルが無ければコールバック関数でダイアログを表示、ファイルがあれば別のファイルダウンロード用サーブレットを呼び出すことで対応した。
function download(parameter) {
query = {
parameter : parameter,
}
$.post("/DownloadFileCheckServlet", query, read);
}
function read(resp) {
// コールバック関数でなんか処理
if (resp.length == 0) {
// レスポンスに何も入力されて無ければファイル有り(とする)サーブレットをGetメソッドで呼び出し
location.href = "/DownloadServlet";
} else {
// レスポンスに入力されていればエラーメッセージとしてダイアログに出力(とする)
alert(resp);
}
}
これでチェック処理でエラーが発生した時はレスポンスにエラーメッセージを書き込めばダイアログが表示され、レスポンスに何も書き込まれなかった(エラーでない)場合はファイルダウンロード用サーブレットが呼ばれてブラウザによるダウンロードが開始される。
チェック処理とファイルダウンロード処理で別サーブレットになるので、セッションで値を共有しました。
ここは一時フォームを作成してPostメソッドでsubmitしても良いかもしれません。
下記のサイトを参考にさせて頂きました。ありがとうございます。
http://chez-sugi.net/journal-20070306