1

liferay ポートレットからレポート ドキュメントを生成しようとしています。レポート生成に使用している方法はOutputStream、変更できない方法で既に使用されています。以下はメソッドのシグネチャです。

public void generateReport(OutputStream outPut);

OutputStream次の行を使用して、をメソッドに渡しています。

PortletResponse portletResponse = (PortletResponse)externalContext.getResponse();
HttpServletResponse httpResponse = PortalUtil.getHttpServletResponse(portletResponse);

次に、次の行を使用してメソッドを呼び出しています。

generateReport(httpResponse.getOutputStream());

これは正常に実行されますが、何も起こりません。

ポートレットで上記の方法を使用してレポートを生成する必要があります。何か案が?

4

2 に答える 2

0

ポートレットは、HTML コードのスニペットを生成し、それらを出力ストリームにストリーミングすることになっているため、出力ストリームをいつどこで取得するかによって異なります。そのストリームを介して送信された (テーマまたは別のポートレットからの) 他の HTML が既に存在する可能性があります。明らかに、別の (html) ドキュメントの途中に単語ドキュメントを追加することはできません。

出力ストリームを参照しているメソッド全体またはポートレット クラス全体を投稿してください。アクションまたはレンダリング フェーズ中ですか、それともリソース サービス メソッドですか? サーブレットで?

編集:申し訳ありませんが、あなたの追加では、それはあまり明確になりません-いくつかのトピックが混同されています. まず、ポートレットにはボタンと ActionListener の概念がないため、何らかのフレームワークを利用しているようです。さらに、いくつかの実際のコード (およびコンテキスト) が有益です。

最も重要: OutputStream を取得してそれに Word ドキュメントを送信することはできないことに注意してください。通常、ポートレットは整形式の HTML スニペットを生成することになっています。これは、出力が別の場所で構築されたページに埋め込まれているためです。HTML 以外のコンテンツを生成する場合のメカニズムについて詳しくは、「ポートレット リソース サービング」を参照してください。レポートを出力ストリームに書き込み、同じストリームを使用してベロシティ テンプレートをマージしようとするという事実は、サンプル コードの記述に根本的な誤りがあることを示唆しています。

追加のヒント: おそらく、サーブレットを「そのまま」作成する方が簡単です。ダウンロード用の Word ドキュメントを生成する場合、ポートレットを実装する必要はありません (Word ドキュメントを生成するだけなので)。これが機能するようになったら、ポートレット ボイラープレートを追加できますが、この環境では簡単かもしれません。さらに、Word ドキュメントを提供している場合、おそらく Mimetype とその他のメタデータ (ファイル名、「ダウンロード」の強制、おそらくキャッシュ制御ヘッダー) を設定する必要があるため、Word ドキュメントを OutputStream に「単に」ストリーミングすることはありません。 . たぶん、あなたが使用しなければならないコードはこれを行うかもしれません.

于 2009-10-20T18:04:37.563 に答える
0

私がここでやっていることは以下の通りです。

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 はリソース サービス ソリューションについて考えていますが、個別のサーブレットはそれほどエレガントなソリューションではないと思います。

私はあなたの側からの助けに本当に感謝します.

よろしくお願いいたします。

于 2009-10-21T06:54:17.370 に答える