4

クライアントとサーバー間の通信があります。プロセスは簡単です:

  1. ファイルシステムでPDFを生成するコントローラーにAJAXPOSTリクエストを送信しています
  2. 上記のリクエストが成功すると、フォームのGETリクエストが行われ、PDFが返され、標準のブラウザの[保存または開く]ダイアログボックスが開きます。

2段階のプロセスを使用している理由は、PDFの生成中にプログレスバーが必要になるためです。

2番目のリクエストがAJAXリクエストの一部ではなくフォーム送信である理由は、標準のブラウザの[保存または開く]ダイアログボックスが表示されないためです。

このアプローチの問題は、IE7とIE8が迷惑な通知バーをポップアップして、コンテンツをダウンロードするのは危険であり、それを望まないことをユーザーに通知することです。

それで:

  1. プログレスバーが必要です。
  2. AJAXリクエストのみを行う場合は、[保存または開く]ダイアログボックスをポップアップする方法が必要です。
  3. フォームのGET送信に行く場合、サーバーとクライアント間の共有フラグのように、進行状況バーを停止するためにファイルがいつ生成されたかを知る方法が必要です。

助けていただければ幸いです。

4

1 に答える 1

3

考えられる(少しアンチパターンの)回避策の1つはこれですが、おそらく素晴らしい設計ではありません

しかし、私はこれを以前に見たことがあります(そして、私がこれを行ったことを認めます)。

  • ユーザーは、PDF を生成するサーブレットに移動するリンクをクリックし、準備が整うまで待機します (タイムアウト設定を適用する必要があります)... (Content-Disposition ヘッダーなど...) 通常のダウンロードと同じように

  • サーブレットは、PDF の生成中に共有セッション変数の進行状況を報告します。

  • サーバーへのAJAX呼び出しは、セッション変数から進行状況を読み取り、ユーザーに表示します

  • PDF の作成が完了すると、ブラウザーはそれをダウンロードするだけです (おそらくタイムアウトのリスクを要求します)。

ここでの主な問題は、リクエストスレッドをワーカースレッドとして使用してブロックすることです。これにより、この回答にいくつかの反対票が投じられる可能性があります...

私は Message Driven Beans にあまり詳しくありませんが、これは別の、おそらくより良い解決策です。

于 2012-05-10T14:51:05.090 に答える