- PR -

JSPを使ってFileをDownloadするには?

投稿者投稿内容
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2002-06-26 11:43
YOU@ITです。

>ダウンロード失敗時やダウンロード事前処理失敗時にエラー画面への遷移が必要な場合に
>おいてServletのロジックの記述如何によっては起こる可能性があると思うのですが??
>※「今回のJSPで起こったような問題」とは「IllegalStateExceptionが発生する」です。

もちろん、サーブレットで実装したとしても例外処理をおろそかにすれば当然
同じ結果になるでしょうが、きめ細かくtry-catchすることで(100%とは言いませんが)
防げるはずです。

今回のIllegalStateExceptionにしても、JSPがServletに変換される際にコンテナによって
暗黙のうちにHttpServletResponseからWriterオブジェクトを取得するコードが吐き出され
ますよね。それを知らずにgetOutputStream()するからIllegalStateExceptionがスローされ
てしまっている訳ですよね。
Servletで実装していれば誰もWriter取り出したあとにOutputStreamも取り出そうなんて
コードは書きません。つまり、今回のエラーは防げるはずです。

更に言えば、JSPでは事細かくtry-catchを書いたりするのは避けるべき(と言うよりも
try-catchしなければならないようなコードはできるだけJSPには記述すべきではない)
だと思いますので、今回のような比較的複雑なロジックはServletが望ましいのではないか、
と思えるのです。

>単純に「JSPでもできますよ」といっているだけです。この手法の通用しないサーブレット
>コンテナではこの手法は使えないというだけです。

はい、推奨されているわけではないのは承知していますが、「この手法の通用しない
サーブレットコンテナ」と言うのを意識しなければならないようなコードはやはり
避けるべきだと思います。

# もちろん、開発期間や実際に使用するコンテナ等の条件によって、ポータビリティを保つ事
# が難しいのも承知していますが・・・

まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2002-06-26 11:43
asipさんのいうように、

>Servletで実装するかJSPで実装するかは個々のシステムの開発サイドの裁量です。

とは思います、個人の趣味でやっているのなら。
仕事でやっているのなら、きっちり判断材料をそろえてから「できる」と言わないと
揉め事の元です。
今回の話は単に裁量というにはちょっと大きいように見えます。

asipさんの、

> 単純に「JSPでもできますよ」といっているだけです。
> この手法の通用しないサーブレットコンテナではこの手法は使えないというだけです。

にはズレがあって、「Tomcat4ならJSPでもできますよ」というのが正しくて、
「この手法が他のコンテナでも使えるかどうかはわかりません」となります。
つまりは、コンテナの置換えうんぬんのときにあてにできるものがないということです。

「Tomcat4ならJSPでもできますよ」という方法を選択することは大きなリスクだと
思いますよ。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2002-06-26 11:56
引用:

まりりさんの書き込み (2002-06-26 11:43) より:
(省略)
asipさんの、

> 単純に「JSPでもできますよ」といっているだけです。
> この手法の通用しないサーブレットコンテナではこの手法は使えないというだけです。

にはズレがあって、「Tomcat4ならJSPでもできますよ」というのが正しくて、
「この手法が他のコンテナでも使えるかどうかはわかりません」となります。
つまりは、コンテナの置換えうんぬんのときにあてにできるものがないということです。

「Tomcat4ならJSPでもできますよ」という方法を選択することは大きなリスクだと
思いますよ。



単純に私個人のテストした環境がTomcat4.Xのみであるというだけです。

私個人に「あらゆるサーブレットコンテナで動作することを保証してから発言しろ」と
いうのはそれこそ「大きすぎるズレ」あるいは「大きな勘違い」だと思います。

個々のシステムの開発者が「JSPでダウンロード」をテストしてみて、挙動が不審であれば
「JSPでダウンロード」を使わなければいいだけです。

たしかに「Tomcat4ならできるけど、他のサーブレットコンテナでの動作は必ずしも保証できない」
状態であることはたしかなので、それは認めます。


