Ответ 1
Для этого ответа я буду считать "простым" JSP/Servlet/HTML/JS, поскольку я не использую Struts. Для продвинутого пользователя Struts (и jQuery), однако, он должен быть достаточно тривиальным, чтобы перенести его в Struts (и jQuery).
К моменту, вы можете настроить cookie на ответ запроса на загрузку и запросить JavaScript для опроса для этого файла cookie. После того, как загрузка будет готова для обслуживания, cookie будет доступен в JavaScript. Чтобы обеспечить работу с различными окнами/вкладками браузера в одном сеансе, лучше всего создать уникальный токен загрузки и передать его в качестве параметра запроса, чтобы сторона сервера могла установить его как значение cookie. Не забудьте выпустить cookie впоследствии, чтобы предотвратить загрязнение печенья.
В принципе (вы можете заменить <span>
на <img>
, указывая на некоторый spinner gif):
<input type="button" value="Download" onclick="download()" />
<span id="wait" style="display:none">Please wait while we prepare the download...</span>
С помощью этого JavaScript (при использовании jQuery возможно jquery-cookie):
function download() {
var token = new Date().getTime();
var wait = document.getElementById("wait");
wait.style.display = "block";
var pollDownload = setInterval(function() {
if (document.cookie.indexOf("download=" + token) > -1) {
document.cookie = "download=" + token + "; expires=" + new Date(0).toGMTString() + "; path=/";
wait.style.display = "none";
clearInterval(pollDownload);
}
}, 500);
window.location = "download?token=" + token;
}
И в сервлет (или действие Struts, если применимо):
// Prepare download here.
// ...
// Once finished, set cookie and stream download to response.
Cookie cookie = new Cookie("download", request.getParameter("token"));
cookie.setPath("/");
response.addCookie(cookie);
// ...