- PR -

ダウンロード終了後にもう一度jspを読み込ませるには

1
投稿者投稿内容
まゆら
会議室デビュー日: 2006/04/20
投稿数: 4
投稿日時: 2006-04-20 21:23
はじめまして。まゆらと申します。
下記の疑問に、どなたかご教授していただけないでしょうか・・・。



+++++++++++++++++++++++++
+++ 環境 ++++++++++++++++
+++++++++++++++++++++++++

・WindowsXP Professional SP2
・Java2SE SDK:1.4.2
・Tomcat   :5.0.28
・Eclipse  :2.1.3
・Struts   :1.2.4



MayDl.jspでsubmitボタン押下
(JavaScriptでonsubmitの時にsubmitボタンを使用不可状態にします。)
  ↓
サーブレットでファイルのダウンロード
(public ActionForward executeメソッドでダウンロード処理を行います。
return nullで処理を終わらせています。)
  ↓
ダウンロード完了後、MayDl.jspのsubmitボタンが使用不可のままになっています。
(当たり前ですが・・・)

この時に、submitボタンを再び使用可の状態にすることはできるのでしょうか??



+++++++++++++++++++++++++
+++ struts-config.xml +++
+++++++++++++++++++++++++

 ・・・略・・・

<struts-config>
 <form-beans>
  <form-bean name="dlsvForm" type="may.form.MayDlSvForm" />
 </form-beans>

 <global-forwards>
  <forward name="page_dlsv" path="/WEB-INF/jsp/MayDl.jsp" redirect="false" />
 </global-forwards>

 <action-mappings>
  <action path="/acpath_dlsv"
   type="may.action.MayActDlSv"
   scope="request"
   validate="false"
   name="dlsvForm">
  </action>
 </action-mappings>

 ・・・略・・・

</struts-config>



+++++++++++++++++++++++++
+++ MayDl.jsp +++++++++++
+++++++++++++++++++++++++

<%@ page contentType="text/html; charset=Shift_JIS"%>
<%@ page pageEncoding="Shift_JIS" %>
<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean" %>
<% request.setCharacterEncoding("Shift_JIS"); %>

<HTML>
 <HEAD>
  <%-- 二重起動防止スクリプト --%>
  <SCRIPT language="JavaScript">
   function submitOnce(form) {
    for(i = 0; i < form.elements.length; i++) {
     if(form.elements[i].type == "submit"){
      break;
     }
    }
    if(i < form.elements.length){
     form.elements[i].disabled = true;
    }
    return true;
   }
  </SCRIPT>
  <TITLE>ダウンロード</TITLE>
 </HEAD>

 <BODY>
  <CENTER>
   <html:form action="/acpath_dlsv" method="POST" onsubmit="return submitOnce(this);">
    <html:submit property="s_submit" value="保存" />
   </html:form>
  </CENTER>
 </BODY>

</HTML>



++++++++++++++++++++++++++++++++++++++++++++++
+++ may.action.MayActDlSv.java +++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++
public class MayActDlSv extends Action {

 public ActionForward execute(ActionMapping pacm_map,
                ActionForm pacf_frm,
                HttpServletRequest phsr_req,
                HttpServletResponse phsr_res)
 throws Exception {

   try{

    ServletOutputStream out = null;
    FileInputStream fin = null;
    byte buffer[] = new byte[4096];
    String ms_filename = null;
    int mi_size;

    phsr_res.setContentType("application/octet-stream;charset=Shift_JIS");
    phsr_res.setHeader("Content-Disposition","attachment; filename=info.csv");

    ms_filename = "C:\test.csv";
    out = phsr_res.getOutputStream();
    fin = new FileInputStream(ms_filename);

    while((mi_size = fin.read(buffer))!=-1) {
     out.write(buffer,0, mi_size);
    }

   }
   catch(Exception ex){

    System.out.println(ex.getMessasge());

   }
   finally{

    if(fin != null){
     fin.close();
    }

    if(out != null){
     out.close();
    }

   }
   return null;

 }

}







上記のようなソース・環境になります。

もう一度MayDl.jspを起動すればよいのかと思いまして、
may.action.MayActDlSv.javaのexecuteメソッドで、

* return pacm_map.findForward("page_dlsv");

としたのですが、

* StandardWrapperValve[action]: サーブレット action のServlet.service()が例外を投げました
* java.lang.IllegalStateException: レスポンスをコミットした後でフォワードできません

の例外が発生してしまいました。
out.close();の時点で終了しているからでしょうか・・・?



以上、どなたかよろしくお願い申し上げます。




[ メッセージ編集済み 編集者: まゆら 編集日時 2006-04-20 21:24 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-04-20 21:33
まず、1回のリクエスト/レスポンスでダウンロードファイルとHTMLの両方を送信することは
できません。それから、わざわざ二重起動防止の仕組みを入れているのに、なせそれを無効に
するようなことをしたいんでしょうか。単純に二重起動防止を止めればいいだけではないですか?
まゆら
会議室デビュー日: 2006/04/20
投稿数: 4
投稿日時: 2006-04-21 00:19
> uk様

ご回答の方、有難うございます。

引用:

わざわざ二重起動防止の仕組みを入れているのに、なせそれを無効にするようなことをしたいんでしょうか。
単純に二重起動防止を止めればいいだけではないですか?



保存ボタン押下→ボタン使用不可→ダウンロード処理→ダウンロード完了 の後、
もう一度保存をしようと思った時のことを考えますと、
ボタンが使用不可なので、他の画面に一度遷移して、
またこの画面にこなくてはボタンが押下できないということと、
ダウンロードの最中に再度保存ボタンを押されると、そのたびに
スレッドがどんどん増えていったのでよろしくないのかと思いまして・・・。

という理由でダウンロード最中はボタンが押せず、
ダウンロードが終わった後にボタン復活ということが可能であればと思いました。


引用:

1回のリクエスト/レスポンスでダウンロードファイルとHTMLの両方を送信することはできません。



なるほど・・・やはりそうなのですか・・・。
二重起動防止をやめるか、1回ダウンロードしたらもうできない状態ということで、
了承していただくしかないのでしょうか?

uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-04-21 10:23
そういうことであれば、クライアントサイドではなく、サーバサイドで二重実行を抑制する
処理を入れたほうが良いと思います。Strutsであればトランザクショントークンが使えます
から、それを利用してみたらどうですか?
まゆら
会議室デビュー日: 2006/04/20
投稿数: 4
投稿日時: 2006-04-24 18:01
> uk様

再度ご回答の方、有難うございます。
それと、お返事の方が遅れてしまい、申し訳ございません。

トランザクショントークンについて調べてみました。

isTokenValid(req, true) が trueの場合に二重起動ではない処理、
falseの場合に二重起動防止の処理を入れるような感じになるのですよね?

これでなんとかいけそうな感じです!
助けていただきいまして、本当にありがとうございました!!
1

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