[ メッセージ編集済み 編集者: asip 編集日時 2002-06-26 11:59 ]
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2002-06-26 12:58
asipさん
> 単純に私個人のテストした環境がTomcat4.Xのみであるというだけです。
>
> 私個人に「あらゆるサーブレットコンテナで動作することを保証してから発言しろ」と
> いうのはそれこそ「大きすぎるズレ」あるいは「大きな勘違い」だと思います。

そんなことを言いたいわけではないのはわかっているのではないかと思いますが、
「JSPでもできる」という言葉はどう取られるかは意識していますかというだけです。
その認識がずれているからこそ、みなさんのJSPにすべきでないという反応になるように
思えます。

Java関連の技術の共通認識は、製品の実装ではなく各種の仕様が正しい、というもの
だろうと思っています。
現存するサーブレットコンテナでの動作を確認することは無理な話ですが、
仕様に合致するのかどうかは個人の範疇で可能でしょう。(公開されているのですから)
ですから、できるできないの話はそのレベルでしていただいたほうが良いのではないですか
ということだけです。

当然、環境依存だけどできる、という情報は有用ですから書いていただいたほうが
ありがたいと思います。
ただ、条件を落とすとそれを参照した誰かがどこかで落とし穴にはまるのでは、
と心配しているのです。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2002-06-26 14:00
Tomcatはサーブレットコンテナの公式リファレンス・インプリメンテーション
といってもいいものです。

名も知られていないようなサーブレットコンテナならいざ知らず、Tomcatで動く
コードであれば十中八九のサーブレットコンテナで動くと思っています。

 敢えて、書きませんでしたが、Tomcat3.x系でも「JSPでダウンロード」が
可能なことは確認済みです。

 「このサーブレットコンテナでは稼働しなかった」という報告もなしに
「仕様上、こうだから」という理由で文句をいうのは止めてもらいたいものです。

 仕様に1〜100までの全てが記載されているわけではないでしょう。
 仕様に明記されずに各サーブレットコンテナの実装に任されている部分も多い
 はずです。

 「このサーブレットコンテナでは稼働しなかった、仕様上云々」というので
あれば、正当な批判だと思います。

 「移植性やサーブレットコンテナを限定しない場合には"JSPでダウンロード"
はやめておいて、Servletを使うべき」というのなら賛成です。

 「こんな方法もありますよ」と紹介しただけで、文章の記述で揚げ足を取られたり、
文句をいわれたりする謂われはありません。

 環境依存かもしれないことは、初めにテストコードを紹介した時点で「下記のコードが
Tomcat4.0にて動作し、ダウンロードもできました。」と明記しています。


[ メッセージ編集済み 編集者: asip 編集日時 2002-06-26 14:36 ]
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-06-27 00:07
>Tomcatはサーブレットコンテナの公式リファレンス・インプリメンテーション
>といってもいいものです。

世間の評では…というと語弊があるかもしれませんから、少なくとも私は、というお話でいくと、Tomcat は、SPEC をいちはやく実装するのが第一目的なので、バグバグ。変なことも多々あり(SPECが変だった、ということもある)。

>名も知られていないようなサーブレットコンテナならいざ知らず、Tomcatで動く
>コードであれば十中八九のサーブレットコンテナで動くと思っています。

Tomcat と JRun/WebSphere/WebLogic での挙動が違うなんてことはごまんとあります。たとえば parameter の文字コード扱い。たとえば taglib のタグオブジェクト扱い。
# 具体的に書いてもいいですが本筋ではありませんので。

これらは、SPEC そのものが曖昧だったり、SPEC によって「実装依存にしてもよい」と明記してあるものだったりします。実装依存でよい部分は、特にコンテナの特長(便利さだったりスピードだったり)が出やすい部分でもあります。

Tomcat で動くことが移植性を保証するのではなく、Tomcat は少なくとも SPEC に書いてある挙動になるようにプログラムされている、だけです。
保証されるべきは、SPEC に書いてある挙動のみです。これが規格規格とうるさい理由。


