- PR -

JspでのJavaScriptのエラーについて

投稿者投稿内容
ryu
常連さん
会議室デビュー日: 2005/07/05
投稿数: 30
投稿日時: 2005-07-05 21:08
すみません。Servletの基礎もあまりわかっていないのですが、
どうしても行き詰まってしまい、ヒントで良いので教えていただきたいのです。

今、JspからダウンロードというボタンをクリックしてServletからデータベースの
データを取得し、csvとして出力するプログラムを作成しています。
データベースからデータを取得し、csvとして出力することはできました。
しかし、他で行き詰まってしまいました。
ダウンロード後、JSPの画面にあるボタンをクリックするとそこに記述してある
JavaScriptでエラーが発生してしまうのです。エラーの内容は、『アクセスが拒否されました』
というものです。JavaScriptの内容はFunctionで処理を行ってsubmitを行っているだけです。
ダウンロードのServletを起動させなければ問題なく動作します。
自分のJSPとServletの認識は、JSPからServletに移行して処理を行った場合、
JSPにフォワードしないといけないと思っていました。しかし、フォワードは、
その前に出力をしているとフォワードできないというのを聞きました。
今回のcsvダウンロードのServletは、Servlet内で
response.setContentType("application/octet-stream;charset=Windows-31J");
response.setHeader("Content-Disposition","attachment; filename=test.csv");
このような処理を行っています。このためなのかわからないのですが、
この後に元のJSPへフォワードさせようとすると
java.lang.IllegalStateException: Response has already been committed
このようなエラーでフォワードできませんでした。

フォワードさせずに元のJSPでボタンをクリックするとJavaScriptでエラーに
なってしまうという状況です。JavaScriptを使わずにInputのTypeでsubmitに
するとダウンロード後でも正常に動作します。

かなりわけのわからない文章になってしまって申し訳ありませんが
お力をお貸し頂けると幸いかと思います。
よろしくお願い致します。
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-07-06 10:08
こんにちは。

引用:

未記入さんの書き込み (2005-07-05 21:08) より:
ダウンロード後、JSPの画面にあるボタンをクリックするとそこに記述してある
JavaScriptでエラーが発生してしまうのです。エラーの内容は、『アクセスが拒否されました』



http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=6388&forum=7
このスレッドは参考にならないでしょうか。

ブラウザのセキュリティ周りが原因で、
「JavaScript アクセスが拒否されました」で検索をかけると、かなりの件数
がHITしますので、該当する現象を探っていくと解決が早いかと思います。
ryu
常連さん
会議室デビュー日: 2005/07/05
投稿数: 30
投稿日時: 2005-07-06 12:53
masaさんありがとうございます。

僕もIEのセキュリティかもという推測は見つけられました。
でもこのセキュリティは別サイトからアクセスする場合やフレーム間のデータの受け渡し
の場合に出力されるエラーだと認識しております。
今回の場合、JSPからServletそこからフォワードでJSPに戻っていないため
別サイトからのアクセスという認識をされているのでしょうか?
また、色々と探してみているのですが、解決方法がはっきりとわかりません。
皆様はこのような場合は、どのように回避していらっしゃるのでしょうか?
よろしくお願い致します。
ryu
常連さん
会議室デビュー日: 2005/07/05
投稿数: 30
投稿日時: 2005-07-06 15:09
元のJSPに移行できればJavaScriptのエラーは回避できそうな感じです。
元のJSPに移行する場合に

RequestDispatcher rd = getServletContext().getRequestDispatcher("/test.jsp");
rd.forward(request,response);

を使用しているのですが、ダウンロードプログラムの後に以下のようにしてしまうと
java.lang.IllegalStateException: Response has already been committed
というエラーが表示されてしまします。どのように回避すればJSPに移行できるように
なるのでしょうか?


