基本上,我有一个必须生成大型 * .pdf报告的 Web 应用程序。它托管在 Google App Engine 上,我正在使用 Google Web Toolkit 来部署它。客户端调用服务器上的getReport()方法,读取所需的数据并生成报告。由于我无法在 Google App Engine 上写入文件,因此我将其写入内存并获取其字节,作为服务器方法的返回响应。
一旦文档可能导致大文件,我会在我的应用程序的较早时间从服务器获取报告字节,并且当客户端请求时,我需要将这些字节转换为 * .pdf文件并使其可用作下载。所以我需要另一个 servlet 来做到这一点。
我的远程方法实现如下。
@Override
public byte[] getReport(String arg0, String arg1) {
try {
Document document = new Document();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
document.open();
/* Report generation */
document.close();
return baos.toByteArray();
} catch (DocumentException e) {
/* Exception handling */
return null;
}
}
我使用 GET 实现了一个 servlet,只是为了生成一个 * .pdf文件,如下所示,仅用于测试目的。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=report.pdf");
try {
Document document = new Document();
PdfWriter.getInstance(document, response.getOutputStream());
document.open();
/* Test report generation */
document.close();
} catch (DocumentException e) {
/* Exception handling */
}
}
我已将它们分别配置为 /project/retrieve_report 和 /project/get_report,它们在浏览器中工作。当我执行该方法时,我有来自远程服务器的字节可用。
AsyncCallback<byte[]> callback = new AsyncCallback<byte[]>(){
@Override
public void onFailure(Throwable caught) {
}
@Override
public void onSuccess(byte[] result) {
}};
reportService.getReport(arg0, arg1, callback);
所以我现在真正需要并且找不到任何可靠的帮助是将客户端从onSucess()条件重定向到 servlet,将字节数组结果作为参数发送,将报告作为文件下载在浏览器中获取。我必须用doPost()替换doGet( ) ,检索字节数组参数并使用它来构建文件,但我有点迷失在这里。
我对网络应用程序真的很陌生,所以任何帮助都将不胜感激。我一直在寻找这个,但我被困住了,我有一个关于这个毕业项目的简短日历。
提前致谢。