- PR -

Struts1.1から出力されるコンテントタイプの設定方法について

1
投稿者投稿内容
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-08-13 11:56
Struts1.1をWindowsXP + Tomcat4.1.24という環境で使用しています。

Actionのexecute()メソッド内でiTextを使い、コンテントタイプに
"application/pdf"
を設定しPDFデータをブラウザに出力しているのですが、どうしても
"text/html"
でコンテントタイプが返されてしまい、ブラウザには開く/保存(IE)
のダイアログが表示されてしまいます。うる覚えの記憶だと、execute
メソッドからnullを返せば、以降はStruts側の処理は行われずに動作し
てくれると記憶していたのですが・・・。念の為EtherRealでもHTTPの
レスポンスを見てみましたが、やはり"text/html"でした。
RequestProcessorのcontentTypeを設定してしまうと、そのStrutsアプ
リケーション全体で設定が有効になってしまうので、ちょっと使えそ
うもありません。普通のサーブレットで実装すれば問題無く動作する
と思うのですが、Strutsの枠組みでコントロールできたほうが何かと
便利なので、この方法も取り辛いです。
1.1からこの辺りの設定方法が変わったとかあるんでしょうかね。何か
ご存知の方いらっしゃいませんか?。

------------------------------------------------------------------
struts-config.xml
------------------------------------------------------------------
<action
path="/schedule/print.pdf"
type="actions.SchedulePrintAction"
scope="request"
validate="false">
<forward name="failed" path="schedule.errorView"/>
</action>
------------------------------------------------------------------
アクション
------------------------------------------------------------------
public class SchedulePrintAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse responce)
throws Exception {
Document document = new Document(PageSize.A4, 20, 20, 40, 36);
PdfWriter.getInstance(document, responce.getOutputStream());
.
.
.
.
.
responce.setContentType("application/pdf");
return null;
}
------------------------------------------------------------------


みやも
ベテラン
会議室デビュー日: 2002/04/22
投稿数: 74
投稿日時: 2003-08-13 12:31
うろおぼえですが、たしか、

responce.setContentType();

は、Writerなどの書き込み前に、呼び出すものだった気がします。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2003-08-13 12:57
みやもさんの言うとおり、これが原因でした。setContentType()のJavaDocを見たところ、
「PrintWriterの取得前には設定しておくべきです」
と書いてありました。HTTPヘッダの出力タイミングの理解が足りませんでしたね、反省反省。
どうもありがとうございました。m(__)m

[ メッセージ編集済み 編集者: 小僧 編集日時 2003-08-13 12:58 ]
1

スキルアップ/キャリアアップ(JOB@IT)