> 「このサーブレットコンテナでは稼働しなかった」という報告もなしに
>「仕様上、こうだから」という理由で文句をいうのは止めてもらいたいものです。

あなたに対する文句でもあげあしとりでもありません。
「うごくよねぇ。でも仕様で保証されてるわけではないよねぇ。ちょっとこわいねぇ」という、ここを読んで参考にしようと思っているすべての人に向けた補足です。


> 仕様に1〜100までの全てが記載されているわけではないでしょう。
> 仕様に明記されずに各サーブレットコンテナの実装に任されている部分も多い
> はずです。

多いからこそ、「ある実装ではこれでもうまくいくかもしれんけど、できるだけ仕様に従った方がよいでしょう」と言っているわけです。さらにいえば、SPEC には「前のバージョンからの変更点」がはっきり明記されますから、移植性だけではなく保守性も増します。

せっかくの Java の利点なんですから、いかしましょうよ。

# あとは…臭い…かな…
# 実装依存部分のところでも、いかにも挙動が違いそうな臭いがするというか…

# なんか話がずれてしまってるのでこれにて退散。
asip
ベテラン
会議室デビュー日: 2001/12/27
投稿数: 77
投稿日時: 2002-06-27 07:35
しょむさん、あなたは"十中八九"の意味もわからないんですか?
私は「Tomcatで稼働するコードがどのサーブレットコンテナでも必ず動く」とは
一言も書いていません。

私が議題にしているのはあくまで"JSPでダウンロード"に関することであって、
全然関係のないロジックの挙動をひきあいにだすのはおかしいと思いますよ。

それこそ、文章の揚げ足取りです。

#全然関係のないロジックの挙動については別のスレッドをたてて、公表すると
#喜ばれる方が多いのではないでしょうか?

しょむさんにしても、まりりさんにしても「JSPはサーブレットコンテナごとの挙動に
ついてほとんど仕様に明記されていないからJSPという技術自体を利用すべきでない」と
いう結論への誘導を意図しているように私にはみえます。

引用:

# あとは…臭い…かな…
# 実装依存部分のところでも、いかにも挙動が違いそうな臭いがするというか…

# なんか話がずれてしまってるのでこれにて退散。



"臭い"ですか? 面白い表現ですね。"JSPでダウンロード"は"挙動が違う"という
証拠を提示してください。
"疑わしい"という理由だけで"JSPでダウンロード"を非難するのはおかしいですよ。

#"私自身に文句をいわれている"わけではないので、構わないといえばそれまでなんですが...。

[ メッセージ編集済み 編集者: asip 編集日時 2002-06-27 07:43 ]
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2002-06-27 09:57
言いたかったことはしょむさんとほとんど同じですし、
もともとの質問の回答の部分では結論は出てますので
終わりにしようと思っていましたが、これでほんとに最後。

> 私が議題にしているのはあくまで"JSPでダウンロード"に関することであって、
> 全然関係のないロジックの挙動をひきあいにだすのはおかしいと思いますよ。
>
> それこそ、文章の揚げ足取りです。

asipさんは「意識して」JSPでのファイルのダウンロードのみの議題で
書かれているつもりかもしれませんが、

> 名も知られていないようなサーブレットコンテナならいざ知らず、Tomcatで動く
> コードであれば十中八九のサーブレットコンテナで動くと思っています。

こういう補足をつけるとそうではない部分でも同じように
考えているのではないかと受け取れます。
JSPでダウンロードのケースは、仕様にかかれていなくてたまたまそういう実装だった
部分ではないかという思いがあり、それは危なくないですかと気にしています。
さらに、ここを読んだ他の人が「Tomcatで動いたんだから仕様に沿っている」と
誤解をしないかという心配でもあります。

引用は一部抜粋でしかないので揚げ足取りだとおっしゃられるかもしれませんが、
意図は「あくまで仕様に則り、決められていない部分では(環境依存の可能性があるので)
なるべく避けておきましょう」です。
>「JSPはサーブレットコンテナごとの挙動についてほとんど仕様に明記されていないから
> JSPという技術自体を利用すべきでない」
ということではありません。

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