好吧,我已经做了几天了,遇到了一些问题。基本上,这个想法很简单。用户单击一个链接,然后向服务器发送一个生成PDF文档的请求。这本身不是下载的。它以附件的形式发送回浏览器。
问题很简单。如果生成PDF文档时出现问题,我不希望浏览器尝试下载该文件。现在,我现在的行动很简单。
if(req.getParameterMap().containsKey("report")) {
if(req.getParameter("report").equals("true"))
{
// If the query string parameter is set, generate the PDF.
if(!PdfReportGenerator.generateReport(res, repositoryURI)) {
// Something went wrong, so redirect the browser.
res.sendRedirect(req.getRequestURI());
}
}
}
目前,这样做的目的是将用户重定向回他们已经访问过的页面。简而言之,什么都没发生。现在这还可以,但我宁愿有一些不错的浏览器反馈。目前我能想到的一种方法是在URL的末尾添加"?error=pdf
或类似的内容,但用户可能还有其他需要查询字符串的功能。
我的问题是,在下载附件时,除了查询字符串之外,还有没有其他方法可以将发生错误的消息发送回浏览器。我愿意接受任何建议;我想Javascript
将成为这里的首选语言。
我有这个简单的解决方案。。。
if(req.getParameter("report").equals("true"))
{
req.getSession().setAttrinute("REPORT_OK",false);
//If the query string parameter is set, generate the PDF.
if(!PdfReportGenerator.generateReport(res, repositoryURI)) {
// Something went wrong, so redirect the browser.
res.sendRedirect(req.getRequestURI());
}else{
req.getSession().setAttrinute("REPORT_OK",true);
}
}
现在,在您的RequestURI页面中有一个document.ready()函数,用于使用ajax检查REPORT_OK
变量的状态。
情况1:如果值是null
,这意味着请求不是来自上面代码的回调,因此您不会向用户显示任何内容。
情况2:如果值是false
,那么这意味着发生了错误,您可以通知用户
情况3:如果值为true
,则pdf生成成功,您应相应地通知用户。
在使用ajax检查后,不要忘记从会话中删除该属性,这样当刷新页面或重新访问页面时,ajax将转到案例1。
更新
如何进行ajax调用:
$(document).ready(function() {
var divToChange = $('#message');//div id of the message you show to user
$.ajax({
type: 'POST',
url: 'checkReport.jsp',
data: {},
beforeSend:function(){
divToChange.html('Loading...');
},
success:function(data){
divToChange.html(data);
},
error:function(){
divToChange.html('Checking file failed!');
}
});
)};
现在在您的checkReport.jsp
:上
<%
Boolean status = (Boolean) session.getAttribute("REPORT_OK");
if(status==null){
//dont return anything
}else if(status){
out.print("Report is ok");
}else {
out.print("Report generation failed ");
}
%>