使用Javascript从Window.open中的控制器捕获异常
我有一个控制器,用于刷新字节,inturn将在客户端生成PDF。但是,如果发生异常,我希望捕获该异常并向用户显示一些适当的消息 我尝试了Ajax,但Ajax只使用JSON、字符串或XML作为消息交换格式。我怎样处理这种情况 我必须在成功的情况下生成pdf或捕获异常。这是我的控制器和javascript代码使用Javascript从Window.open中的控制器捕获异常,javascript,java,ajax,Javascript,Java,Ajax,我有一个控制器,用于刷新字节,inturn将在客户端生成PDF。但是,如果发生异常,我希望捕获该异常并向用户显示一些适当的消息 我尝试了Ajax,但Ajax只使用JSON、字符串或XML作为消息交换格式。我怎样处理这种情况 我必须在成功的情况下生成pdf或捕获异常。这是我的控制器和javascript代码 try { MyUtil.generatePdf(response, documentBytes, "DU"); // --> This method will flush th
try {
MyUtil.generatePdf(response, documentBytes, "DU"); // --> This method will flush the bytes
} catch (Exception e) {
result.setStatus("EXCEPTION OCCURED.");
}
return result;
生成pdf方法
Javascript代码
我不认为您可以使用
window.open()
来实现这一点
我的建议是使用ServletAPI,下载PDF,或者在出现错误时向用户显示错误页面
我有一些测试代码,用于编写PDF或向用户发送带有错误消息的错误页面的场景
线索是捕捉到异常,在这种情况下,将使用不同的编码向用户发送错误消息
servlet代码
这很有效。要么下载PDF文件,要么出现错误页面。您最终需要处理错误页面以使其看起来漂亮,但默认的错误页面是一个开始
有时您会看到PDF,如果出现错误,则会显示默认错误页面:
我认为您无法使用
window.open()
实现这一点
我的建议是使用ServletAPI,下载PDF,或者在出现错误时向用户显示错误页面
我有一些测试代码,用于编写PDF或向用户发送带有错误消息的错误页面的场景
线索是捕捉到异常,在这种情况下,将使用不同的编码向用户发送错误消息
servlet代码
这很有效。要么下载PDF文件,要么出现错误页面。您最终需要处理错误页面以使其看起来漂亮,但默认的错误页面是一个开始
有时您会看到PDF,如果出现错误,则会显示默认错误页面:
在您的情况下,最好将pdf响应作为arraybuffer(角度方向)获取,并将其存储为blob,然后下载。您可以通过向服务器发送请求来完成此操作。并在角度代码中添加一个错误块 服务器端代码
List<PhysicalCountEntityTo> salaryList = exportNonDashBoardReportManager.fetchSalaryDetails(payloadBean);
HashMap<String, Object> parametersPDF = new HashMap<String, Object>();
JasperPrint jasperPrint = null;
JRBeanCollectionDataSource beanCollectionDataSource = null;
beanCollectionDataSource = new JRBeanCollectionDataSource(salaryList);
String reportPath = httpServletRequest.getServletContext().getRealPath("//WEB-INF//JasperReports//Salary.jasper");
jasperPrint = JasperFillManager.fillReport(reportPath, parametersPDF, beanCollectionDataSource);
httpServletResponse.addHeader("Content-disposition","attachment; filename=Salary.pdf");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
}
重要信息-在请求头中,将响应类型作为“json”添加到“arraybuffer”,否则它将无法工作
fetchPDF(url: string,data): Observable<any> {
this.getCredentials();
const authHeaders = this.createBasicAuthorizationHeader(this.credentials);
return this.http.post(this.getApiUrl(url),data,{headers: authHeaders,'responseType' : 'arraybuffer' as 'json'})
}
fetchPDF(url:string,data):可观察{
这是.getCredentials();
const authHeaders=this.createBasicAuthorizationHeader(this.credentials);
返回this.http.post(this.getApiUrl(url),数据,{headers:authHeaders,'responseType':'arraybuffer'作为'json'})
}
它适用于IE、Mozilla和Crome 在您的情况下,最好将pdf响应作为arraybuffer在angular侧获取,并将其存储为blob,然后下载。您可以通过向服务器发送请求来完成此操作。并在角度代码中添加一个错误块 服务器端代码
List<PhysicalCountEntityTo> salaryList = exportNonDashBoardReportManager.fetchSalaryDetails(payloadBean);
HashMap<String, Object> parametersPDF = new HashMap<String, Object>();
JasperPrint jasperPrint = null;
JRBeanCollectionDataSource beanCollectionDataSource = null;
beanCollectionDataSource = new JRBeanCollectionDataSource(salaryList);
String reportPath = httpServletRequest.getServletContext().getRealPath("//WEB-INF//JasperReports//Salary.jasper");
jasperPrint = JasperFillManager.fillReport(reportPath, parametersPDF, beanCollectionDataSource);
httpServletResponse.addHeader("Content-disposition","attachment; filename=Salary.pdf");
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
}
重要信息-在请求头中,将响应类型作为“json”添加到“arraybuffer”,否则它将无法工作
fetchPDF(url: string,data): Observable<any> {
this.getCredentials();
const authHeaders = this.createBasicAuthorizationHeader(this.credentials);
return this.http.post(this.getApiUrl(url),data,{headers: authHeaders,'responseType' : 'arraybuffer' as 'json'})
}
fetchPDF(url:string,data):可观察{
这是.getCredentials();
const authHeaders=this.createBasicAuthorizationHeader(this.credentials);
返回this.http.post(this.getApiUrl(url),数据,{headers:authHeaders,'responseType':'arraybuffer'作为'json'})
}
它适用于IE、Mozilla和Crome @情况并非如此,我想捕获异常并自定义消息并在某个模式窗口中显示。@情况并非如此,我想捕获异常并自定义消息并在某个模式窗口中显示。
exportPDF(event){
this.showPageSpinner=true;
this.httpRestClient.fetchPDF("download_salary_report", this.payloadBean).subscribe(
response => {
var blob = new Blob([response], {type: 'application/pdf'});
var ua = window.navigator.userAgent;
var msie = ua.indexOf('MSIE');
var trident = ua.indexOf('Trident/');
var edge = ua.indexOf('Edge/');
if(msie > 0 || trident > 0 || edge > 0){
window.navigator.msSaveOrOpenBlob(blob,'Salary.pdf');
}
else if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1){
var link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = "Salary.pdf";
document.body.appendChild(link);
link.click();
window.setTimeout(function() {
URL.revokeObjectURL(link.href);
document.body.removeChild(link);
}, 0);
}
else{
var link=document.createElement('a');
link.href=window.URL.createObjectURL(blob);
link.download="Salary.pdf";
link.click();
}
this.showPageSpinner=false;
},
error=>{
// show your message here
});
fetchPDF(url: string,data): Observable<any> {
this.getCredentials();
const authHeaders = this.createBasicAuthorizationHeader(this.credentials);
return this.http.post(this.getApiUrl(url),data,{headers: authHeaders,'responseType' : 'arraybuffer' as 'json'})
}