0

基本的に、私は大きな* .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アプリケーションに本当に慣れていないので、どんな助けでも大歓迎です。私はこれを探し回っていましたが、行き詰まっていて、この卒業プロジェクトの短いカレンダーがあります。

前もって感謝します。

4

1 に答える 1

0

getReportサーブレット内でメソッドを記述または呼び出すこともできます。window.openクライアントからは、PDFをダウンロードするためにメソッドを使用してそのサーブレットを直接呼び出す必要があります。

サーバー側のセッション変数にバイトを設定する初期RPCを呼び出す必要があります。

HttpServletRequest request = this.getThreadLocalRequest();      
HttpSession session = request.getSession(); 
session.setAttribute("PdfFileInByte", getReport())

次に、各pdfダウンロード呼び出しで、セッションからそのファイルを読み取り、pdfファイルをダウンロードする必要があります。

PdfWriter.getInstance(document, session.getAttribute("PdfFileInByte"));

次に、それを使用しない場合は、セッション属性から削除します。

于 2013-03-15T14:04:08.250 に答える