基本的に、私は大きな* .pdfレポートを生成しなければならないWebアプリケーションを持っています。これはGoogleAppEngineでホストされており、GoogleWebToolkitを使用してデプロイしています。クライアントはサーバー上でgetReport()メソッドを呼び出します。このメソッドは、必要なデータを読み取り、レポートを生成します。Google App Engineでファイルを書き込めないため、サーバーメソッドの戻り応答として、ファイルをメモリに書き込み、そのバイトを取得します。
ドキュメントが大きなファイルになる可能性がある場合は、アプリケーションの初期の時点でサーバーからレポートバイトを取得します。クライアントから要求された場合は、それらのバイトを* .pdfファイルに変換し、次のように使用できるようにする必要があります。ダウンロード。そのためには、別のサーブレットが必要です。
私のリモートメソッドは次のように実装されています。
@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;
}
}
テスト目的で、次のように* .pdfファイルを生成するためだけにGETを使用してサーブレットを実装しました。
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()条件からクライアントをサーブレットにリダイレクトし、バイト配列の結果をパラメーターとして送信し、ブラウザーでファイルのダウンロードとしてレポートを取得することです。doGet()をdoPost()に置き換え、バイト配列パラメーターを取得し、それを使用してファイルを作成する必要がありますが、ここでは少し迷っています。
私はWebアプリケーションに本当に慣れていないので、どんな助けでも大歓迎です。私はこれを探し回っていましたが、行き詰まっていて、この卒業プロジェクトの短いカレンダーがあります。
前もって感謝します。