私がここでやっていることは以下の通りです。
actionListener をアタッチした commandButton が画面に表示されます。ボタンをクリックすると、リスナーが呼び出されたアクションが実行され、次の行が実行されます
PortletResponse portletResponse = (PortletResponse)externalContext.getResponse(); HttpServletResponse httpResponse = PortalUtil.getHttpServletResponse(portletResponse);
generateReport(httpResponse.getOutputStream());
一部のビジネス ロジックが次の行を実行した後の generateReport。
context.put(...); ... ... ...
BufferedWriter writer = writer = new BufferedWriter( new OutputStreamWriter(fos));// fos は出力ストリームです
if (t != null){// t は Velocity テンプレート
t.merge(context, writer);//context is VelocityContext
}
ライター.フラッシュ(); ライター.close();
generateReport メソッドの後に他の呼び出しはありません。generateReport が返された後にリクエストが終了し、ダイアログ ボックスが表示されるはずですが、そうではありません。
アイデアが得られることを願っています。
編集: ご回答ありがとうございます オラフ
1)まず第一に、ポートレットにはボタンやアクションリスナーの概念がないことをよく知っています。間違いなく、私は Icefaces という名前のフレームワークまたはそれが何であれ、それを使用しています。
2)最初は、ポートレットがマークアップのみを表示し、他に何も表示しないという事実を知らないため、ドキュメントを生成するのは私の考えでした。私の間違い:)。
3)まあ、私はメソッドを使用しなければならないとすでに述べたと思いますが、それをまったく変更することさえできません。したがって、コードが何であれ、機能を実装する必要があり、その場合は提供したコード サンプルで十分です。
4)ポートレットについて調査したところ、JSR 268 では「リソース サービング」機能が提供されていましたが、JSR 168 ではそのようなサポートがないことがわかりました。しかし重要なことは、私が見つけた解決策はすべて JSP に依存しており、UI レンダリングに xhtml 形式を使用しているということです。
5)トランザクションを表示するポートレットがあり、そのページに表示されているものを実際に印刷する「トランザクションの印刷」ボタンをポートレットに提供する必要があります。その目的のために、古い JSP 環境で現在使用されている「generateReport」という名前のメソッドを提供しました。つまり、このメソッドを JSP から呼び出しました。
6)コードが根本的に間違っているように見えることはわかっていますが、別のサーブレットを実装することは、コードで行うもう1つの間違いです。私はそのための調査を行い、85% 解決に近づいています。M はリソース サービス ソリューションについて考えていますが、個別のサーブレットはそれほどエレガントなソリューションではないと思います。
私はあなたの側からの助けに本当に感謝します.
よろしくお願いいたします。