- - PR -
テキストファイルダウンロードでJSPの出力が含まれる
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-06-27 13:38
「単にダウンロード対象のファイルの中身をレスポンスに書き出して、それ以上書き出されたくないのでフォーワード先を空白ページにしているだけ」、ということは結局masaさんが言っていることを行っていることになるのでは?ブランクページにしろ、responseにファイルの中身を書き出して、その後遷移してるってことですよね。
JSFは私も良くわかりませんが、ちょっと見たところ、 return "success"みたいな感じでやるんですよね だったら、 return nullとか試してみました? | ||||||||
|
投稿日時: 2005-06-27 14:01
わんこさんこんにちは。
>return nullとか試してみました? 他にはアクションメソッドの戻り値をvoidとしてみたり、 いろいろ試しましたがダメでしたT-T なので return "blank"; として、空白ページを遷移先に指定するようにしました。 遷移先を指定しているだけで、実際の画面は元の画面のままなのです。 フォワード先の画面の出力が全てダウンロードファイルに出力されるので、これで一応ファイルの内容だけが書き出されるようになりました。 | ||||||||
|
投稿日時: 2005-06-27 14:10
実際の画面が元のままなのはわかっています。
そのフォワード先で指定したjspのhtmlがファイルに書き込まれるってことですよね う〜ん なんか気持ち悪くて納得いきません ![]() その"blank"で指定しているところを <to-view-id></to-view-id> のように何も指定しない、とかでも駄目かな なんとか解決してほしいなぁ・・・ | ||||||||
|
投稿日時: 2005-06-27 15:06
><to-view-id></to-view-id>
>のように何も指定しない、とかでも駄目かな これはやってなかったので、試してみました。 結果は、download.jsf(遷移元の画面、ホントのファイル名はdownload.jsp) をダウンロードしようとするようになってしまいました。 もちろんアップロードディレクトリにはそんなファイルないので失敗します。 もう意味がわかりません;; | ||||||||
|
投稿日時: 2005-06-27 15:26
こんにちは、moneです。
これを試した際にどのように「ダメ」だったのでしょうか? 遷移先の画面が指定されていないからJSFが勝手になんか処理しちゃったのかな?
これは、どこの画面からきたのかはわかっているから 何も指定しなかった場合もとの画面に戻るように 勝手にJSFが遷移もとのパスを渡しちゃってるのかもしれないですね。 あと、元の画面を再読み込みしなければならないという件ですが モーダルダイアログ等をはさんで そこから自動でダウンロード処理の呼び出し、 ダイアログには閉じる機能のみを実装 という形でなんとかなりませんかね? | ||||||||
|
投稿日時: 2005-06-27 15:40
moneさんこんにちは。
>これを試した際にどのように「ダメ」だったのでしょうか? >遷移先の画面が指定されていないからJSFが勝手になんか処理しちゃったのかな? そのとおりで、遷移先が指定されていないと元の画面に遷移するため、ダウンロードしたファイルの末尾に遷移もとのHTMLソースが出力されました。 >これは、どこの画面からきたのかはわかっているから >何も指定しなかった場合もとの画面に戻るように >勝手にJSFが遷移もとのパスを渡しちゃってるのかもしれないですね。 そのようですね。なんか response.setHeader("Content-Disposition"・・・・ でセットしたファイル名が上書きされているような感じです。 >あと、元の画面を再読み込みしなければならないという件ですが >モーダルダイアログ等をはさんで >そこから自動でダウンロード処理の呼び出し、 >ダイアログには閉じる機能のみを実装 >という形でなんとかなりませんかね なるほど、それならダイアログを閉じた後に元画面をサブミットするなりして処理できそうですね。 参考にさせていただきます。 ありがとうございます。 | ||||||||
|
投稿日時: 2005-06-27 15:43
これはh:commandButtonから呼び出されるアクションメソッドの処理でしょうか? 最後にFacesContext.getCurrentInstance().responseComplete();をやらないと, この後,RenderResponseフェーズに入って,次の画面のjspへフォワードされて, たぶん同じresponseに書き込みが起きるのだと思います. | ||||||||
|
投稿日時: 2005-06-27 15:48
さきほどは,2〜3頁目があるのに気付かないで返信してました. スキップする方法はFacesContext.getCurrentInstance().responseComplete();です. |