try {

response.setContentType("application/octet-stream;charset=Shift_JIS");
response.setHeader("Content-Disposition","attachment; filename=test.csv");
PrintWriter out=response.getWriter();

----------------------------------------------
ダウンロードファイルを作成する処理
----------------------------------------------

out.close();

RequestDispatcher rd = getServletContext().getRequestDispatcher("/test.jsp");
rd.forward(request,response);
マーサ
ベテラン
会議室デビュー日: 2004/11/26
投稿数: 87
投稿日時: 2005-07-06 15:43
引用:

RequestDispatcher rd = getServletContext().getRequestDispatcher("/test.jsp");
rd.forward(request,response);



ここで、元のJSPへ遷移しようとしているのですね?
そして、エラーが発生している・・・。
・クライアントより指示、サーバーより応答(ファイル転送)。
ここで、やり取りは終了となります。
・サーバーより応答(画面遷移)
そのままの状態でさらに応答を返そうとしているので、エラーが発生します。

何故元のJSPへ明示的に遷移させようとしているのですか?
元のJSPは表示させたままではいけない理由があるのでしょうか?
上記の部分をコメントにしたらどう動作するでしょうか。。。
元のJSPが表示されたままになりませんか?
ryu
常連さん
会議室デビュー日: 2005/07/05
投稿数: 30
投稿日時: 2005-07-06 16:33
マーサさんありがとうございます。

確かにマーサさんの言う通り明示的に遷移させなくても
元の画面は表示されております。
しかし、その画面のJavaScriptがIEのセキュリティのため使えなくなってしまいます。
そこで明示的に遷移させてJSPに制御をうつさないといけないものかと
考え明示的な遷移の方法を探していたのです。

自分の考え方は間違えているのでしょうか?
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-07-06 16:34
引用:

未記入さんの書き込み (2005-07-06 12:53) より:
僕もIEのセキュリティかもという推測は見つけられました。
でもこのセキュリティは別サイトからアクセスする場合やフレーム間のデータの受け渡し
の場合に出力されるエラーだと認識しております。



うーん。フレームは使っていない訳ですね。
根本的な原因追求を行いたいならば、Javascript込みでJSPのソース
を公開すれば、アドバイスがもらえると思いますよ。

ちなみに私の環境IE6.0、WinXP-SP2ではそのような現象は発生しま
せん。

引用:

java.lang.IllegalStateException: Response has already been committed
というエラーが表示されてしまします。どのように回避すればJSPに移行できるように
なるのでしょうか?



こちらの回避方法ですが、
ファイルダウンロードとjspを一つのリクエストに対するレスポンスとして返す
ことは出来ません。これはIEの仕様なのでIE環境においては回避不可能です。
JavaScriptを使用するなどして、ファイルダウンロード用、画面遷移用の複数の
リクエストを発行する必要があります。
マーサ
ベテラン
会議室デビュー日: 2004/11/26
投稿数: 87
投稿日時: 2005-07-06 17:01
引用:

しかし、その画面のJavaScriptがIEのセキュリティのため使えなくなってしまいます。
そこで明示的に遷移させてJSPに制御をうつさないといけないものかと
考え明示的な遷移の方法を探していたのです。



なるほど。
基本的な考えとして、masaさんも
引用:

ファイルダウンロードとjspを一つのリクエストに対するレスポンスとして返す
ことは出来ません。これはIEの仕様なのでIE環境においては回避不可能です。


と、仰っているように要求と応答は1:1となります。
なので、JavaScriptのエラーが発生するからJSPを再描画?させると言う考えはズレている思います。
ココで問題にするなら、何故JavaScriptのエラーが発生するのか?だと考えます。

取りあえず、以下を調べてみて下さい。
1.IEのセキュリティレベルを確認する。(Scriptが無効になっていないか?)
2.test.csvの出力先を確認してみる。
 (パス、ディレクトリ、ファイルの存在及びアクセス属性)
3.setHeaderのfilenameをパス付で記述してみる。


※不備があったため修正。

[ メッセージ編集済み 編集者: マーサ 編集日時 2005-07-06 17:03 ]

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